sensu-plugins/sensu-plugins-redis

View on GitHub
bin/metrics-redis-graphite.rb

Summary

Maintainability
A
2 hrs
Test Coverage
#!/usr/bin/env ruby
# frozen_string_literal: false

#
# Push Redis INFO stats into graphite
# ===
#
# Copyright 2012 Pete Shima <me@peteshima.com>
#                Brian Racer <bracer@gmail.com>
#
# Released under the same terms as Sensu (the MIT license); see LICENSE
# for details.

require 'sensu-plugin/metric/cli'
require 'redis'
require_relative '../lib/redis_client_options'

class Redis2Graphite < Sensu::Plugin::Metric::CLI::Graphite
  include RedisClientOptions

  # redis.c - sds genRedisInfoString(char *section)
  SKIP_KEYS_REGEX = [
    '^role',
    '^slave',
    'aof_last_bgrewrite_status',
    'aof_last_write_status',
    'arch_bits',
    'atomicvar_api',
    'config_file',
    'executable',
    'gcc_version',
    'master_host',
    'master_link_status',
    'master_port',
    'master_replid',
    'maxmemory_human',
    'maxmemory_policy',
    'mem_allocator',
    'multiplexing_api',
    'os',
    'process_id',
    'rdb_last_bgsave_status',
    'redis_build_id',
    'redis_git_dirty',
    'redis_git_sha1',
    'redis_mode',
    'redis_version',
    'run_id',
    'tcp_port',
    'total_system_memory_human',
    'used_memory_dataset_perc',
    'used_memory_human',
    'used_memory_lua_human',
    'used_memory_peak_human',
    'used_memory_peak_perc',
    'used_memory_rss_human',
    'used_memory_scripts_human'
  ].freeze

  option :scheme,
         description: 'Metric naming scheme, text to prepend to metric',
         short: '-S SCHEME',
         long: '--scheme SCHEME',
         default: "#{Socket.gethostname}.redis"

  option :skip_keys_regex,
         description: 'a comma seperated list of keys to be skipped',
         short: '-k KEYS',
         long: '--skipkeys KEYS',
         default: nil

  def run
    redis = Redis.new(default_redis_options)
    skip_keys = if !config[:skip_keys_regex].nil?
                  config[:skip_keys_regex].split(',')
                else
                  SKIP_KEYS_REGEX
                end

    redis.info.each do |k, v|
      next unless skip_keys.map { |re| k.match(/#{re}/) }.compact.empty?

      # "db0"=>"keys=123,expires=12"
      if k =~ /^db/
        keys, expires = v.split(',')
        keys.gsub!('keys=', '')
        expires.gsub!('expires=', '')

        output "#{config[:scheme]}.#{k}.keys", keys
        output "#{config[:scheme]}.#{k}.expires", expires
      else
        output "#{config[:scheme]}.#{k}", v
      end
    end

    # Loop thru commandstats entries for perf metrics
    redis.info('commandstats').each do |k, v|
      %w[calls usec_per_call usec].each do |x|
        output "#{config[:scheme]}.commandstats.#{k}.#{x}", v[x]
      end
    end

    ok
  rescue StandardError
    send(config[:conn_failure_status], "Could not connect to Redis server on #{redis_endpoint}")
  end
end