sensu-plugins/sensu-plugins-jenkins

View on GitHub
bin/check-jenkins-health.rb

Summary

Maintainability
B
4 hrs
Test Coverage
#! /usr/bin/env ruby
#
#   check-jenkins
#
# DESCRIPTION:
#   This plugin checks that the Jenkins Metrics healthcheck is healthy throughout
#   See the Jenkins Metric plugin: https://wiki.jenkins-ci.org/display/JENKINS/Metrics+Plugin
#
# OUTPUT:
#   plain text
#
# PLATFORMS:
#   Linux
#
# DEPENDENCIES:
#   gem: sensu-plugin
#   gem: rest-client
#   gem: json
#
# USAGE:
#   #YELLOW
#
# NOTES:
#
# LICENSE:
#   Copyright 2015, Cornel Foltea cornel.foltea@gmail.com
#   Released under the same terms as Sensu (the MIT license); see LICENSE
#   for details.
#

require 'sensu-plugin/check/cli'
require 'rest-client'
require 'json'

#
# Jenkins Metrics Health Check
#
class JenkinsMetricsHealthChecker < Sensu::Plugin::Check::CLI
  option :server,
         description: 'Jenkins Host',
         short: '-s SERVER',
         long: '--server SERVER',
         default: 'localhost'

  option :port,
         description: 'Jenkins Port',
         short: 'p PORT',
         long: '--port PORT',
         default: '8080'

  option :uri,
         description: 'Jenkins Metrics Healthcheck URI',
         short: '-u URI',
         long: '--uri URI',
         default: '/metrics/currentUser/healthcheck'

  option :https,
         short: '-h',
         long: '--https',
         boolean: true,
         description: 'Enabling https connections',
         default: false

  option :insecure,
         short: '-k',
         long: '--insecure',
         boolean: true,
         description: 'Perform "insecure" SSL connections and transfers.',
         default: false

  option :timeout,
         short: '-t SECS',
         long: '--timeout SECS',
         description: 'Request timeout in seconds',
         proc: proc(&:to_i),
         default: 5

  option :verbose,
         short: '-v',
         long: '--verbose',
         boolean: true,
         description: 'Return more verbose errors',
         default: false

  def run
    https ||= config[:https] ? 'https' : 'http'
    testurl = "#{https}://#{config[:server]}:#{config[:port]}#{config[:uri]}"

    begin
      rest_client = if config[:https] && config[:insecure]
                      RestClient::Resource.new(testurl, timeout: config[:timeout], verify_ssl: false)
                    elsif config[:https]
                      RestClient::Resource.new(testurl, timeout: config[:timeout], verify_ssl: true)
                    else
                      RestClient::Resource.new(testurl, timeout: config[:timeout])
                    end
      r = if config[:verbose]
            rest_client.get
          else
            rest_client.get { |response| response }
          end
    rescue RestClient::SSLCertificateNotVerified => e
      critical "ssl verification failed: #{e.response}"
    rescue RestClient::ServerBrokeConnection
      critical "server broke the connection: #{e}"
    rescue RestClient::RequestFailed => e
      critical "request failed: #{e.response}"
    rescue RestClient::ExceptionWithResponse => e
      critical "failed to #{e.response}"
    end
    # if you have a 500 it will only reach here if you are not specifying `--verbose`
    # as it will be caught by the rescue above
    if [200, 500].include?(r.code)
      healthchecks = ::JSON.parse(r)
      healthchecks.each do |healthcheck, healthcheck_hash_value|
        if healthcheck_hash_value['healthy'] != true
          critical "Jenkins health check '#{healthcheck}' reported unhealthy state. Message: #{healthcheck_hash_value['message']}"
        end
      end
      ok 'Jenkins Health Parameters are OK'
    else
      critical "Jenkins Service is replying with status code #{r.code}. Body: #{r.body}"
    end
  rescue Errno::ECONNREFUSED => e
    critical "Jenkins Service is not responding: #{e}"
  rescue RestClient::RequestTimeout => e
    critical "Jenkins Service Connection timed out after #{config[:timeout]} seconds: #{e}"
  end
end