puppet-prometheus_reporter/lib/puppet/reports/prometheus.rb

82 lines
2.3 KiB
Ruby

require 'puppet'
require 'puppet/util'
require 'yaml'
require 'fileutils'
# Required for strftime(%Q)
require 'date'
Puppet::Reports.register_report(:prometheus) do
# Source: evenup/evenup-graphite_reporter code base
# lib/puppet/reports/graphite.rb
configfile = File.join([File.dirname(Puppet.settings[:config]),
'prometheus.yaml'])
unless File.exist?(configfile)
raise(Puppet::ParseError, "Prometheus report config file #{configfile} not readable")
end
config = YAML.load_file(configfile)
TEXTFILE_DIRECTORY = config['textfile_directory']
REPORT_FILENAME = config['report_filename']
if TEXTFILE_DIRECTORY.nil?
raise(Puppet::ParseError, "#{configfile}: textfile_directory is not set.")
end
unless REPORT_FILENAME.nil? or REPORT_FILENAME.end_with? '.prom'
raise(Puppet::ParseError, "#{configfile}: report_filename does not ends with .prom")
end
def process
if REPORT_FILENAME.nil?
namevar = self.host
else
namevar = REPORT_FILENAME
end
yaml_filename = File.join(TEXTFILE_DIRECTORY, '.' + namevar + '.yaml')
filename = File.join(TEXTFILE_DIRECTORY, namevar + '.prom')
common_values = {
environment: self.environment,
host: self.host,
}.reduce([]) {
|values, extra| values + Array("#{extra[0].to_s}=\"#{extra[1].to_s}\"")
}
new_metrics = Hash.new
unless metrics.empty? or metrics['events'].nil?
metrics.each do |metric, data|
data.values.each do |val|
new_metrics["puppet_report_#{metric}{name=\"#{val[1]}\",#{common_values.join(',')}}"] = val[2]
end
end
end
epochtime = DateTime.now.new_offset(0).strftime('%Q')
new_metrics["puppet_report{#{common_values.join(',')}}"] = epochtime
File.open(filename, 'w') do |file|
if File.exist?(yaml_filename)
file.write("# Old metrics\n")
existing_metrics = YAML.load_file(yaml_filename)
existing_metrics.each do |k, _v|
unless new_metrics.include?(k)
file.write("#{k} -1\n")
end
end
end
file.write("# New metrics\n")
new_metrics.each do |k, v|
file.write("#{k} #{v}\n")
end
end
File.open(yaml_filename, 'w') do |yaml_file|
yaml_file.write new_metrics.to_yaml
end
end
end