diff --git a/lib/backstop/collectd/parser.rb b/lib/backstop/collectd/parser.rb index daed805..be56b3c 100644 --- a/lib/backstop/collectd/parser.rb +++ b/lib/backstop/collectd/parser.rb @@ -37,11 +37,10 @@ def parse_base def parse_plugin plugin = data['plugin'] method = "parse_plugin_#{plugin}".to_sym - if self.respond_to? method - send(method) - else - [] + unless self.respond_to? method + method = :parse_plugin_generic end + send(method) end end diff --git a/lib/backstop/collectd/plugins/generic.rb b/lib/backstop/collectd/plugins/generic.rb new file mode 100644 index 0000000..0c23db4 --- /dev/null +++ b/lib/backstop/collectd/plugins/generic.rb @@ -0,0 +1,8 @@ +class CollectdData + # disk partition stats + def parse_plugin_generic + [ + { metric: "#{data['type']}.#{data['type_instance']}", value: data['values'][0] }, + ] + end +end diff --git a/spec/backstop/generic_collectd_data.json b/spec/backstop/generic_collectd_data.json new file mode 100644 index 0000000..cec2d43 --- /dev/null +++ b/spec/backstop/generic_collectd_data.json @@ -0,0 +1,14 @@ +[ + { + "values":[42], + "dstypes":["derive"], + "dsnames":["value"], + "time":1423949215.334, + "interval":10.0, + "host":"leeloo.octo.it", + "plugin":"irq", + "plugin_instance":"", + "type":"irq", + "type_instance":"IWI" + } +] diff --git a/spec/backstop/web_spec.rb b/spec/backstop/web_spec.rb index dffbcba..8e32de8 100644 --- a/spec/backstop/web_spec.rb +++ b/spec/backstop/web_spec.rb @@ -49,6 +49,7 @@ def app context 'POST /collectd' do let(:good_collectd_data) { File.open(File.dirname(__FILE__) + '/good_collectd_data.json').read } let(:bad_collectd_data) { File.open(File.dirname(__FILE__) + '/bad_collectd_data.json').read } + let(:generic_collectd_data) { File.open(File.dirname(__FILE__) + '/generic_collectd_data.json').read } it 'should require JSON' do post '/collectd', 'foo' @@ -70,6 +71,15 @@ def app last_response.status.should eq(400) last_response.body.should eq('missing fields') end + + it 'should handle a generic collectd metric' do + p = double('publisher') + Backstop::Publisher.should_receive(:new) { p } + p.should_receive(:publish).with('mitt.leeloo.octo.it.irq.IWI', 42, 1423949215.334) + post '/collectd', generic_collectd_data + last_response.body.should eq('ok') + last_response.status.should eq(200) + end end context 'POST /github' do