fluent-plugin-collectd-influxdb 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ChangeLog +3 -0
- data/Gemfile +3 -0
- data/README.md +52 -0
- data/Rakefile +12 -0
- data/VERSION +1 -0
- data/fluent-plugin-collectd-influxdb.gemspec +22 -0
- data/lib/fluent/plugin/out_collectd_influxdb.rb +38 -0
- data/test/out_collectd_influxdb.rb +75 -0
- metadata +87 -0
data/ChangeLog
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
# Output filter plugin Output filter plugin to rewrite Collectd JSON output to be inserted into InfluxDB
|
2
|
+
|
3
|
+
Rewrites the message coming from Collectd to make it compatible with the way InfluxDB stores data in series.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Use RubyGems:
|
8
|
+
|
9
|
+
gem install fluent-plugin-collectd-influxdb
|
10
|
+
|
11
|
+
## Configuration
|
12
|
+
|
13
|
+
<match pattern>
|
14
|
+
type collectd_influxdb
|
15
|
+
</match>
|
16
|
+
|
17
|
+
If following record is passed:
|
18
|
+
|
19
|
+
```js
|
20
|
+
[{"time" => 1000, "host" => 'host_v', "interval" => 5, "plugin" => 'plugin_v', "plugin_instance" => 'plugin_instance_v', "type" => 'type_v', "type_instance" => 'type_instance_v', "values" => ['v1', 'v2'], "dsnames" => ['n1', 'n2'], "dstypes" => ['t1', 't2']}]
|
21
|
+
```
|
22
|
+
|
23
|
+
then you got new record like below:
|
24
|
+
|
25
|
+
```js
|
26
|
+
[{"n1"=>"v1", "n2"=>"v2"}]
|
27
|
+
```
|
28
|
+
|
29
|
+
and the record tag will be changed to
|
30
|
+
|
31
|
+
```js
|
32
|
+
host_v.plugin_v.plugin_instance_v.type_v.type_instance_v
|
33
|
+
```
|
34
|
+
|
35
|
+
Empty values in "plugin", "plugin_instance", "type" or "type_instance" will not be copied into the new tag name
|
36
|
+
|
37
|
+
|
38
|
+
## WARNING
|
39
|
+
|
40
|
+
* This plugin was written to deal with a specific use-case, might not be the best fit for everyone. If you need more configurability/features, create a PR
|
41
|
+
|
42
|
+
|
43
|
+
## Copyright
|
44
|
+
|
45
|
+
<table>
|
46
|
+
<tr>
|
47
|
+
<td>Author</td><td>Giuseppe Iannello <giuseppe.iannello@brokenloop.net></td>
|
48
|
+
</tr>
|
49
|
+
<tr>
|
50
|
+
<td>License</td><td>MIT License</td>
|
51
|
+
</tr>
|
52
|
+
</table>
|
data/Rakefile
ADDED
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
$:.push File.expand_path('../lib', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.name = "fluent-plugin-collectd-influxdb"
|
6
|
+
gem.description = "Output filter plugin to rewrite Collectd JSON output to be inserted into InfluxDB"
|
7
|
+
gem.homepage = "https://github.com/giannello/fluent-plugin-collectd-influxdb"
|
8
|
+
gem.summary = gem.description
|
9
|
+
gem.version = File.read("VERSION").strip
|
10
|
+
gem.authors = ["Giuseppe Iannello"]
|
11
|
+
gem.email = "giuseppe.iannello@brokenloop.net"
|
12
|
+
gem.has_rdoc = false
|
13
|
+
#gem.platform = Gem::Platform::RUBY
|
14
|
+
gem.license = 'MIT'
|
15
|
+
gem.files = `git ls-files`.split("\n")
|
16
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
|
+
gem.require_paths = ['lib']
|
19
|
+
|
20
|
+
gem.add_dependency "fluentd", "~> 0.10.17"
|
21
|
+
gem.add_development_dependency "rake", ">= 0.9.2"
|
22
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Fluent
|
2
|
+
class CollectdInfluxdbOutput < Output
|
3
|
+
Fluent::Plugin.register_output('collectd_influxdb', self)
|
4
|
+
|
5
|
+
def configure(conf)
|
6
|
+
super
|
7
|
+
end
|
8
|
+
|
9
|
+
def emit(tag, es, chain)
|
10
|
+
es.each { |time, record|
|
11
|
+
record.each { |event|
|
12
|
+
Engine.emit(rewrite_tag(tag, event), event['time'], normalize_record(event))
|
13
|
+
}
|
14
|
+
}
|
15
|
+
|
16
|
+
chain.next
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def rewrite_tag(tag, event)
|
22
|
+
@tags = [tag, event['host'].gsub(".","/"), event['plugin'], event['plugin_instance'], event['type'], event['type_instance']]
|
23
|
+
tag = @tags.join(".").squeeze(".").gsub(/\.$/, '')
|
24
|
+
tag
|
25
|
+
end
|
26
|
+
|
27
|
+
def normalize_record(record)
|
28
|
+
record['values'].each_with_index { |value, index|
|
29
|
+
record[record['dsnames'][index]] = value
|
30
|
+
}
|
31
|
+
keys = ['time', 'host', 'interval', 'plugin', 'plugin_instance', 'type', 'type_instance', 'values', 'dsnames', 'dstypes']
|
32
|
+
keys.each { |key|
|
33
|
+
record.delete(key)
|
34
|
+
}
|
35
|
+
record
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'fluent/test'
|
2
|
+
require 'fluent/plugin/out_collectd_influxdb'
|
3
|
+
|
4
|
+
|
5
|
+
class CollectdInfluxdbOutputTest < Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
Fluent::Test.setup
|
8
|
+
end
|
9
|
+
|
10
|
+
CONFIG = %[
|
11
|
+
type collectd_influxdb
|
12
|
+
tag foo.filtered
|
13
|
+
]
|
14
|
+
|
15
|
+
def create_driver(conf = CONFIG)
|
16
|
+
Fluent::Test::OutputTestDriver.new(Fluent::CollectdInfluxdbOutput, tag='test_tag').configure(conf)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_rewrite_tag
|
20
|
+
d = create_driver %[
|
21
|
+
type collectd_influxdb
|
22
|
+
]
|
23
|
+
|
24
|
+
d.run do
|
25
|
+
d.emit([{
|
26
|
+
"time" => 1000, "host" => 'host', "interval" => 5,
|
27
|
+
"plugin" => 'plugin', "plugin_instance" => 'plugin_instance',
|
28
|
+
"type" => 'type', "type_instance" => 'type_instance',
|
29
|
+
"values" => ['v1', 'v2'], "dsnames" => ['n1', 'n2'], "dstypes" => ['t1', 't2']
|
30
|
+
}])
|
31
|
+
d.emit([{
|
32
|
+
"time" => 1000, "host" => 'host', "interval" => 5,
|
33
|
+
"plugin" => 'plugin', "plugin_instance" => '',
|
34
|
+
"type" => 'type', "type_instance" => 'type_instance',
|
35
|
+
"values" => ['v1', 'v2'], "dsnames" => ['n1', 'n2'], "dstypes" => ['t1', 't2']
|
36
|
+
}])
|
37
|
+
d.emit([{
|
38
|
+
"time" => 1000, "host" => 'host', "interval" => 5,
|
39
|
+
"plugin" => 'plugin', "plugin_instance" => 'plugin_instance',
|
40
|
+
"type" => '', "type_instance" => 'type_instance',
|
41
|
+
"values" => ['v1', 'v2'], "dsnames" => ['n1', 'n2'], "dstypes" => ['t1', 't2']
|
42
|
+
}])
|
43
|
+
d.emit([{
|
44
|
+
"time" => 1000, "host" => 'host', "interval" => 5,
|
45
|
+
"plugin" => 'plugin', "plugin_instance" => 'plugin_instance',
|
46
|
+
"type" => 'type', "type_instance" => '',
|
47
|
+
"values" => ['v1', 'v2'], "dsnames" => ['n1', 'n2'], "dstypes" => ['t1', 't2']
|
48
|
+
}])
|
49
|
+
end
|
50
|
+
|
51
|
+
assert_equal 4, d.emits.length
|
52
|
+
assert_equal "test_tag.host.plugin.plugin_instance.type.type_instance", d.emits[0][0]
|
53
|
+
assert_equal "test_tag.host.plugin.type.type_instance", d.emits[1][0]
|
54
|
+
assert_equal "test_tag.host.plugin.plugin_instance.type_instance", d.emits[2][0]
|
55
|
+
assert_equal "test_tag.host.plugin.plugin_instance.type", d.emits[3][0]
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_normalize_record
|
59
|
+
d = create_driver %[
|
60
|
+
type collectd_influxdb
|
61
|
+
]
|
62
|
+
|
63
|
+
d.run do
|
64
|
+
d.emit([{
|
65
|
+
"time" => 1000, "host" => 'v', "interval" => 5,
|
66
|
+
"plugin" => 'v', "plugin_instance" => 'v',
|
67
|
+
"type" => 'v', "type_instance" => 'v',
|
68
|
+
"values" => ['v1', 'v2'], "dsnames" => ['n1', 'n2'], "dstypes" => ['t1', 't2']
|
69
|
+
}])
|
70
|
+
end
|
71
|
+
|
72
|
+
assert_equal [{"n1"=>"v1", "n2"=>"v2"}], d.records
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
metadata
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fluent-plugin-collectd-influxdb
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Giuseppe Iannello
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-10-10 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: fluentd
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.10.17
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.10.17
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 0.9.2
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 0.9.2
|
46
|
+
description: Output filter plugin to rewrite Collectd JSON output to be inserted into
|
47
|
+
InfluxDB
|
48
|
+
email: giuseppe.iannello@brokenloop.net
|
49
|
+
executables: []
|
50
|
+
extensions: []
|
51
|
+
extra_rdoc_files: []
|
52
|
+
files:
|
53
|
+
- ChangeLog
|
54
|
+
- Gemfile
|
55
|
+
- README.md
|
56
|
+
- Rakefile
|
57
|
+
- VERSION
|
58
|
+
- fluent-plugin-collectd-influxdb.gemspec
|
59
|
+
- lib/fluent/plugin/out_collectd_influxdb.rb
|
60
|
+
- test/out_collectd_influxdb.rb
|
61
|
+
homepage: https://github.com/giannello/fluent-plugin-collectd-influxdb
|
62
|
+
licenses:
|
63
|
+
- MIT
|
64
|
+
post_install_message:
|
65
|
+
rdoc_options: []
|
66
|
+
require_paths:
|
67
|
+
- lib
|
68
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
71
|
+
- - ! '>='
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '0'
|
74
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
76
|
+
requirements:
|
77
|
+
- - ! '>='
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
80
|
+
requirements: []
|
81
|
+
rubyforge_project:
|
82
|
+
rubygems_version: 1.8.23
|
83
|
+
signing_key:
|
84
|
+
specification_version: 3
|
85
|
+
summary: Output filter plugin to rewrite Collectd JSON output to be inserted into
|
86
|
+
InfluxDB
|
87
|
+
test_files: []
|