Skip to content

Commit 84d112c

Browse files
Merge pull request #94 from jarretlavallee/SUP_1969_system_metrics_shipping
(SUP-1969) Enable metrics shipping for all system types
2 parents 2477df7 + 84e826d commit 84d112c

File tree

16 files changed

+229
-66
lines changed

16 files changed

+229
-66
lines changed

files/psql_metrics

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,8 @@ EOS
513513
'Defaults to 10.'],
514514
['--output_dir DIR',
515515
'Write metrics to a timestamped file under DIR instead of',
516-
'printing to STDOUT']].freeze
516+
'printing to STDOUT'],
517+
['-p', '--[no-]print', 'Always print to STDOUT']].freeze
517518

518519
def initialize(argv = [])
519520
@action = :collect_data
@@ -573,7 +574,9 @@ EOS
573574
FileUtils.mkdir_p(host_dir) unless File.directory?(host_dir)
574575
output_file = File.join(host_dir, timestamp.strftime('%Y%m%dT%H%M%SZ') + '.json')
575576

576-
File.write(output_file, JSON.generate(data))
577+
output = JSON.generate(data)
578+
File.write(output_file, output)
579+
$stdout.puts(output) if @options[:print]
577580
else
578581
$stdout.puts(JSON.generate(data))
579582
end

files/system_metrics

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,14 @@ module SystemMetrics
5454
#
5555
# @return [void]
5656
def initialize(polling_interval, file_interval, metric_type, process_expression, metrics_dir,
57-
verbose = false)
57+
verbose = false, print_output = false)
5858
@polling_interval = polling_interval
5959
@file_interval = file_interval
6060
@metric_type = metric_type
6161
@process_expression = process_expression
6262
@metrics_dir = metrics_dir
6363
@verbose = verbose
64+
@print_output = print_output
6465

6566
@hostname = `hostname`.strip
6667
puts "Hostname is: #{@hostname}" if @verbose
@@ -398,6 +399,7 @@ module SystemMetrics
398399

399400
metrics_json = metrics_to_json(metrics_data)
400401

402+
STDOUT.puts(metrics_json) if @print_output
401403
write_metrics_to_file(metrics_json)
402404
end
403405
end
@@ -427,12 +429,13 @@ if $PROGRAM_NAME == __FILE__
427429
* process_expression (-e, --process_expression): #{PROCESS_EXPRESSION_DEFAULT}
428430
* metrics_dir (-m, --metrics_dir): #{METRICS_DIR_DEFAULT}
429431
* verbose (-v, --verbose): False
432+
* Print to STDOUT (--[no-]print): False
430433
DEFAULTS
431434

432435
options = {}
433436

434437
OptionParser.new { |opts|
435-
opts.banner = 'Usage: generate_system_stats.rb [options]'
438+
opts.banner = 'Usage: system_metrics [options]'
436439

437440
opts.on('-h', '--help', 'Display the help text') do
438441
puts DESCRIPTION
@@ -462,6 +465,7 @@ if $PROGRAM_NAME == __FILE__
462465
options[:metrics_dir] = metrics_dir
463466
end
464467
opts.on('-v', '--verbose', String, 'Enable Verbose output') { options[:verbose] = true }
468+
opts.on('--[no-]print', 'Print to STDOUT') { |p| options[:print] = p }
465469
}.parse!
466470

467471
if options[:metric_type]
@@ -478,6 +482,7 @@ if $PROGRAM_NAME == __FILE__
478482
process_expression = options[:process_expression] || PROCESS_EXPRESSION_DEFAULT
479483
metrics_dir = options[:metrics_dir] || METRICS_DIR_DEFAULT
480484
verbose = options[:verbose] || false
485+
print_output = options[:print] || false
481486

482487
if options[:polling_interval] || options[:file_interval]
483488
options_error = 'Polling interval must be less than file interval'
@@ -493,11 +498,12 @@ if $PROGRAM_NAME == __FILE__
493498
* process_expression #{process_expression}
494499
* metrics_dir: #{metrics_dir}
495500
* verbose: #{verbose}
501+
* print: #{print_output}
496502
SETTINGS
497503
puts OPTION_SETTINGS
498504
end
499505

500506
obj = SystemMetrics::GenerateSystemMetrics.new(polling_interval, file_interval, metric_type,
501-
process_expression, metrics_dir, verbose)
507+
process_expression, metrics_dir, verbose, print_output)
502508
obj.generate_metrics
503509
end

files/vmware_metrics

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,8 @@ module PuppetMetricsCollector
159159
'Defaults to 10.'],
160160
['--output_dir DIR',
161161
'Write metrics to a timestamed file under DIR instead of',
162-
'printing to STDOUT']].freeze
162+
'printing to STDOUT'],
163+
['-p', '--[no-]print', 'Always print to STDOUT']].freeze
163164

164165
def initialize(argv = [])
165166
@action = :collect_data
@@ -172,7 +173,7 @@ module PuppetMetricsCollector
172173
@action = :show_help
173174
end
174175

175-
parser.on_tail('--debug', 'Enable backtraces from errors.') do
176+
parser.on_tail('-d', '--debug', 'Enable backtraces from errors.') do
176177
@options[:debug] = true
177178
end
178179
end
@@ -208,7 +209,9 @@ module PuppetMetricsCollector
208209
FileUtils.mkdir_p(host_dir) unless File.directory?(host_dir)
209210
output_file = File.join(host_dir, Time.now.utc.strftime('%Y%m%dT%H%M%SZ') + '.json')
210211

211-
File.write(output_file, JSON.generate(data))
212+
output = JSON.generate(data)
213+
File.write(output_file, output)
214+
$stdout.puts(output) if @options[:print]
212215
else
213216
$stdout.puts(JSON.generate(data))
214217
end
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# @summary Generate the metrics shipping command for the cron job including remote metrics
2+
# @param scripts_dir the path to the scripts directory
3+
# @param metrics_server_type the metric server type
4+
# @param metrics_server_hostname the metric server's address
5+
# @param metrics_server_db_name the influxdb database name
6+
# @param metrics_server_port the port to connect to
7+
# @return [String] of the metrics command or undef
8+
function puppet_metrics_collector::generate_metrics_server_command (
9+
Optional[String] $scripts_dir,
10+
Optional[Enum['influxdb','graphite','splunk_hec']] $metrics_server_type = undef,
11+
Optional[String] $metrics_server_hostname = undef,
12+
Optional[String] $metrics_server_db_name = undef,
13+
Optional[Integer] $metrics_server_port = undef,
14+
) >> String {
15+
if !empty($metrics_server_type) {
16+
if empty($metrics_server_db_name) and $metrics_server_type == 'influxdb' {
17+
fail('When specifying an InfluxDB metrics server, you must specify a metrics server db_name')
18+
}
19+
20+
$port_command = empty($metrics_server_port) ? {
21+
false => "--port ${metrics_server_port}",
22+
true => undef,
23+
}
24+
25+
# We use only the base metrics command for the 'splunk_hec' metrics server type.
26+
27+
$metrics_shipping_command = $metrics_server_type ? {
28+
'influxdb' => ['--print |',
29+
"${scripts_dir}/json2timeseriesdb",
30+
"--netcat ${metrics_server_hostname}",
31+
"--convert-to ${metrics_server_type}",
32+
"--influx-db ${metrics_server_db_name}",
33+
$port_command,
34+
'-',
35+
].filter |$v| { $v != undef }.join(' '), # Filter out undef without stdlib
36+
'graphite' => join(['--print |',
37+
"${scripts_dir}/json2timeseriesdb",
38+
"--netcat ${metrics_server_hostname}",
39+
"--convert-to ${metrics_server_type}",
40+
'-',
41+
], ' '),
42+
'splunk_hec' => join(['--print |',
43+
'/opt/puppetlabs/bin/puppet',
44+
'splunk_hec',
45+
'--sourcetype puppet:metrics',
46+
'--pe_metrics',
47+
], ' '),
48+
default => '',
49+
}
50+
} else {
51+
$metrics_shipping_command = ''
52+
}
53+
}

manifests/pe_metric.pp

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -62,44 +62,25 @@
6262
}
6363

6464
$metric_script_file_path = "${puppet_metrics_collector::scripts_dir}/${metric_script_file}"
65-
$conversion_script_file_path = "${puppet_metrics_collector::scripts_dir}/json2timeseriesdb"
6665

67-
# lint:ignore:140chars
6866
if empty($override_metrics_command) {
6967
$base_metrics_command = "${metric_script_file_path} --metrics_type ${metrics_type} --output_dir ${metrics_output_dir}"
68+
$metrics_shipping_command = puppet_metrics_collector::generate_metrics_server_command(
69+
$puppet_metrics_collector::scripts_dir,
70+
$metrics_server_type,
71+
$metrics_server_hostname,
72+
$metrics_server_db_name,
73+
$metrics_server_port
74+
)
7075

7176
if !empty($metrics_server_type) {
72-
$server_hostname = $metrics_server_hostname
73-
$server_port = $metrics_server_port
74-
$server_type = $metrics_server_type
75-
$server_db = $metrics_server_db_name
76-
77-
if empty($server_db) and $server_type == 'influxdb' {
78-
fail('When specifying an InfluxDB metrics server, you must specify a metrics server db_name')
79-
}
80-
81-
$conv_metrics_command = "${base_metrics_command} | ${conversion_script_file_path} --netcat ${server_hostname} --convert-to ${server_type} -"
82-
83-
$full_metrics_command = empty($server_port) ? {
84-
false => "${conv_metrics_command} --port ${server_port}",
85-
true => $conv_metrics_command,
86-
}
87-
88-
# We use only the base metrics command for the 'splunk_hec' metrics server type.
89-
90-
$metrics_command = $server_type ? {
91-
'influxdb' => "${full_metrics_command} --influx-db ${server_db} > /dev/null",
92-
'graphite' => "${full_metrics_command} > /dev/null",
93-
'splunk_hec' => "${base_metrics_command} | /opt/puppetlabs/bin/puppet splunk_hec --sourcetype puppet:metrics --pe_metrics > /dev/null",
94-
default => "${full_metrics_command} > /dev/null",
95-
}
77+
$metrics_command = "${base_metrics_command} ${metrics_shipping_command} > /dev/null"
9678
} else {
9779
$metrics_command = "${base_metrics_command} --no-print"
9880
}
9981
} else {
10082
$metrics_command = $override_metrics_command
10183
}
102-
# lint:endignore
10384

10485
$tidy_command = "${puppet_metrics_collector::scripts_dir}/metrics_tidy -d ${metrics_output_dir} -r ${retention_days}"
10586

manifests/sar_metric.pp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
Integer $collection_frequency = 5, # minutes
88
Integer $polling_frequency_seconds = 1,
99
String $metric_script_file = 'system_metrics',
10+
String $metrics_shipping_command = $puppet_metrics_collector::system::metrics_shipping_command,
1011
) {
1112

1213
$metrics_output_dir = "${puppet_metrics_collector::system::output_dir}/${metrics_type}"
@@ -25,13 +26,14 @@
2526
$metric_script_file_path = "${puppet_metrics_collector::system::scripts_dir}/${metric_script_file}"
2627
$file_interval_seconds = $collection_frequency * 60
2728

28-
$metrics_command = join([$metric_script_file_path,
29-
" --metric_type ${metrics_type}",
30-
" --file_interval ${file_interval_seconds}",
31-
" --polling_interval ${polling_frequency_seconds}",
32-
" --metrics_dir ${puppet_metrics_collector::system::output_dir}",
33-
' > /dev/null',
34-
], '')
29+
$base_metrics_command = join([$metric_script_file_path,
30+
"--metric_type ${metrics_type}",
31+
"--file_interval ${file_interval_seconds}",
32+
"--polling_interval ${polling_frequency_seconds}",
33+
"--metrics_dir ${puppet_metrics_collector::system::output_dir}",
34+
], ' ')
35+
36+
$metrics_command = "${base_metrics_command} ${metrics_shipping_command} > /dev/null"
3537

3638
# The hardcoded numbers with the fqdn_rand calls are to trigger the metrics_tidy
3739
# command to run at a randomly selected time between 12:00 AM and 3:00 AM.

manifests/service/ace.pp

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,18 @@
1414
Optional[String] $metrics_server_db_name = $puppet_metrics_collector::metrics_server_db_name,
1515
) {
1616
puppet_metrics_collector::pe_metric { 'ace' :
17-
metric_ensure => $metrics_ensure,
18-
cron_minute => "0/${collection_frequency}",
19-
retention_days => $retention_days,
20-
hosts => $hosts,
21-
metrics_port => $port,
22-
additional_metrics => $extra_metrics,
23-
metric_script_file => 'puma_metrics',
24-
metrics_server_type => $metrics_server_type,
25-
metrics_server_hostname => $metrics_server_hostname,
26-
metrics_server_port => $metrics_server_port,
27-
metrics_server_db_name => $metrics_server_db_name,
28-
excludes => $excludes,
17+
metric_ensure => $metrics_ensure,
18+
cron_minute => "0/${collection_frequency}",
19+
retention_days => $retention_days,
20+
hosts => $hosts,
21+
metrics_port => $port,
22+
additional_metrics => $extra_metrics,
23+
metric_script_file => 'puma_metrics',
24+
override_metrics_command => $override_metrics_command,
25+
metrics_server_type => $metrics_server_type,
26+
metrics_server_hostname => $metrics_server_hostname,
27+
metrics_server_port => $metrics_server_port,
28+
metrics_server_db_name => $metrics_server_db_name,
29+
excludes => $excludes,
2930
}
3031
}

manifests/service/bolt.pp

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,18 @@
1414
Optional[String] $metrics_server_db_name = $puppet_metrics_collector::metrics_server_db_name,
1515
) {
1616
puppet_metrics_collector::pe_metric { 'bolt' :
17-
metric_ensure => $metrics_ensure,
18-
cron_minute => "0/${collection_frequency}",
19-
retention_days => $retention_days,
20-
hosts => $hosts,
21-
metrics_port => $port,
22-
additional_metrics => $extra_metrics,
23-
metric_script_file => 'puma_metrics',
24-
metrics_server_type => $metrics_server_type,
25-
metrics_server_hostname => $metrics_server_hostname,
26-
metrics_server_port => $metrics_server_port,
27-
metrics_server_db_name => $metrics_server_db_name,
28-
excludes => $excludes,
17+
metric_ensure => $metrics_ensure,
18+
cron_minute => "0/${collection_frequency}",
19+
retention_days => $retention_days,
20+
hosts => $hosts,
21+
metrics_port => $port,
22+
additional_metrics => $extra_metrics,
23+
metric_script_file => 'puma_metrics',
24+
override_metrics_command => $override_metrics_command,
25+
metrics_server_type => $metrics_server_type,
26+
metrics_server_hostname => $metrics_server_hostname,
27+
metrics_server_port => $metrics_server_port,
28+
metrics_server_db_name => $metrics_server_db_name,
29+
excludes => $excludes,
2930
}
3031
}

manifests/system.pp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88
Boolean $manage_sysstat = false,
99
Boolean $manage_vmware_tools = false,
1010
String $vmware_tools_pkg = 'open-vm-tools',
11+
Optional[Enum['influxdb', 'graphite', 'splunk_hec']] $metrics_server_type = getvar('puppet_metrics_collector::metrics_server_type'),
12+
Optional[String] $metrics_server_hostname = getvar('puppet_metrics_collector::metrics_server_hostname'),
13+
Optional[Integer] $metrics_server_port = getvar('puppet_metrics_collector::metrics_server_port'),
14+
Optional[String] $metrics_server_db_name = getvar('puppet_metrics_collector::metrics_server_db_name'),
1115
) {
1216
$scripts_dir = "${output_dir}/scripts"
1317

@@ -38,6 +42,14 @@
3842
refreshonly => true,
3943
}
4044

45+
$metrics_shipping_command = puppet_metrics_collector::generate_metrics_server_command(
46+
$scripts_dir,
47+
$metrics_server_type,
48+
$metrics_server_hostname,
49+
$metrics_server_db_name,
50+
$metrics_server_port
51+
)
52+
4153
if $manage_sysstat {
4254
package { 'sysstat':
4355
ensure => $system_metrics_ensure,

manifests/system/cpu.pp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
Integer $collection_frequency = $puppet_metrics_collector::system::collection_frequency,
55
Integer $retention_days = $puppet_metrics_collector::system::retention_days,
66
Integer $polling_frequency_seconds = $puppet_metrics_collector::system::polling_frequency_seconds,
7+
Optional[String] $metrics_shipping_command = undef,
78
) {
89
puppet_metrics_collector::sar_metric { 'system_cpu' :
910
metric_ensure => $metrics_ensure,
1011
cron_minute => "0/${collection_frequency}",
1112
retention_days => $retention_days,
1213
collection_frequency => $collection_frequency,
1314
polling_frequency_seconds => $polling_frequency_seconds,
15+
metrics_shipping_command => $metrics_shipping_command,
1416
}
1517
}

0 commit comments

Comments
 (0)