From 8e60f7d2b31cde32a03debbb37fe7108f52c43d8 Mon Sep 17 00:00:00 2001 From: Nick Walker Date: Mon, 29 Jan 2018 12:59:18 -0800 Subject: [PATCH 1/9] Add the ability to ship metrics directly to influxdb Prior to this commit, there was no built-in way to ship metrics to an outside metrics server. After this commit, we pull in a script from puppetlabs/puppet-metrics-viewer that allows conversion of the metrics data we gather to influxdb or graphite format. This commit adds the initial support to enabling shipping of metrics directly to influxdb when given a hostname to connect to. --- files/json2timeseriesdb | 362 ++++++++++++++++++++++++++++++++++++++ manifests/activemq.pp | 2 + manifests/init.pp | 7 + manifests/orchestrator.pp | 2 + manifests/pe_metric.pp | 12 +- manifests/puppetdb.pp | 3 + manifests/puppetserver.pp | 2 + 7 files changed, 389 insertions(+), 1 deletion(-) create mode 100644 files/json2timeseriesdb diff --git a/files/json2timeseriesdb b/files/json2timeseriesdb new file mode 100644 index 00000000..dac6c206 --- /dev/null +++ b/files/json2timeseriesdb @@ -0,0 +1,362 @@ +#!/opt/puppetlabs/puppet/bin/ruby + +require 'json' +require 'time' +require 'optparse' +require 'socket' +require 'net/http' +require 'uri' + +class NetworkOutput + # TODO: Support HTTPS. + def initialize(host_url) + @url = URI.parse(host_url) unless host_url.is_a?(URI) + open + end + + def open + return if @output + + @output = case @url.scheme + when 'tcp' + TCPSocket.new(@url.host, @url.port) + when 'http' + http = Net::HTTP.new(@url.hostname, @url.port) + http.keep_alive_timeout = 20 + http.start + + http + end + end + + def write(str, timeout = 1) + case @url.scheme + when 'tcp' + begin + @output.write(str) + rescue Errno::EPIPE, Errno::EHOSTUNREACH, Errno::ECONNREFUSED + close + STDERR.puts "WARNING: write to #{@host} failed; sleeping for #{timeout} seconds and retrying..." + sleep timeout + open + write(str, timeout * 2) + end + when 'http' + request = Net::HTTP::Post.new(@url) + request['Connection'] = 'keep-alive' + response = @output.request(request, str) + + STDERR.puts "POST: #{@url} #{response.code}" + end + end + + def close + case @url.scheme + when 'tcp' + @output.close + when 'http' + @output.finish + end + ensure + @output = nil + end +end + +def parse_file(filename) + data = JSON.parse(File.read(filename)) + + parse_input(data) +end + +def parse_input( data ) + # Newer versions of the log tool insert a timestamp field into the JSON. + if data['timestamp'] + timestamp = Time.parse(data.delete('timestamp')) + parent_key = nil + else + timestamp = get_timestamp(filename) + # The only data supported in the older log tool comes from puppetserver. + parent_key = 'servers.' + get_hoststr(filename) + '.puppetserver' + end + + case $options[:output_format] + when 'influxdb' + influx_metrics(data, timestamp, parent_key).join("\n") + else + metrics(data, timestamp, parent_key).map do |item| + item.split('\n') + end.flatten.join("\r\n") + end +end + +def get_timestamp(str) + # Example filename: nzxppc5047.nndc.kp.org-11_29_16_13:00.json + timestr = str.match(/(\d\d)_(\d\d)_(\d\d)_(\d\d:\d\d)\.json$/) || raise("Unable to parse timestame from #{str}") + yyyy = timestr[3].sub(/.*_(\d\d)$/, '20\1') + mm = timestr[1] + dd = timestr[2] + hhmm = timestr[4] + Time.parse("#{yyyy}-#{mm}-#{dd} #{hhmm}") +end + +def get_hoststr(str) + # Example filename: patched.nzxppc5047.nndc.kp.org-11_29_16_13:00.json + str.match(/(patched\.)?([^\/]*)-(\d\d_){3}\d\d:\d\d\.json$/)[2].gsub('.', '-') +end + +def safe_name(value) + value.sub(/^[^0-9a-z_-]/i, '').gsub(/[^0-9a-z_-]/i, '_').gsub(/__/, '_').sub(/_*$/, '') +end + +def array_cipher + @array_cipher ||= { + 'http-metrics' => { + 'pkey' => 'route-id', + 'keys' => { + 'puppet-v3-catalog-/*/' => 'catalog', + 'puppet-v3-node-/*/' => 'node', + 'puppet-v3-report-/*/' => 'report', + 'puppet-v3-file_metadata-/*/' => 'file-metadata', + 'puppet-v3-file_metadatas-/*/' => 'file-metadatas' + } + }, + 'function-metrics' => { + 'pkey' => 'function', + 'keys' => :all + } + } +end + +def error_name(str) + if str["mbean"] + str[/'[^']+'([^']+)'/,1] + else + str + end +end + +def return_tag(a, n) + if a[n].is_a? String + return a[n] + else + if n > -1 + return_tag(a, n-1) + else return "none" + end +end +end + +def metrics(data, timestamp, parent_key = nil) + data.collect do |key, value| + current_key = [parent_key, safe_name(key)].compact.join('.') + case value + when Hash + metrics(value, timestamp, current_key) + when Array + cipher = array_cipher[key] + if cipher + value.map do |elem| + pkey_value = elem.delete(cipher['pkey']) + elem.map do |k,v| + if cipher['keys'] == :all || subkey = cipher['keys'][pkey_value] + subkey ||= pkey_value + "#{current_key}.#{safe_name(subkey)}.#{safe_name(k)} #{v} #{timestamp.to_i}" + else + nil + end + end.compact + end.flatten.compact.join("\n") + elsif key == 'error' + value.map do |elem| + ekey = error_name(elem) + "#{current_key}.#{safe_name(ekey)} 1 #{timestamp.to_i}" + end.compact + else + nil + end + else + "#{current_key} #{value} #{timestamp.to_i}" + end + end.flatten.compact +end + +def remove_trailing_comma(str) + str.nil? ? nil : str.chomp(",") +end + +def influx_tag_parser(tag) + delete_set = ["status", "metrics", "routes", "status-service", "experimental", "app", "max", "min", "used", "init", "committed", "aggregate", "mean", "std-dev", "count", "total", "1", "5", "15"] + tag = tag - delete_set + tag_set = nil + + if tag.include? "servers" + n = tag.index "servers" + server_name = $options[:server_tag] || tag[n.to_i + 1] + tag_set = "server=#{server_name}," + tag.delete_at(tag.index("servers")+1) + tag.delete("servers") + end + + if tag.include? "orchestrator" + tag_set = "#{tag_set}service=orchestrator," + tag.delete("orchestrator") + end + + if tag.include? "puppet_server" + tag_set = "#{tag_set}service=puppet_server," + tag.delete("puppet_server") + end + + if tag.include? "puppetdb" + tag_set = "#{tag_set}service=puppetdb," + tag.delete("puppetdb") + end + + if tag.include? "gc-stats" + n = tag.index "gc-stats" + gcstats_name = tag[n.to_i + 1] + tag_set = "#{tag_set}gc-stats=#{gcstats_name}," + tag.delete_at(tag.index("gc-stats")+1) + tag.delete("gc-stats") + end + + if tag.include? "broker-service" + n = tag.index "broker-service" + brokerservice_name = tag[n.to_i + 1] + tag_set = "#{tag_set}broker-service_name=#{brokerservice_name}," + tag.delete_at(tag.index("broker-service")+1) + tag.delete("broker-service") + end + + if tag.length > 1 + measurement = tag.compact.join('.') + tag_set = "#{measurement},#{tag_set}" + elsif tag.length == 1 + measurement = tag[0] + tag_set = "#{measurement},#{tag_set}" + end + + tag_set = remove_trailing_comma(tag_set) + return tag_set + +end + +def influx_metrics(data, timestamp, parent_key = nil) + data.collect do |key, value| + current_key = [parent_key, safe_name(key)].compact.join('.') + case value + when Hash + influx_metrics(value, timestamp, current_key) + when Numeric + temp_key = current_key.split(".") + field_key = return_tag(temp_key, temp_key.length) + if field_key.eql? "none" + break + end + field_value = value + tag_set = influx_tag_parser(temp_key) + "#{tag_set} #{field_key}=#{field_value} #{timestamp.to_i}" + when Array + # Puppet Profiler metric. + pp_metric = case current_key + when /resource-metrics\Z/ + "resource" + when /function-metrics\Z/ + "function" + when /catalog-metrics\Z/ + "metric" + when /http-metrics\Z/ + "route-id" + else + # Skip all other array valued metrics. + next + end + + temp_key = current_key.split(".") + tag_set = influx_tag_parser(temp_key) + + value.map do |metrics| + working_set = metrics.dup + entry_name = working_set.delete(pp_metric) + next if entry_name.nil? + + # Strip characters reserved by InfluxDB. + entry_name.gsub(/\s,=/, '') + leader = "#{tag_set},name=#{entry_name}" + + measurements = working_set.map {|k,v| [k,v].join("=")}.join(',') + + "#{leader} #{measurements} #{timestamp.to_i}" + end + else + nil + end + end.flatten.compact +end + +$options = {} +OptionParser.new do |opt| + opt.on('--pattern PATTERN') { |o| $options[:pattern] = o } + opt.on('--netcat HOST') { |o| $options[:host] = o } + opt.on('--port PORT') { |p| $options[:port] = p } + opt.on('--convert-to FORMAT') { |o| $options[:output_format] = o } + opt.on('--server-tag SERVER_NAME') { |o| $options[:server_tag] = o } + + # InfluxDB options + opt.on('--influx-db DATABASE_NAME') {|o| $options[:influx_db] = o } +end.parse! + +if $options[:host] + url = case $options[:output_format] + when 'influxdb' + raise ArgumentError, "--influx-db must be passsed along with --netcat" unless $options[:influx_db] + port = $options[:port] || "8086" + "http://#{$options[:host]}:#{port}/write?db=#{$options[:influx_db]}&precision=s" + else + port = $options[:port] || "2003" + "tcp://#{$options[:host]}:#{port}" + end + + $net_output = NetworkOutput.new(url) +end + +data_files = [] +data_files += Dir.glob($options[:pattern]) if $options[:pattern] + +#http://ruby-doc.org/core-1.9.3/ARGF.html#method-i-filename +while ARGF.filename != '-' + filename = ARGF.filename + data_files += [filename] + ARGF.skip + break if filename == ARGF.filename +end + +data_files.each do |filename| + begin + converted_data = parse_file(filename) + + if $options[:host] + $net_output.write(converted_data) + else + STDOUT.write(converted_data) + end + rescue => e + STDERR.puts "ERROR: #{filename}: #{e.message}" + end +end + +if ARGF.filename == '-' + begin + converted_data = parse_input( JSON.parse(ARGF.read) ) + + if $options[:host] + $net_output.write(converted_data) + else + STDOUT.write(converted_data) + end + rescue => e + STDERR.puts "ERROR: During read from STDIN: #{e.message}" + end +end + +$net_output.close if $options[:host] diff --git a/manifests/activemq.pp b/manifests/activemq.pp index de0a8cea..960bc26c 100644 --- a/manifests/activemq.pp +++ b/manifests/activemq.pp @@ -4,6 +4,7 @@ String $metrics_ensure = $puppet_metrics_collector::activemq_metrics_ensure, Array[String] $hosts = $puppet_metrics_collector::activemq_hosts, Integer $port = $puppet_metrics_collector::activemq_port, + Optional[String] $influxdb_host = $puppet_metrics_collector::influxdb_host, ) { $scripts_dir = $::puppet_metrics_collector::scripts_dir @@ -64,5 +65,6 @@ metrics_port => $port, metric_script_file => 'amq_metrics', additional_metrics => $additional_metrics, + influxdb_host => $influxdb_host, } } diff --git a/manifests/init.pp b/manifests/init.pp index 2808559d..5b1cf50a 100644 --- a/manifests/init.pp +++ b/manifests/init.pp @@ -15,6 +15,7 @@ Array[String] $activemq_hosts = puppet_metrics_collector::hosts_with_pe_profile('amq::broker'), Integer $activemq_port = 8161, Boolean $symlink_puppet_metrics_collector = true, + Optional[String] $influxdb_host = undef, ) { $scripts_dir = "${output_dir}/scripts" $bin_dir = "${output_dir}/bin" @@ -29,6 +30,12 @@ source => 'puppet:///modules/puppet_metrics_collector/tk_metrics' } + file { "${scripts_dir}/json2timeseriesdb" : + ensure => present, + mode => '0755', + source => 'puppet:///modules/pe_metric_curl_cron_jobs/json2timeseriesdb' + } + file { "${bin_dir}/puppet-metrics-collector": ensure => file, owner => 'root', diff --git a/manifests/orchestrator.pp b/manifests/orchestrator.pp index d21b96b1..90d432ab 100644 --- a/manifests/orchestrator.pp +++ b/manifests/orchestrator.pp @@ -4,6 +4,7 @@ String $metrics_ensure = $puppet_metrics_collector::orchestrator_metrics_ensure, Array[String] $hosts = $puppet_metrics_collector::orchestrator_hosts, Integer $port = $puppet_metrics_collector::orchestrator_port, + Optional[String] $influxdb_host = $puppet_metrics_collector::influxdb_host, ) { Puppet_metrics_collector::Pe_metric { output_dir => $puppet_metrics_collector::output_dir, @@ -16,5 +17,6 @@ metric_ensure => $metrics_ensure, hosts => $hosts, metrics_port => $port, + influxdb_host => $influxdb_host, } } diff --git a/manifests/pe_metric.pp b/manifests/pe_metric.pp index df23eaeb..2b5d06f7 100644 --- a/manifests/pe_metric.pp +++ b/manifests/pe_metric.pp @@ -10,6 +10,7 @@ String $metric_script_file = 'tk_metrics', Array[Hash] $additional_metrics = [], Boolean $ssl = true, + Optional[String] $influxdb_host = undef, ) { $metrics_output_dir = "${output_dir}/${metrics_type}" @@ -38,10 +39,19 @@ } $script_file_name = "${scripts_dir}/${metric_script_file}" + $conversion_script_file_name = "${scripts_dir}/json2timeseriesdb" + + $metrics_base_command = "${script_file_name} --metrics_type ${metrics_type} --output-dir ${metrics_output_dir}" + + if !empty($influxdb_host) { + $metrics_command = "${metrics_base_command} | ${conversion_script_file_name} --netcat ${influxdb_host} --convert-to influxdb --influx-db pe_metrics" + } else { + $metrics_command = "${metrics_base_command} --no-print" + } cron { "${metrics_type}_metrics_collection" : ensure => $metric_ensure, - command => "${script_file_name} --metrics_type ${metrics_type} --output-dir ${metrics_output_dir} --no-print", + command => $metrics_command, user => 'root', minute => $cron_minute, } diff --git a/manifests/puppetdb.pp b/manifests/puppetdb.pp index 58742813..8a4fe67a 100644 --- a/manifests/puppetdb.pp +++ b/manifests/puppetdb.pp @@ -1,9 +1,11 @@ +<<<<<<< HEAD class puppet_metrics_collector::puppetdb ( Integer $collection_frequency = $puppet_metrics_collector::collection_frequency, Integer $retention_days = $puppet_metrics_collector::retention_days, String $metrics_ensure = $puppet_metrics_collector::puppetdb_metrics_ensure, Array[String] $hosts = $puppet_metrics_collector::puppetdb_hosts, Integer $port = $puppet_metrics_collector::puppetdb_port, + Optional[String] $influxdb_host = $puppet_metrics_collector::influxdb_host, ) { Puppet_metrics_collector::Pe_metric { output_dir => $puppet_metrics_collector::output_dir, @@ -185,5 +187,6 @@ 'url' => 'puppetlabs.puppetdb.ha:name=record-transfer-duration' }, metrics_port => $_port, ssl => $_ssl, additional_metrics => $additional_metrics, + influxdb_host => $influxdb_host, } } diff --git a/manifests/puppetserver.pp b/manifests/puppetserver.pp index 6849da33..b137e25c 100644 --- a/manifests/puppetserver.pp +++ b/manifests/puppetserver.pp @@ -4,6 +4,7 @@ String $metrics_ensure = $puppet_metrics_collector::puppetserver_metrics_ensure, Array[String] $hosts = $puppet_metrics_collector::puppetserver_hosts, Integer $port = $puppet_metrics_collector::puppetserver_port, + Optional[String] $influxdb_host = $puppet_metrics_collector::influxdb_host, ) { Puppet_metrics_collector::Pe_metric { output_dir => $puppet_metrics_collector::output_dir, @@ -42,5 +43,6 @@ hosts => $hosts, metrics_port => $port, additional_metrics => $additional_metrics, + influxdb_host => $influxdb_host, } } From f96ebf815541b10d52beb17a39ba17a347052937 Mon Sep 17 00:00:00 2001 From: Nick Walker Date: Mon, 5 Feb 2018 16:41:01 -0800 Subject: [PATCH 2/9] Allow a hash of metrics server information Previously, we only allowed passing an influxdb host but you may want to pass a port or a different database type for influx. Additionally, you may prefer to ship to graphite. You can now do any of these by using the correct metrics_server_info hash. --- manifests/activemq.pp | 4 ++-- manifests/init.pp | 2 +- manifests/orchestrator.pp | 4 ++-- manifests/pe_metric.pp | 26 +++++++++++++++++++++++--- manifests/puppetdb.pp | 5 ++--- manifests/puppetserver.pp | 4 ++-- types/metrics_server.pp | 6 ++++++ 7 files changed, 38 insertions(+), 13 deletions(-) create mode 100644 types/metrics_server.pp diff --git a/manifests/activemq.pp b/manifests/activemq.pp index 960bc26c..c257af04 100644 --- a/manifests/activemq.pp +++ b/manifests/activemq.pp @@ -4,7 +4,7 @@ String $metrics_ensure = $puppet_metrics_collector::activemq_metrics_ensure, Array[String] $hosts = $puppet_metrics_collector::activemq_hosts, Integer $port = $puppet_metrics_collector::activemq_port, - Optional[String] $influxdb_host = $puppet_metrics_collector::influxdb_host, + Optional[Puppet_metrics_collector::Metrics_server] $metrics_server_info = $puppet_metrics_collector::metrics_server_info, ) { $scripts_dir = $::puppet_metrics_collector::scripts_dir @@ -65,6 +65,6 @@ metrics_port => $port, metric_script_file => 'amq_metrics', additional_metrics => $additional_metrics, - influxdb_host => $influxdb_host, + metrics_server_info => $metrics_server_info, } } diff --git a/manifests/init.pp b/manifests/init.pp index 5b1cf50a..d316556c 100644 --- a/manifests/init.pp +++ b/manifests/init.pp @@ -15,7 +15,7 @@ Array[String] $activemq_hosts = puppet_metrics_collector::hosts_with_pe_profile('amq::broker'), Integer $activemq_port = 8161, Boolean $symlink_puppet_metrics_collector = true, - Optional[String] $influxdb_host = undef, + Optional[Pe_metric_curl_cron_jobs::Metrics_server] $metrics_server_info = undef, ) { $scripts_dir = "${output_dir}/scripts" $bin_dir = "${output_dir}/bin" diff --git a/manifests/orchestrator.pp b/manifests/orchestrator.pp index 90d432ab..678a171b 100644 --- a/manifests/orchestrator.pp +++ b/manifests/orchestrator.pp @@ -4,7 +4,7 @@ String $metrics_ensure = $puppet_metrics_collector::orchestrator_metrics_ensure, Array[String] $hosts = $puppet_metrics_collector::orchestrator_hosts, Integer $port = $puppet_metrics_collector::orchestrator_port, - Optional[String] $influxdb_host = $puppet_metrics_collector::influxdb_host, + Optional[Puppet_metrics_collector::Metrics_server] $metrics_server_info = $puppet_metrics_collector::metrics_server_info, ) { Puppet_metrics_collector::Pe_metric { output_dir => $puppet_metrics_collector::output_dir, @@ -17,6 +17,6 @@ metric_ensure => $metrics_ensure, hosts => $hosts, metrics_port => $port, - influxdb_host => $influxdb_host, + metrics_server_info => $metrics_server_info, } } diff --git a/manifests/pe_metric.pp b/manifests/pe_metric.pp index 2b5d06f7..0452a761 100644 --- a/manifests/pe_metric.pp +++ b/manifests/pe_metric.pp @@ -10,7 +10,7 @@ String $metric_script_file = 'tk_metrics', Array[Hash] $additional_metrics = [], Boolean $ssl = true, - Optional[String] $influxdb_host = undef, + Optional[Pe_metric_curl_cron_jobs::Metrics_server] $metrics_server_info = undef, ) { $metrics_output_dir = "${output_dir}/${metrics_type}" @@ -43,8 +43,28 @@ $metrics_base_command = "${script_file_name} --metrics_type ${metrics_type} --output-dir ${metrics_output_dir}" - if !empty($influxdb_host) { - $metrics_command = "${metrics_base_command} | ${conversion_script_file_name} --netcat ${influxdb_host} --convert-to influxdb --influx-db pe_metrics" + if !empty($metrics_server_info) { + $metrics_server_hostname = $metrics_server_info['hostname'] + $metrics_server_port = $metrics_server_info['port'] + $metrics_server_type = $metrics_server_info['metrics_server_type'] + $metrics_server_db = $metrics_server_info['db_name'] + + if empty($metrics_server_db) and $metrics_server_type == 'influxdb' { + fail( 'When using an influxdb server you must provide the db_name to store metrics in' ) + } + + $local_metrics_command = "${metrics_base_command} | ${conversion_script_file_name} --netcat ${metrics_server_hostname} --convert-to ${metrics_server_type}" + + $port_metrics_command = empty($metrics_server_port) ? { + false => "${local_metrics_command} --port ${metrics_server_port}", + true => $local_metrics_command, + } + + $metrics_command = $metrics_server_type ? { + 'influxdb' => "${port_metrics_command} --influx-db ${metrics_server_db}", + 'graphite' => $port_metrics_command, + default => $port_metrics_command, + } } else { $metrics_command = "${metrics_base_command} --no-print" } diff --git a/manifests/puppetdb.pp b/manifests/puppetdb.pp index 8a4fe67a..7f1bd2f5 100644 --- a/manifests/puppetdb.pp +++ b/manifests/puppetdb.pp @@ -1,11 +1,10 @@ -<<<<<<< HEAD class puppet_metrics_collector::puppetdb ( Integer $collection_frequency = $puppet_metrics_collector::collection_frequency, Integer $retention_days = $puppet_metrics_collector::retention_days, String $metrics_ensure = $puppet_metrics_collector::puppetdb_metrics_ensure, Array[String] $hosts = $puppet_metrics_collector::puppetdb_hosts, Integer $port = $puppet_metrics_collector::puppetdb_port, - Optional[String] $influxdb_host = $puppet_metrics_collector::influxdb_host, + Optional[Puppet_metrics_collector::Metrics_server] $metrics_server_info = $puppet_metrics_collector::metrics_server_info, ) { Puppet_metrics_collector::Pe_metric { output_dir => $puppet_metrics_collector::output_dir, @@ -187,6 +186,6 @@ 'url' => 'puppetlabs.puppetdb.ha:name=record-transfer-duration' }, metrics_port => $_port, ssl => $_ssl, additional_metrics => $additional_metrics, - influxdb_host => $influxdb_host, + metrics_server_info => $metrics_server_info, } } diff --git a/manifests/puppetserver.pp b/manifests/puppetserver.pp index b137e25c..d8d31310 100644 --- a/manifests/puppetserver.pp +++ b/manifests/puppetserver.pp @@ -4,7 +4,7 @@ String $metrics_ensure = $puppet_metrics_collector::puppetserver_metrics_ensure, Array[String] $hosts = $puppet_metrics_collector::puppetserver_hosts, Integer $port = $puppet_metrics_collector::puppetserver_port, - Optional[String] $influxdb_host = $puppet_metrics_collector::influxdb_host, + Optional[Puppet_metrics_collector::Metrics_server] $metrics_server_info = $puppet_metrics_collector::metrics_server_info, ) { Puppet_metrics_collector::Pe_metric { output_dir => $puppet_metrics_collector::output_dir, @@ -43,6 +43,6 @@ hosts => $hosts, metrics_port => $port, additional_metrics => $additional_metrics, - influxdb_host => $influxdb_host, + metrics_server_info => $metrics_server_info, } } diff --git a/types/metrics_server.pp b/types/metrics_server.pp new file mode 100644 index 00000000..2381fea0 --- /dev/null +++ b/types/metrics_server.pp @@ -0,0 +1,6 @@ +type Pe_metric_curl_cron_jobs::Metrics_server = Struct[{ + metrics_server_type => Enum['influxdb','graphite'], + hostname => String, + port => Optional[Integer], + db_name => Optional[String], +}] From 1374931de92dca48d95714a4572f94f948adf0bc Mon Sep 17 00:00:00 2001 From: Helen Campbell Date: Wed, 19 Jun 2019 15:17:13 +0100 Subject: [PATCH 3/9] Cleanup from merge --- manifests/activemq.pp | 14 +++++++------- manifests/init.pp | 8 ++++---- manifests/orchestrator.pp | 8 ++++---- manifests/pe_metric.pp | 2 +- manifests/puppetdb.pp | 12 ++++++------ manifests/puppetserver.pp | 12 ++++++------ types/metrics_server.pp | 2 +- 7 files changed, 29 insertions(+), 29 deletions(-) diff --git a/manifests/activemq.pp b/manifests/activemq.pp index c257af04..b85cb2c0 100644 --- a/manifests/activemq.pp +++ b/manifests/activemq.pp @@ -4,7 +4,7 @@ String $metrics_ensure = $puppet_metrics_collector::activemq_metrics_ensure, Array[String] $hosts = $puppet_metrics_collector::activemq_hosts, Integer $port = $puppet_metrics_collector::activemq_port, - Optional[Puppet_metrics_collector::Metrics_server] $metrics_server_info = $puppet_metrics_collector::metrics_server_info, + Optional[Puppet_metrics_collector::Metrics_server] $metrics_server_info = $::puppet_metrics_collector::metrics_server_info, ) { $scripts_dir = $::puppet_metrics_collector::scripts_dir @@ -60,11 +60,11 @@ } puppet_metrics_collector::pe_metric { 'activemq' : - metric_ensure => $metrics_ensure, - hosts => $hosts, - metrics_port => $port, - metric_script_file => 'amq_metrics', - additional_metrics => $additional_metrics, - metrics_server_info => $metrics_server_info, + metric_ensure => $metrics_ensure, + hosts => $hosts, + metrics_port => $port, + metric_script_file => 'amq_metrics', + additional_metrics => $additional_metrics, + metrics_server_info => $metrics_server_info, } } diff --git a/manifests/init.pp b/manifests/init.pp index d316556c..6f1abdd8 100644 --- a/manifests/init.pp +++ b/manifests/init.pp @@ -15,7 +15,7 @@ Array[String] $activemq_hosts = puppet_metrics_collector::hosts_with_pe_profile('amq::broker'), Integer $activemq_port = 8161, Boolean $symlink_puppet_metrics_collector = true, - Optional[Pe_metric_curl_cron_jobs::Metrics_server] $metrics_server_info = undef, + Optional[Puppet_metrics_collector::Metrics_server] $metrics_server_info = undef, ) { $scripts_dir = "${output_dir}/scripts" $bin_dir = "${output_dir}/bin" @@ -31,9 +31,9 @@ } file { "${scripts_dir}/json2timeseriesdb" : - ensure => present, - mode => '0755', - source => 'puppet:///modules/pe_metric_curl_cron_jobs/json2timeseriesdb' + ensure => present, + mode => '0755', + source => 'puppet:///modules/puppet_metrics_collector/json2timeseriesdb' } file { "${bin_dir}/puppet-metrics-collector": diff --git a/manifests/orchestrator.pp b/manifests/orchestrator.pp index 678a171b..98de8a98 100644 --- a/manifests/orchestrator.pp +++ b/manifests/orchestrator.pp @@ -4,7 +4,7 @@ String $metrics_ensure = $puppet_metrics_collector::orchestrator_metrics_ensure, Array[String] $hosts = $puppet_metrics_collector::orchestrator_hosts, Integer $port = $puppet_metrics_collector::orchestrator_port, - Optional[Puppet_metrics_collector::Metrics_server] $metrics_server_info = $puppet_metrics_collector::metrics_server_info, + Optional[Puppet_metrics_collector::Metrics_server] $metrics_server_info = $::puppet_metrics_collector::metrics_server_info, ) { Puppet_metrics_collector::Pe_metric { output_dir => $puppet_metrics_collector::output_dir, @@ -14,9 +14,9 @@ } puppet_metrics_collector::pe_metric { 'orchestrator' : - metric_ensure => $metrics_ensure, - hosts => $hosts, - metrics_port => $port, + metric_ensure => $metrics_ensure, + hosts => $hosts, + metrics_port => $port, metrics_server_info => $metrics_server_info, } } diff --git a/manifests/pe_metric.pp b/manifests/pe_metric.pp index 0452a761..56296344 100644 --- a/manifests/pe_metric.pp +++ b/manifests/pe_metric.pp @@ -10,7 +10,7 @@ String $metric_script_file = 'tk_metrics', Array[Hash] $additional_metrics = [], Boolean $ssl = true, - Optional[Pe_metric_curl_cron_jobs::Metrics_server] $metrics_server_info = undef, + Optional[Puppet_metrics_collector::Metrics_server] $metrics_server_info = undef, ) { $metrics_output_dir = "${output_dir}/${metrics_type}" diff --git a/manifests/puppetdb.pp b/manifests/puppetdb.pp index 7f1bd2f5..ef0e774c 100644 --- a/manifests/puppetdb.pp +++ b/manifests/puppetdb.pp @@ -4,7 +4,7 @@ String $metrics_ensure = $puppet_metrics_collector::puppetdb_metrics_ensure, Array[String] $hosts = $puppet_metrics_collector::puppetdb_hosts, Integer $port = $puppet_metrics_collector::puppetdb_port, - Optional[Puppet_metrics_collector::Metrics_server] $metrics_server_info = $puppet_metrics_collector::metrics_server_info, + Optional[Puppet_metrics_collector::Metrics_server] $metrics_server_info = $::puppet_metrics_collector::metrics_server_info, ) { Puppet_metrics_collector::Pe_metric { output_dir => $puppet_metrics_collector::output_dir, @@ -181,11 +181,11 @@ 'url' => 'puppetlabs.puppetdb.ha:name=record-transfer-duration' }, } puppet_metrics_collector::pe_metric { 'puppetdb' : - metric_ensure => $metrics_ensure, - hosts => $hosts, - metrics_port => $_port, - ssl => $_ssl, - additional_metrics => $additional_metrics, + metric_ensure => $metrics_ensure, + hosts => $hosts, + metrics_port => $_port, + ssl => $_ssl, + additional_metrics => $additional_metrics, metrics_server_info => $metrics_server_info, } } diff --git a/manifests/puppetserver.pp b/manifests/puppetserver.pp index d8d31310..c81bdcef 100644 --- a/manifests/puppetserver.pp +++ b/manifests/puppetserver.pp @@ -4,7 +4,7 @@ String $metrics_ensure = $puppet_metrics_collector::puppetserver_metrics_ensure, Array[String] $hosts = $puppet_metrics_collector::puppetserver_hosts, Integer $port = $puppet_metrics_collector::puppetserver_port, - Optional[Puppet_metrics_collector::Metrics_server] $metrics_server_info = $puppet_metrics_collector::metrics_server_info, + Optional[Puppet_metrics_collector::Metrics_server] $metrics_server_info = $::puppet_metrics_collector::metrics_server_info, ) { Puppet_metrics_collector::Pe_metric { output_dir => $puppet_metrics_collector::output_dir, @@ -35,14 +35,14 @@ 'url' => "puppetserver:name=puppetlabs.${::hostname}.puppetdb.command.submit.store report" }, ] } else { - $additional_metrics = [] + $additional_metrics = [] } puppet_metrics_collector::pe_metric { 'puppetserver' : - metric_ensure => $metrics_ensure, - hosts => $hosts, - metrics_port => $port, - additional_metrics => $additional_metrics, + metric_ensure => $metrics_ensure, + hosts => $hosts, + metrics_port => $port, + additional_metrics => $additional_metrics, metrics_server_info => $metrics_server_info, } } diff --git a/types/metrics_server.pp b/types/metrics_server.pp index 2381fea0..c638f9ec 100644 --- a/types/metrics_server.pp +++ b/types/metrics_server.pp @@ -1,4 +1,4 @@ -type Pe_metric_curl_cron_jobs::Metrics_server = Struct[{ +type Puppet_metrics_collector::Metrics_server = Struct[{ metrics_server_type => Enum['influxdb','graphite'], hostname => String, port => Optional[Integer], From 2e582c54718881236c544a05d4034084516856a1 Mon Sep 17 00:00:00 2001 From: Helen Campbell Date: Tue, 25 Jun 2019 14:43:38 +0100 Subject: [PATCH 4/9] Update documentation with metrics_server_info type --- README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/README.md b/README.md index b2b1d347..1f718007 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,25 @@ Integer: How often to collect metrics, in minutes. Defaults to `5`. Integer: How long to retain collect metrics, in days. Defaults to `90`. +##### metrics_server_info + +Struct: + metrics_server_type => Enum['influxdb','graphite'], + hostname => String, + port => Optional[Integer], + db_name => Optional[String], + +Specifies a metrics server to write data to. Currently it supports `influxdb` and `graphite` type servers. The parameters `metrics_server_type` and `hostname` are both required, and `dbname` is required for a `metrics_server_type` of `influxdb`. + +Example: +``` +Puppet_metrics_collector::Metrics_server{ 'collectmydataplease': + metrics_server_type => 'influxdb', + hostname => 'my.hostname.here', + port => 1234, + db_name => 'mycooldbname', +}] +``` ## Usage From 5f611e8282113a49330cf71d67a7de6ce0e93ad8 Mon Sep 17 00:00:00 2001 From: Helen Campbell Date: Tue, 25 Jun 2019 14:59:23 +0100 Subject: [PATCH 5/9] Redirect port_metrics_command stdout to /dev/null --- manifests/pe_metric.pp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/manifests/pe_metric.pp b/manifests/pe_metric.pp index 56296344..7ea01a64 100644 --- a/manifests/pe_metric.pp +++ b/manifests/pe_metric.pp @@ -61,9 +61,9 @@ } $metrics_command = $metrics_server_type ? { - 'influxdb' => "${port_metrics_command} --influx-db ${metrics_server_db}", - 'graphite' => $port_metrics_command, - default => $port_metrics_command, + 'influxdb' => "${port_metrics_command} --influx-db ${metrics_server_db} > /dev/null", + 'graphite' => "${port_metrics_command} > /dev/null", + default => "${port_metrics_command} > /dev/null", } } else { $metrics_command = "${metrics_base_command} --no-print" From 477ed21d1297e80ec40098eb283961e75cee5704 Mon Sep 17 00:00:00 2001 From: Helen Campbell Date: Tue, 25 Jun 2019 15:24:57 +0100 Subject: [PATCH 6/9] Parameter to override entire metrics command --- manifests/pe_metric.pp | 53 +++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/manifests/pe_metric.pp b/manifests/pe_metric.pp index 7ea01a64..706c7606 100644 --- a/manifests/pe_metric.pp +++ b/manifests/pe_metric.pp @@ -11,6 +11,7 @@ Array[Hash] $additional_metrics = [], Boolean $ssl = true, Optional[Puppet_metrics_collector::Metrics_server] $metrics_server_info = undef, + Optional[String] $override_metrics_command = undef, ) { $metrics_output_dir = "${output_dir}/${metrics_type}" @@ -41,32 +42,36 @@ $script_file_name = "${scripts_dir}/${metric_script_file}" $conversion_script_file_name = "${scripts_dir}/json2timeseriesdb" - $metrics_base_command = "${script_file_name} --metrics_type ${metrics_type} --output-dir ${metrics_output_dir}" - - if !empty($metrics_server_info) { - $metrics_server_hostname = $metrics_server_info['hostname'] - $metrics_server_port = $metrics_server_info['port'] - $metrics_server_type = $metrics_server_info['metrics_server_type'] - $metrics_server_db = $metrics_server_info['db_name'] - - if empty($metrics_server_db) and $metrics_server_type == 'influxdb' { - fail( 'When using an influxdb server you must provide the db_name to store metrics in' ) - } - - $local_metrics_command = "${metrics_base_command} | ${conversion_script_file_name} --netcat ${metrics_server_hostname} --convert-to ${metrics_server_type}" - - $port_metrics_command = empty($metrics_server_port) ? { - false => "${local_metrics_command} --port ${metrics_server_port}", - true => $local_metrics_command, - } - - $metrics_command = $metrics_server_type ? { - 'influxdb' => "${port_metrics_command} --influx-db ${metrics_server_db} > /dev/null", - 'graphite' => "${port_metrics_command} > /dev/null", - default => "${port_metrics_command} > /dev/null", + if empty($override_metrics_command){ + $metrics_base_command = "${script_file_name} --metrics_type ${metrics_type} --output-dir ${metrics_output_dir}" + + if !empty($metrics_server_info) { + $metrics_server_hostname = $metrics_server_info['hostname'] + $metrics_server_port = $metrics_server_info['port'] + $metrics_server_type = $metrics_server_info['metrics_server_type'] + $metrics_server_db = $metrics_server_info['db_name'] + + if empty($metrics_server_db) and $metrics_server_type == 'influxdb' { + fail( 'When using an influxdb server you must provide the db_name to store metrics in' ) + } + + $local_metrics_command = "${metrics_base_command} | ${conversion_script_file_name} --netcat ${metrics_server_hostname} --convert-to ${metrics_server_type}" + + $port_metrics_command = empty($metrics_server_port) ? { + false => "${local_metrics_command} --port ${metrics_server_port}", + true => $local_metrics_command, + } + + $metrics_command = $metrics_server_type ? { + 'influxdb' => "${port_metrics_command} --influx-db ${metrics_server_db} > /dev/null", + 'graphite' => "${port_metrics_command} > /dev/null", + default => "${port_metrics_command} > /dev/null", + } + } else { + $metrics_command = "${metrics_base_command} --no-print" } } else { - $metrics_command = "${metrics_base_command} --no-print" + $metrics_command = $override_metrics_command } cron { "${metrics_type}_metrics_collection" : From 1a2b5fe1716d9fb4585368d45d540659adae1bf6 Mon Sep 17 00:00:00 2001 From: Helen Campbell Date: Thu, 27 Jun 2019 15:08:27 +0100 Subject: [PATCH 7/9] Addition of splunk_hec metric server type --- README.md | 7 +++++-- manifests/pe_metric.pp | 1 + types/metrics_server.pp | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1f718007..72928595 100644 --- a/README.md +++ b/README.md @@ -60,12 +60,12 @@ Integer: How long to retain collect metrics, in days. Defaults to `90`. ##### metrics_server_info Struct: - metrics_server_type => Enum['influxdb','graphite'], + metrics_server_type => Enum['influxdb','graphite','splunk_hec'], hostname => String, port => Optional[Integer], db_name => Optional[String], -Specifies a metrics server to write data to. Currently it supports `influxdb` and `graphite` type servers. The parameters `metrics_server_type` and `hostname` are both required, and `dbname` is required for a `metrics_server_type` of `influxdb`. +Specifies a metrics server to write data to. Currently it supports `influxdb`, `graphite` and `splnk_hec` type servers. The parameters `metrics_server_type` and `hostname` are both required, and `dbname` is required for a `metrics_server_type` of `influxdb`. Example: ``` @@ -77,6 +77,9 @@ Puppet_metrics_collector::Metrics_server{ 'collectmydataplease': }] ``` +For a `splunk_hec` setup please note that this will require the module `splunk_hec` installed, which can be found here on the Forge [here](https://forge.puppet.com/puppetlabs/splunk_hec) or [here](https://github.com/puppetlabs/puppetlabs-splunk_hec) on github. +Further setup instructions for using the `splunk_hec` module can be found within the modules own README.md. + ## Usage diff --git a/manifests/pe_metric.pp b/manifests/pe_metric.pp index 706c7606..0b97433f 100644 --- a/manifests/pe_metric.pp +++ b/manifests/pe_metric.pp @@ -65,6 +65,7 @@ $metrics_command = $metrics_server_type ? { 'influxdb' => "${port_metrics_command} --influx-db ${metrics_server_db} > /dev/null", 'graphite' => "${port_metrics_command} > /dev/null", + 'splunk_hec' => "${port_metrics_command} | /opt/puppetlabs/bin/puppet splunk_hec --sourcetype puppet:metrics --pe_metrics > /dev/null", default => "${port_metrics_command} > /dev/null", } } else { diff --git a/types/metrics_server.pp b/types/metrics_server.pp index c638f9ec..4d3d8078 100644 --- a/types/metrics_server.pp +++ b/types/metrics_server.pp @@ -1,5 +1,5 @@ type Puppet_metrics_collector::Metrics_server = Struct[{ - metrics_server_type => Enum['influxdb','graphite'], + metrics_server_type => Enum['influxdb','graphite', 'splunk_hec'], hostname => String, port => Optional[Integer], db_name => Optional[String], From 321000d3317d8f1d12d9b426899467e0ba1b2c78 Mon Sep 17 00:00:00 2001 From: Chris Barker Date: Mon, 1 Jul 2019 12:02:36 +0100 Subject: [PATCH 8/9] Enables use_splunk_hec bool Since we define all attributes of a splunk server in the splunk_hec module we will remove it from the type here and just let a user define using a splunk_hec as a top level toggle. --- README.md | 18 ++++++++++++++---- manifests/activemq.pp | 5 +++++ manifests/init.pp | 2 ++ manifests/orchestrator.pp | 4 ++++ manifests/pe_metric.pp | 4 +++- manifests/puppetdb.pp | 4 ++++ manifests/puppetserver.pp | 4 ++++ types/metrics_server.pp | 2 +- 8 files changed, 37 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 72928595..3ab5d141 100644 --- a/README.md +++ b/README.md @@ -57,15 +57,22 @@ Integer: How often to collect metrics, in minutes. Defaults to `5`. Integer: How long to retain collect metrics, in days. Defaults to `90`. +##### use_splunk_hec + +Boolean: Use the splunk_hec endpoint enabled by the puppetlabs/splunk_hec module. Defaults to `false`. + +This will require the module `splunk_hec` installed, which can be found here on the Forge [here](https://forge.puppet.com/puppetlabs/splunk_hec) or [here](https://github.com/puppetlabs/puppetlabs-splunk_hec) on github. +Further setup instructions for using the `splunk_hec` module can be found within the modules own README.md. + ##### metrics_server_info Struct: - metrics_server_type => Enum['influxdb','graphite','splunk_hec'], + metrics_server_type => Enum['influxdb','graphite'], hostname => String, port => Optional[Integer], db_name => Optional[String], -Specifies a metrics server to write data to. Currently it supports `influxdb`, `graphite` and `splnk_hec` type servers. The parameters `metrics_server_type` and `hostname` are both required, and `dbname` is required for a `metrics_server_type` of `influxdb`. +Specifies a metrics server to write data to. Currently it supports `influxdb`and `graphite` type servers. The parameters `metrics_server_type` and `hostname` are both required, and `dbname` is required for a `metrics_server_type` of `influxdb`. Example: ``` @@ -77,8 +84,11 @@ Puppet_metrics_collector::Metrics_server{ 'collectmydataplease': }] ``` -For a `splunk_hec` setup please note that this will require the module `splunk_hec` installed, which can be found here on the Forge [here](https://forge.puppet.com/puppetlabs/splunk_hec) or [here](https://github.com/puppetlabs/puppetlabs-splunk_hec) on github. -Further setup instructions for using the `splunk_hec` module can be found within the modules own README.md. +##### override_metrics_command + +String: replace the crontab entry entirely for the metric command being used. Defaults to `undef` + +If you are using this, you know what you're doing, and will probably have to set these for each class for the services being collected, and not use this top level param at all. ## Usage diff --git a/manifests/activemq.pp b/manifests/activemq.pp index b85cb2c0..db087e0a 100644 --- a/manifests/activemq.pp +++ b/manifests/activemq.pp @@ -4,7 +4,9 @@ String $metrics_ensure = $puppet_metrics_collector::activemq_metrics_ensure, Array[String] $hosts = $puppet_metrics_collector::activemq_hosts, Integer $port = $puppet_metrics_collector::activemq_port, + Boolean $use_splunk_hec = $::puppet_metrics_collector::use_splunk_hec, Optional[Puppet_metrics_collector::Metrics_server] $metrics_server_info = $::puppet_metrics_collector::metrics_server_info, + Optional[String] $override_metrics_command = $::puppet_metrics_collector::override_metrics_command, ) { $scripts_dir = $::puppet_metrics_collector::scripts_dir @@ -13,6 +15,8 @@ scripts_dir => $scripts_dir, cron_minute => "*/${collection_frequency}", retention_days => $retention_days, + override_metrics_command => $override_metrics_command, + use_splunk_hec => $use_splunk_hec, } $additional_metrics = [ @@ -65,6 +69,7 @@ metrics_port => $port, metric_script_file => 'amq_metrics', additional_metrics => $additional_metrics, + use_splunk_hec => $use_splunk_hec, metrics_server_info => $metrics_server_info, } } diff --git a/manifests/init.pp b/manifests/init.pp index 6f1abdd8..8da22bfc 100644 --- a/manifests/init.pp +++ b/manifests/init.pp @@ -15,7 +15,9 @@ Array[String] $activemq_hosts = puppet_metrics_collector::hosts_with_pe_profile('amq::broker'), Integer $activemq_port = 8161, Boolean $symlink_puppet_metrics_collector = true, + Boolean $use_splunk_hec = false, Optional[Puppet_metrics_collector::Metrics_server] $metrics_server_info = undef, + Optional[String] $override_metrics_command = undef, ) { $scripts_dir = "${output_dir}/scripts" $bin_dir = "${output_dir}/bin" diff --git a/manifests/orchestrator.pp b/manifests/orchestrator.pp index 98de8a98..a822fbaa 100644 --- a/manifests/orchestrator.pp +++ b/manifests/orchestrator.pp @@ -4,13 +4,17 @@ String $metrics_ensure = $puppet_metrics_collector::orchestrator_metrics_ensure, Array[String] $hosts = $puppet_metrics_collector::orchestrator_hosts, Integer $port = $puppet_metrics_collector::orchestrator_port, + Boolean $use_splunk_hec = $::puppet_metrics_collector::use_splunk_hec, Optional[Puppet_metrics_collector::Metrics_server] $metrics_server_info = $::puppet_metrics_collector::metrics_server_info, + Optional[String] $override_metrics_command = $::puppet_metrics_collector::override_metrics_command, ) { Puppet_metrics_collector::Pe_metric { output_dir => $puppet_metrics_collector::output_dir, scripts_dir => $puppet_metrics_collector::scripts_dir, cron_minute => "*/${collection_frequency}", retention_days => $retention_days, + override_metrics_command => $override_metrics_command, + use_splunk_hec => $use_splunk_hec, } puppet_metrics_collector::pe_metric { 'orchestrator' : diff --git a/manifests/pe_metric.pp b/manifests/pe_metric.pp index 0b97433f..1add73c0 100644 --- a/manifests/pe_metric.pp +++ b/manifests/pe_metric.pp @@ -10,6 +10,7 @@ String $metric_script_file = 'tk_metrics', Array[Hash] $additional_metrics = [], Boolean $ssl = true, + Boolean $use_splunk_hec = false, Optional[Puppet_metrics_collector::Metrics_server] $metrics_server_info = undef, Optional[String] $override_metrics_command = undef, ) { @@ -65,9 +66,10 @@ $metrics_command = $metrics_server_type ? { 'influxdb' => "${port_metrics_command} --influx-db ${metrics_server_db} > /dev/null", 'graphite' => "${port_metrics_command} > /dev/null", - 'splunk_hec' => "${port_metrics_command} | /opt/puppetlabs/bin/puppet splunk_hec --sourcetype puppet:metrics --pe_metrics > /dev/null", default => "${port_metrics_command} > /dev/null", } + } elsif $use_splunk_hec { + $metrics_command = "${metrics_base_command} | /opt/puppetlabs/bin/puppet splunk_hec --sourcetype puppet:metrics --pe_metrics > /dev/null" } else { $metrics_command = "${metrics_base_command} --no-print" } diff --git a/manifests/puppetdb.pp b/manifests/puppetdb.pp index ef0e774c..098f7841 100644 --- a/manifests/puppetdb.pp +++ b/manifests/puppetdb.pp @@ -4,13 +4,17 @@ String $metrics_ensure = $puppet_metrics_collector::puppetdb_metrics_ensure, Array[String] $hosts = $puppet_metrics_collector::puppetdb_hosts, Integer $port = $puppet_metrics_collector::puppetdb_port, + Boolean $use_splunk_hec = $::puppet_metrics_collector::use_splunk_hec, Optional[Puppet_metrics_collector::Metrics_server] $metrics_server_info = $::puppet_metrics_collector::metrics_server_info, + Optional[String] $override_metrics_command = $::puppet_metrics_collector::override_metrics_command, ) { Puppet_metrics_collector::Pe_metric { output_dir => $puppet_metrics_collector::output_dir, scripts_dir => $puppet_metrics_collector::scripts_dir, cron_minute => "*/${collection_frequency}", retention_days => $retention_days, + override_metrics_command => $override_metrics_command, + use_splunk_hec => $use_splunk_hec, } $activemq_metrics = [ diff --git a/manifests/puppetserver.pp b/manifests/puppetserver.pp index c81bdcef..8b65a3de 100644 --- a/manifests/puppetserver.pp +++ b/manifests/puppetserver.pp @@ -4,13 +4,17 @@ String $metrics_ensure = $puppet_metrics_collector::puppetserver_metrics_ensure, Array[String] $hosts = $puppet_metrics_collector::puppetserver_hosts, Integer $port = $puppet_metrics_collector::puppetserver_port, + Boolean $use_splunk_hec = $::puppet_metrics_collector::use_splunk_hec, Optional[Puppet_metrics_collector::Metrics_server] $metrics_server_info = $::puppet_metrics_collector::metrics_server_info, + Optional[String] $override_metrics_command = $::puppet_metrics_collector::override_metrics_command, ) { Puppet_metrics_collector::Pe_metric { output_dir => $puppet_metrics_collector::output_dir, scripts_dir => $puppet_metrics_collector::scripts_dir, cron_minute => "*/${collection_frequency}", retention_days => $retention_days, + override_metrics_command => $override_metrics_command, + use_splunk_hec => $use_splunk_hec, } if versioncmp($facts['pe_server_version'], '2018.1.0') < 0 { diff --git a/types/metrics_server.pp b/types/metrics_server.pp index 4d3d8078..c638f9ec 100644 --- a/types/metrics_server.pp +++ b/types/metrics_server.pp @@ -1,5 +1,5 @@ type Puppet_metrics_collector::Metrics_server = Struct[{ - metrics_server_type => Enum['influxdb','graphite', 'splunk_hec'], + metrics_server_type => Enum['influxdb','graphite'], hostname => String, port => Optional[Integer], db_name => Optional[String], From 3fce0ad34cc8d6eb152db9259be3b65d3fb4bea7 Mon Sep 17 00:00:00 2001 From: Helen Campbell Date: Mon, 8 Jul 2019 16:21:29 +0100 Subject: [PATCH 9/9] Dissolve metrics_server_info into params --- README.md | 42 +++++++++++++++++++-------------------- manifests/activemq.pp | 35 +++++++++++++++++--------------- manifests/init.pp | 8 +++++--- manifests/orchestrator.pp | 22 ++++++++++---------- manifests/pe_metric.pp | 32 +++++++++++++++-------------- manifests/puppetdb.pp | 34 +++++++++++++++++-------------- manifests/puppetserver.pp | 24 ++++++++++++---------- types/metrics_server.pp | 6 ------ 8 files changed, 107 insertions(+), 96 deletions(-) delete mode 100644 types/metrics_server.pp diff --git a/README.md b/README.md index 3ab5d141..92074cb6 100644 --- a/README.md +++ b/README.md @@ -57,38 +57,38 @@ Integer: How often to collect metrics, in minutes. Defaults to `5`. Integer: How long to retain collect metrics, in days. Defaults to `90`. -##### use_splunk_hec +##### Metrics Server Parameters -Boolean: Use the splunk_hec endpoint enabled by the puppetlabs/splunk_hec module. Defaults to `false`. +The following set of parameters begining with `metrics_server_` allows for the specification of a server type to use to generate and in some cases send data to a specified server. +Currently both `influxdb` and `graphite` types allow for the transfer of data while `splunk_hec` only generates the data. -This will require the module `splunk_hec` installed, which can be found here on the Forge [here](https://forge.puppet.com/puppetlabs/splunk_hec) or [here](https://github.com/puppetlabs/puppetlabs-splunk_hec) on github. +##### metrics_server_type + +Optional Enum['influxdb','graphite','splunk_hec']: specifies the metrics server type to write data to. Currently it supports `influxdb`, `graphite` and `splunk_hec` type servers. + +To Note: + +Please note that for `influxdb` server types a `dbname` must be provided. + +Please note that for a server type of `splunk_hec` no data can be sent to a server with the current configuration, however the command will format the json output using the `splunk_hec` module, which is a requirement for this option and can be found on the Forge [here](https://forge.puppet.com/puppetlabs/splunk_hec) or [here](https://github.com/puppetlabs/puppetlabs-splunk_hec) on github. Further setup instructions for using the `splunk_hec` module can be found within the modules own README.md. -##### metrics_server_info +##### metrics_server_hostname -Struct: - metrics_server_type => Enum['influxdb','graphite'], - hostname => String, - port => Optional[Integer], - db_name => Optional[String], +Optional String: Allows you to define the host name of a server to send data to. Defaults to undef. -Specifies a metrics server to write data to. Currently it supports `influxdb`and `graphite` type servers. The parameters `metrics_server_type` and `hostname` are both required, and `dbname` is required for a `metrics_server_type` of `influxdb`. +##### metrics_server_port -Example: -``` -Puppet_metrics_collector::Metrics_server{ 'collectmydataplease': - metrics_server_type => 'influxdb', - hostname => 'my.hostname.here', - port => 1234, - db_name => 'mycooldbname', -}] -``` +Optional Integer: Allows you to define the port number of a server to send data to. Defaults to undef. + +##### metrics_server_db_name + +Optional String: Allows you to define the database name of a server to send data to. Required for `metrics_server_type` of `influxdb`. Defaults to undef. ##### override_metrics_command -String: replace the crontab entry entirely for the metric command being used. Defaults to `undef` +Optional String: Allows you to override the command that is run to gather metrics. Defaults to undef. -If you are using this, you know what you're doing, and will probably have to set these for each class for the services being collected, and not use this top level param at all. ## Usage diff --git a/manifests/activemq.pp b/manifests/activemq.pp index db087e0a..63b18208 100644 --- a/manifests/activemq.pp +++ b/manifests/activemq.pp @@ -1,12 +1,14 @@ class puppet_metrics_collector::activemq ( - Integer $collection_frequency = $puppet_metrics_collector::collection_frequency, - Integer $retention_days = $puppet_metrics_collector::retention_days, - String $metrics_ensure = $puppet_metrics_collector::activemq_metrics_ensure, - Array[String] $hosts = $puppet_metrics_collector::activemq_hosts, - Integer $port = $puppet_metrics_collector::activemq_port, - Boolean $use_splunk_hec = $::puppet_metrics_collector::use_splunk_hec, - Optional[Puppet_metrics_collector::Metrics_server] $metrics_server_info = $::puppet_metrics_collector::metrics_server_info, - Optional[String] $override_metrics_command = $::puppet_metrics_collector::override_metrics_command, + Integer $collection_frequency = $puppet_metrics_collector::collection_frequency, + Integer $retention_days = $puppet_metrics_collector::retention_days, + String $metrics_ensure = $puppet_metrics_collector::activemq_metrics_ensure, + Array[String] $hosts = $puppet_metrics_collector::activemq_hosts, + Integer $port = $puppet_metrics_collector::activemq_port, + Optional[Enum['influxdb','graphite','splunk_hec']] $metrics_server_type = $puppet_metrics_collector::metrics_server_type, + Optional[String] $metrics_server_hostname = $puppet_metrics_collector::metrics_server_hostname, + Optional[Integer] $metrics_server_port = $puppet_metrics_collector::metrics_server_port, + Optional[String] $metrics_server_db_name = $puppet_metrics_collector::metrics_server_db_name, + Optional[String] $override_metrics_command = $puppet_metrics_collector::override_metrics_command, ) { $scripts_dir = $::puppet_metrics_collector::scripts_dir @@ -16,7 +18,6 @@ cron_minute => "*/${collection_frequency}", retention_days => $retention_days, override_metrics_command => $override_metrics_command, - use_splunk_hec => $use_splunk_hec, } $additional_metrics = [ @@ -64,12 +65,14 @@ } puppet_metrics_collector::pe_metric { 'activemq' : - metric_ensure => $metrics_ensure, - hosts => $hosts, - metrics_port => $port, - metric_script_file => 'amq_metrics', - additional_metrics => $additional_metrics, - use_splunk_hec => $use_splunk_hec, - metrics_server_info => $metrics_server_info, + metric_ensure => $metrics_ensure, + hosts => $hosts, + metrics_port => $port, + metric_script_file => 'amq_metrics', + additional_metrics => $additional_metrics, + metrics_server_type => $metrics_server_type, + metrics_server_hostname => $metrics_server_hostname, + metrics_server_port => $metrics_server_port, + metrics_server_db_name => $metrics_server_db_name, } } diff --git a/manifests/init.pp b/manifests/init.pp index 8da22bfc..a2dd0e48 100644 --- a/manifests/init.pp +++ b/manifests/init.pp @@ -15,9 +15,11 @@ Array[String] $activemq_hosts = puppet_metrics_collector::hosts_with_pe_profile('amq::broker'), Integer $activemq_port = 8161, Boolean $symlink_puppet_metrics_collector = true, - Boolean $use_splunk_hec = false, - Optional[Puppet_metrics_collector::Metrics_server] $metrics_server_info = undef, - Optional[String] $override_metrics_command = undef, + Optional[Enum['influxdb','graphite','splunk_hec']] $metrics_server_type = undef, + Optional[String] $metrics_server_hostname = undef, + Optional[Integer] $metrics_server_port = undef, + Optional[String] $metrics_server_db_name = undef, + Optional[String] $override_metrics_command = undef, ) { $scripts_dir = "${output_dir}/scripts" $bin_dir = "${output_dir}/bin" diff --git a/manifests/orchestrator.pp b/manifests/orchestrator.pp index a822fbaa..e78da8ac 100644 --- a/manifests/orchestrator.pp +++ b/manifests/orchestrator.pp @@ -4,23 +4,25 @@ String $metrics_ensure = $puppet_metrics_collector::orchestrator_metrics_ensure, Array[String] $hosts = $puppet_metrics_collector::orchestrator_hosts, Integer $port = $puppet_metrics_collector::orchestrator_port, - Boolean $use_splunk_hec = $::puppet_metrics_collector::use_splunk_hec, - Optional[Puppet_metrics_collector::Metrics_server] $metrics_server_info = $::puppet_metrics_collector::metrics_server_info, - Optional[String] $override_metrics_command = $::puppet_metrics_collector::override_metrics_command, -) { + Optional[Enum['influxdb','graphite','splunk_hec']] $metrics_server_type = $puppet_metrics_collector::metrics_server_type, + Optional[String] $metrics_server_hostname = $puppet_metrics_collector::metrics_server_hostname, + Optional[Integer] $metrics_server_port = $puppet_metrics_collector::metrics_server_port, + Optional[String] $metrics_server_db_name = $puppet_metrics_collector::metrics_server_db_name, + ) { Puppet_metrics_collector::Pe_metric { output_dir => $puppet_metrics_collector::output_dir, scripts_dir => $puppet_metrics_collector::scripts_dir, cron_minute => "*/${collection_frequency}", retention_days => $retention_days, - override_metrics_command => $override_metrics_command, - use_splunk_hec => $use_splunk_hec, } puppet_metrics_collector::pe_metric { 'orchestrator' : - metric_ensure => $metrics_ensure, - hosts => $hosts, - metrics_port => $port, - metrics_server_info => $metrics_server_info, + metric_ensure => $metrics_ensure, + hosts => $hosts, + metrics_port => $port, + metrics_server_type => $metrics_server_type, + metrics_server_hostname => $metrics_server_hostname, + metrics_server_port => $metrics_server_port, + metrics_server_db_name => $metrics_server_db_name, } } diff --git a/manifests/pe_metric.pp b/manifests/pe_metric.pp index 1add73c0..57b59586 100644 --- a/manifests/pe_metric.pp +++ b/manifests/pe_metric.pp @@ -10,8 +10,10 @@ String $metric_script_file = 'tk_metrics', Array[Hash] $additional_metrics = [], Boolean $ssl = true, - Boolean $use_splunk_hec = false, - Optional[Puppet_metrics_collector::Metrics_server] $metrics_server_info = undef, + Optional[Enum['influxdb','graphite','splunk_hec']] $metrics_server_type = undef, + Optional[String] $metrics_server_hostname = undef, + Optional[Integer] $metrics_server_port = undef, + Optional[String] $metrics_server_db_name = undef, Optional[String] $override_metrics_command = undef, ) { @@ -46,30 +48,30 @@ if empty($override_metrics_command){ $metrics_base_command = "${script_file_name} --metrics_type ${metrics_type} --output-dir ${metrics_output_dir}" - if !empty($metrics_server_info) { - $metrics_server_hostname = $metrics_server_info['hostname'] - $metrics_server_port = $metrics_server_info['port'] - $metrics_server_type = $metrics_server_info['metrics_server_type'] - $metrics_server_db = $metrics_server_info['db_name'] + if !empty($metrics_server_type) { + $server_hostname = $metrics_server_hostname + $server_port = $metrics_server_port + $server_type = $metrics_server_type + $server_db = $metrics_server_db_name - if empty($metrics_server_db) and $metrics_server_type == 'influxdb' { + if empty($server_db) and $server_type == 'influxdb' { fail( 'When using an influxdb server you must provide the db_name to store metrics in' ) } - $local_metrics_command = "${metrics_base_command} | ${conversion_script_file_name} --netcat ${metrics_server_hostname} --convert-to ${metrics_server_type}" + $local_metrics_command = "${metrics_base_command} | ${conversion_script_file_name} --netcat ${server_hostname} --convert-to ${server_type}" - $port_metrics_command = empty($metrics_server_port) ? { - false => "${local_metrics_command} --port ${metrics_server_port}", + $port_metrics_command = empty($server_port) ? { + false => "${local_metrics_command} --port ${server_port}", true => $local_metrics_command, } - $metrics_command = $metrics_server_type ? { - 'influxdb' => "${port_metrics_command} --influx-db ${metrics_server_db} > /dev/null", + $metrics_command = $server_type ? { + 'influxdb' => "${port_metrics_command} --influx-db ${server_db} > /dev/null", 'graphite' => "${port_metrics_command} > /dev/null", + # We use only the base metrics command for splunk_hec server type + 'splunk_hec' => "${metrics_base_command} | /opt/puppetlabs/bin/puppet splunk_hec --sourcetype puppet:metrics --pe_metrics > /dev/null", default => "${port_metrics_command} > /dev/null", } - } elsif $use_splunk_hec { - $metrics_command = "${metrics_base_command} | /opt/puppetlabs/bin/puppet splunk_hec --sourcetype puppet:metrics --pe_metrics > /dev/null" } else { $metrics_command = "${metrics_base_command} --no-print" } diff --git a/manifests/puppetdb.pp b/manifests/puppetdb.pp index 098f7841..0ef8c640 100644 --- a/manifests/puppetdb.pp +++ b/manifests/puppetdb.pp @@ -4,17 +4,18 @@ String $metrics_ensure = $puppet_metrics_collector::puppetdb_metrics_ensure, Array[String] $hosts = $puppet_metrics_collector::puppetdb_hosts, Integer $port = $puppet_metrics_collector::puppetdb_port, - Boolean $use_splunk_hec = $::puppet_metrics_collector::use_splunk_hec, - Optional[Puppet_metrics_collector::Metrics_server] $metrics_server_info = $::puppet_metrics_collector::metrics_server_info, - Optional[String] $override_metrics_command = $::puppet_metrics_collector::override_metrics_command, -) { + Optional[Enum['influxdb','graphite','splunk_hec']] $metrics_server_type = $puppet_metrics_collector::metrics_server_type, + Optional[String] $metrics_server_hostname = $puppet_metrics_collector::metrics_server_hostname, + Optional[Integer] $metrics_server_port = $puppet_metrics_collector::metrics_server_port, + Optional[String] $metrics_server_db_name = $puppet_metrics_collector::metrics_server_db_name, + Optional[String] $override_metrics_command = $puppet_metrics_collector::override_metrics_command, + ) { Puppet_metrics_collector::Pe_metric { - output_dir => $puppet_metrics_collector::output_dir, - scripts_dir => $puppet_metrics_collector::scripts_dir, - cron_minute => "*/${collection_frequency}", - retention_days => $retention_days, + output_dir => $puppet_metrics_collector::output_dir, + scripts_dir => $puppet_metrics_collector::scripts_dir, + cron_minute => "*/${collection_frequency}", + retention_days => $retention_days, override_metrics_command => $override_metrics_command, - use_splunk_hec => $use_splunk_hec, } $activemq_metrics = [ @@ -185,11 +186,14 @@ 'url' => 'puppetlabs.puppetdb.ha:name=record-transfer-duration' }, } puppet_metrics_collector::pe_metric { 'puppetdb' : - metric_ensure => $metrics_ensure, - hosts => $hosts, - metrics_port => $_port, - ssl => $_ssl, - additional_metrics => $additional_metrics, - metrics_server_info => $metrics_server_info, + metric_ensure => $metrics_ensure, + hosts => $hosts, + metrics_port => $_port, + ssl => $_ssl, + additional_metrics => $additional_metrics, + metrics_server_type => $metrics_server_type, + metrics_server_hostname => $metrics_server_hostname, + metrics_server_port => $metrics_server_port, + metrics_server_db_name => $metrics_server_db_name, } } diff --git a/manifests/puppetserver.pp b/manifests/puppetserver.pp index 8b65a3de..edf63756 100644 --- a/manifests/puppetserver.pp +++ b/manifests/puppetserver.pp @@ -4,17 +4,18 @@ String $metrics_ensure = $puppet_metrics_collector::puppetserver_metrics_ensure, Array[String] $hosts = $puppet_metrics_collector::puppetserver_hosts, Integer $port = $puppet_metrics_collector::puppetserver_port, - Boolean $use_splunk_hec = $::puppet_metrics_collector::use_splunk_hec, - Optional[Puppet_metrics_collector::Metrics_server] $metrics_server_info = $::puppet_metrics_collector::metrics_server_info, - Optional[String] $override_metrics_command = $::puppet_metrics_collector::override_metrics_command, -) { + Optional[Enum['influxdb','graphite','splunk_hec']] $metrics_server_type = $puppet_metrics_collector::metrics_server_type, + Optional[String] $metrics_server_hostname = $puppet_metrics_collector::metrics_server_hostname, + Optional[Integer] $metrics_server_port = $puppet_metrics_collector::metrics_server_port, + Optional[String] $metrics_server_db_name = $puppet_metrics_collector::metrics_server_db_name, + Optional[String] $override_metrics_command = $puppet_metrics_collector::override_metrics_command, + ) { Puppet_metrics_collector::Pe_metric { output_dir => $puppet_metrics_collector::output_dir, scripts_dir => $puppet_metrics_collector::scripts_dir, cron_minute => "*/${collection_frequency}", retention_days => $retention_days, override_metrics_command => $override_metrics_command, - use_splunk_hec => $use_splunk_hec, } if versioncmp($facts['pe_server_version'], '2018.1.0') < 0 { @@ -43,10 +44,13 @@ } puppet_metrics_collector::pe_metric { 'puppetserver' : - metric_ensure => $metrics_ensure, - hosts => $hosts, - metrics_port => $port, - additional_metrics => $additional_metrics, - metrics_server_info => $metrics_server_info, + metric_ensure => $metrics_ensure, + hosts => $hosts, + metrics_port => $port, + additional_metrics => $additional_metrics, + metrics_server_type => $metrics_server_type, + metrics_server_hostname => $metrics_server_hostname, + metrics_server_port => $metrics_server_port, + metrics_server_db_name => $metrics_server_db_name, } } diff --git a/types/metrics_server.pp b/types/metrics_server.pp deleted file mode 100644 index c638f9ec..00000000 --- a/types/metrics_server.pp +++ /dev/null @@ -1,6 +0,0 @@ -type Puppet_metrics_collector::Metrics_server = Struct[{ - metrics_server_type => Enum['influxdb','graphite'], - hostname => String, - port => Optional[Integer], - db_name => Optional[String], -}]