sensu-plugins/sensu-plugins-influxdb

View on GitHub
bin/metrics-influxdb.rb

Summary

Maintainability
A
0 mins
Test Coverage
#! /usr/bin/env ruby
#
#   metrics-influx.rb
#
# DESCRIPTION:
#
# OUTPUT:
#   plain text
#
# PLATFORMS:
#   Linux
#
# DEPENDENCIES:
#   gem: sensu-plugin
#   gem: influxdb
#
# USAGE:
#   #YELLOW
#
# NOTES:
#
# LICENSE:
#   Copyright (C) 2015, Sensu Plugins
#   Released under the same terms as Sensu (the MIT license); see LICENSE
#   for details.
#

require 'sensu-handler'
gem 'influxdb', '>=0.2.0'
require 'influxdb'

#
# Sensu To Influxdb
#
class SensuToInfluxDB < Sensu::Handler
  option :config,
         description: 'Configuration information to use',
         short: '-c CONFIG',
         long: '--config CONFIG',
         default: 'influxdb'

  def filter; end

  def create_point(series, value, time)
    point = { series: series,
              tags: { host: @event['client']['name'], metric: @event['check']['name'] },
              values: { value: value },
              timestamp: time }
    point[:tags].merge!(@event['check']['tags']) unless @event['check']['tags'].nil?
    point
  end

  def parse_output
    data = []
    metric_raw = @event['check']['output']
    metric_raw.split("\n").each do |metric|
      m = metric.split
      next unless m.count == 3
      key = m[0].split('.', 2)[1]
      key.tr!('.', '_')
      value = m[1].to_f
      time = m[2]
      point = create_point(key, value, time)
      data.push(point)
    end
    data
  end

  def check_status
    data = []
    data.push(create_point(@event['check']['name'], @event['check']['status'], @event['client']['timestamp']))
  end

  def handle
    opts = settings[config[:config]].each_with_object({}) do |(k, v), sym|
      sym[k.to_sym] = v
    end
    database = opts[:database]

    influxdb_data = InfluxDB::Client.new database, opts
    influxdb_data.create_database(database) # Ensure the database exists

    data = if opts[:status] == false || opts[:status].nil?
             parse_output
           else
             check_status
           end
    influxdb_data.write_points(data)
  end
end