Created
October 12, 2017 23:00
A script that checks an http endpoint, parses json, and alerts when healthchecks fail
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /usr/bin/env ruby | |
# | |
# check-cc-heap-limit | |
# | |
# DESCRIPTION: | |
# A script that checks an http endpoint, parses json, and alerts when healthchecks fail | |
# | |
# OUTPUT: | |
# plain-text | |
# | |
# PLATFORMS: | |
# Linux | |
# | |
# DEPENDENCIES: | |
# gem: sensu-plugin | |
# gem: httparty | |
# | |
# USAGE: | |
# | |
# NOTES: | |
# | |
# | |
# LICENSE: | |
# Copyright (c) 2017, Huy Nguyen <huyn@cloudcruise.com> | |
require 'sensu-plugin/check/cli' | |
require 'httparty' | |
require 'json' | |
class HealthCheck < Sensu::Plugin::Check::CLI | |
option :host, | |
short: '-h HOSTNAME', | |
long: '--hostname HOSTNAME', | |
description: 'Host to connect to query for healthcheck', | |
default: 'localhost' | |
option :port, | |
short: '-p PORT', | |
long: '--port PORT', | |
description: 'Port to connect to query for healthcheck', | |
default: '8081' | |
option :timeout, | |
short: '-t HTTP_TIMEOUT', | |
long: '--timeout HTTP_TIMEOUT', | |
description: 'HTTP timeout in case the HTTP request takes too long', | |
default: 10, | |
proc: proc(&:to_i) | |
option :blacklist, | |
short: '-b BLACKLIST', | |
long: '--blacklist BLACKLIST', | |
description: 'comma seperated list of checks that does not need to be alerted out if fails', | |
default: nil, | |
proc: proc(&:to_s) | |
def run | |
begin | |
response = HTTParty.get("http://#{config[:host]}:#{config[:port]}/healthcheck", timeout: config[:timeout]) | |
rescue Errno::ECONNREFUSED => e | |
critical "failed to connect to service healthcheck on #{config[:host]}:#{config[:port]}. #{e}" | |
rescue Net::ReadTimeout => e | |
warning "Timed out after #{config[:timeout]} seconds connecing to http://#{config[:port]}/healthcheck. #{e}" | |
rescue StandardError => e | |
unknown "Something went wrong accessing http://#{config[:host]}:#{config[:port]}/healthcheck. #{e}" | |
end | |
checks = JSON.parse(response.body) | |
failed_checks = {} | |
checks.keys.each do |key| | |
unless !config[:blacklist].nil? && (config[:blacklist].include? key) | |
next unless checks[key]['healthy'] == false | |
failed_checks.store(key, checks[key]['message']) | |
end | |
end | |
if failed_checks.any? | |
critical "#{failed_checks} healthcheck(s) is/are failing on #{config[:host]}:#{config[:port]}" | |
else | |
ok "All healthchecks are passing for #{config[:host]}:#{config[:port]}" | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment