diff --git a/README.md b/README.md index 008f184aa..06ba0236a 100644 --- a/README.md +++ b/README.md @@ -649,6 +649,8 @@ class { 'collectd::plugin::postgresql': ####Class: `collectd::plugin::processes` +You can either specify processes / process matches at once: + ```puppet class { 'collectd::plugin::processes': processes => ['process1', 'process2'], @@ -671,6 +673,17 @@ class { 'collectd::plugin::protocols': } ``` +Or define single processes / process matches: +```puppet +collectd::plugin::processes::process { 'collectd' : } +``` + +```puppet +collectd::plugin::processes::processmatch { 'elasticsearch' : + regex => '.*java.*org.elasticsearch.bootstrap.Elasticsearch' +} +``` + ####Class: `collectd::plugin::python` * `modulepaths` is an array of paths where will be Collectd looking for Python modules, Puppet will ensure that each of specified directories exists and it is owned by `root` (and `chmod 0750`). If you don't specify any `modulepaths` a default value for given distribution will be used. diff --git a/lib/puppet/parser/functions/collectd_convert_processmatch.rb b/lib/puppet/parser/functions/collectd_convert_processmatch.rb new file mode 100644 index 000000000..76dda7e3b --- /dev/null +++ b/lib/puppet/parser/functions/collectd_convert_processmatch.rb @@ -0,0 +1,32 @@ +module Puppet::Parser::Functions + + newfunction(:collectd_convert_processmatch, :type => :rvalue, :arity => 1, :doc => <<-ENDDOC + Converts the array from the old style to define process matches in the + processes plugin into a create_resources compatible hash which + can be used with the new style define. + + Example: + [ { 'name' => 'foo', 'regex' => '.*' } , { 'name' => 'bar', 'regex' => '[0-9]+' } ] + will be converted to + { 'foo' => { 'regex' => '.*' } , 'bar' => { 'regex' => '[0-9]+' } } + ENDDOC + ) do |args| + if args.size != 1 then + raise(Puppet::ParseError, "convert_process_match_array(): Needs exactly one argument") + end + + parray = args[0] + unless parray.is_a?(Array) + raise(Puppet::ParseError, "convert_process_match_array(): Needs an array as argument") + end + + phash = Hash.new + + parray.each do |p| + phash[p['name']] = { 'regex' => p['regex'] } + end + + return phash + end +end + diff --git a/manifests/plugin/processes.pp b/manifests/plugin/processes.pp index 113d6e69a..9241f2bb6 100644 --- a/manifests/plugin/processes.pp +++ b/manifests/plugin/processes.pp @@ -1,6 +1,7 @@ # See http://collectd.org/documentation/manpages/collectd.conf.5.shtml#plugin_processes class collectd::plugin::processes ( $ensure = present, + $order = 10, $interval = undef, $processes = undef, $process_matches = undef, @@ -8,9 +9,47 @@ if $processes { validate_array($processes) } if $process_matches { validate_array($process_matches) } + include collectd::params + collectd::plugin {'processes': ensure => $ensure, - content => template('collectd/plugin/processes.conf.erb'), + order => $order, interval => $interval, } + + concat{"${collectd::params::plugin_conf_dir}/processes-config.conf": + ensure => $ensure, + mode => '0640', + owner => 'root', + group => $collectd::params::root_group, + notify => Service['collectd'], + ensure_newline => true, + } + concat::fragment{'collectd_plugin_processes_conf_header': + ensure => $ensure, + order => '00', + content => '', + target => "${collectd::params::plugin_conf_dir}/processes-config.conf", + } + concat::fragment{'collectd_plugin_processes_conf_footer': + ensure => $ensure, + order => '99', + content => '', + target => "${collectd::params::plugin_conf_dir}/processes-config.conf", + } + + + if $processes { + collectd::plugin::processes::process { $processes : } + } + if $process_matches { + $process_matches_resources = collectd_convert_processmatch($process_matches) + $defaults = { 'ensure' => $ensure } + create_resources( + collectd::plugin::processes::processmatch, + $process_matches_resources, + $defaults + ) + } + } diff --git a/manifests/plugin/processes/process.pp b/manifests/plugin/processes/process.pp new file mode 100644 index 000000000..f2cac9035 --- /dev/null +++ b/manifests/plugin/processes/process.pp @@ -0,0 +1,16 @@ +define collectd::plugin::processes::process ( + $process = $name, + $ensure = 'present' +){ + + include collectd::plugin::processes + include collectd::params + + concat::fragment{"collectd_plugin_processes_conf_process_${process}": + ensure => $ensure, + order => '50', + content => "Process \"${process}\"\n", + target => "${collectd::params::plugin_conf_dir}/processes-config.conf" + } + +} diff --git a/manifests/plugin/processes/processmatch.pp b/manifests/plugin/processes/processmatch.pp new file mode 100644 index 000000000..d524091ea --- /dev/null +++ b/manifests/plugin/processes/processmatch.pp @@ -0,0 +1,17 @@ +define collectd::plugin::processes::processmatch ( + $regex, + $ensure = 'present', + $matchname = $name +){ + + include collectd::plugin::processes + include collectd::params + + concat::fragment{"collectd_plugin_processes_conf_processmatch_${matchname}": + ensure => $ensure, + order => '51', + content => "ProcessMatch \"${matchname}\" \"${regex}\"\n", + target => "${collectd::params::plugin_conf_dir}/processes-config.conf" + } + +} diff --git a/spec/classes/collectd_plugin_processes_spec.rb b/spec/classes/collectd_plugin_processes_spec.rb index 74ffff7cf..31fc8ecbf 100644 --- a/spec/classes/collectd_plugin_processes_spec.rb +++ b/spec/classes/collectd_plugin_processes_spec.rb @@ -2,49 +2,44 @@ describe 'collectd::plugin::processes', :type => :class do let :facts do - {:osfamily => 'RedHat'} + { + :osfamily => 'Debian', + :concat_basedir => tmpfilename('collectd-processes'), + :id => 'root', + :kernel => 'Linux', + :path => '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin', + :collectd_version => '5.0' + } end - context ':ensure => present, default params' do - it 'Will create /etc/collectd.d/10-processes.conf' do - should contain_file('processes.load').with({ - :ensure => 'present', - :path => '/etc/collectd.d/10-processes.conf', - :content => //, - }) - end - end + context ':ensure => present' do + context ':ensure => present and default parameters' do - context ':ensure => present, specific params' do - let :params do - { :processes => [ 'process1'], - :process_matches => [ - { 'name' => 'process-all', - 'regex' => 'process[0-9]' } - ], - } - end + it 'Will create /etc/collectd/conf.d/10-processes.conf to load the plugin' do + should contain_file('processes.load').with({ + :ensure => 'present', + :path => '/etc/collectd/conf.d/10-processes.conf', + :content => /LoadPlugin processes/, + }) + end - it 'Will create /etc/collectd.d/10-processes.conf' do - should contain_file('processes.load').with({ - :ensure => 'present', - :path => '/etc/collectd.d/10-processes.conf', - :content => /\n\s*Process "process1"\n\s*ProcessMatch "process-all" "process\[0-9\]"\n<\/Plugin>/, - }) - end - end + it 'Will create /etc/collectd.d/conf.d/processes-config.conf' do + should contain_concat__fragment('collectd_plugin_processes_conf_header').with({ + :content => //, + :target => '/etc/collectd/conf.d/processes-config.conf', + :order => '00' + }) + end - context ':ensure => absent' do - let :params do - {:ensure => 'absent'} + it 'Will create /etc/collectd.d/conf.d/processes-config.conf' do + should contain_concat__fragment('collectd_plugin_processes_conf_footer').with({ + :content => /<\/Plugin>/, + :target => '/etc/collectd/conf.d/processes-config.conf', + :order => '99' + }) + end end - it 'Will not create /etc/collectd.d/10-processes.conf' do - should contain_file('processes.load').with({ - :ensure => 'absent', - :path => '/etc/collectd.d/10-processes.conf', - }) - end end end diff --git a/templates/plugin/processes.conf.erb b/templates/plugin/processes.conf.erb deleted file mode 100644 index b25c80470..000000000 --- a/templates/plugin/processes.conf.erb +++ /dev/null @@ -1,22 +0,0 @@ -<% if @processes or @process_matches -%> - -<% -if @processes - @processes.each do |process| --%> - Process "<%= process %>" -<% - end -end --%> -<% -if @process_matches - @process_matches.each do |match| --%> - ProcessMatch "<%= match['name'] %>" "<%= match['regex'] %>" -<% - end -end --%> - -<% end -%>