fluent-plugin-mesosphere-filter 0.1.12 → 0.2.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.
- checksums.yaml +4 -4
- data/fluent-plugin-mesosphere-filter.gemspec +2 -2
- data/lib/fluent/plugin/filter_mesosphere_filter.rb +8 -7
- data/test/helper.rb +1 -0
- data/test/plugin/test_mesosphere.rb +57 -57
- metadata +11 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 24d1d9b79acd0a65968939fb9eeec29ca5d19776
|
4
|
+
data.tar.gz: 19d866f268e7d0ccb6dd563214d8e0ed91f6fb56
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bcc0c3e95aa0814ed5fa62ec1016c75dcfd11078a95a02102579f90b5a24dca60117f1640defec263de078091c758f8b82c551a7692322944e2dfd863ac5257f
|
7
|
+
data.tar.gz: b96ea2cab68e0a5d2d70294ac7020381150508d67adfd736fcde5c77c284b4a15dc7887667a670f8a370157924467c12f2fe7627296fa6fd8d5c04738aead51b
|
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |gem|
|
6
6
|
gem.name = 'fluent-plugin-mesosphere-filter'
|
7
|
-
gem.version = '0.
|
7
|
+
gem.version = '0.2.0'
|
8
8
|
gem.authors = ['Joseph Hughes']
|
9
9
|
gem.email = ['jjhughes57@gmail.com']
|
10
10
|
gem.description = 'Filter plugin to add Mesosphere metadata'
|
@@ -20,7 +20,7 @@ Gem::Specification.new do |gem|
|
|
20
20
|
|
21
21
|
gem.required_ruby_version = '>= 2.0.0'
|
22
22
|
|
23
|
-
gem.add_runtime_dependency 'fluentd', '>= 0.
|
23
|
+
gem.add_runtime_dependency 'fluentd', ['>= 0.14.0', '< 2']
|
24
24
|
gem.add_runtime_dependency 'lru_redux', '~> 1.1'
|
25
25
|
gem.add_runtime_dependency 'docker-api', '~> 1.23'
|
26
26
|
gem.add_runtime_dependency 'oj', '>= 2.13.1'
|
@@ -15,7 +15,13 @@
|
|
15
15
|
# See the License for the specific language governing permissions and
|
16
16
|
# limitations under the License.
|
17
17
|
#
|
18
|
-
|
18
|
+
require 'docker-api'
|
19
|
+
require 'lru_redux'
|
20
|
+
require 'oj'
|
21
|
+
require 'time'
|
22
|
+
require 'fluent/plugin/filter'
|
23
|
+
|
24
|
+
module Fluent::Plugin
|
19
25
|
# Parses Marathon and Chronos data from docker to make fluentd logs more
|
20
26
|
# useful.
|
21
27
|
class MesosphereFilter < Filter
|
@@ -39,11 +45,6 @@ module Fluent
|
|
39
45
|
def configure(conf)
|
40
46
|
super
|
41
47
|
|
42
|
-
require 'docker-api'
|
43
|
-
require 'lru_redux'
|
44
|
-
require 'oj'
|
45
|
-
require 'time'
|
46
|
-
|
47
48
|
@cache_ttl = :none if @cache_ttl < 0
|
48
49
|
|
49
50
|
@cache = LruRedux::TTL::ThreadSafeCache.new(@cache_size, @cache_ttl)
|
@@ -56,7 +57,7 @@ module Fluent
|
|
56
57
|
# Gets the log event stream and moifies it. This is where the plugin hooks
|
57
58
|
# into the fluentd envent stream.
|
58
59
|
def filter_stream(tag, es)
|
59
|
-
new_es = MultiEventStream.new
|
60
|
+
new_es = Fluent::MultiEventStream.new
|
60
61
|
container_id = ''
|
61
62
|
|
62
63
|
container_id = get_container_id_from_tag(tag) if get_container_id_tag
|
data/test/helper.rb
CHANGED
@@ -28,6 +28,7 @@ end
|
|
28
28
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
29
29
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
30
30
|
require 'fluent/test'
|
31
|
+
require 'fluent/test/driver/filter'
|
31
32
|
require 'webmock/test_unit'
|
32
33
|
WebMock.disable_net_connect!(:allow => "codeclimate.com")
|
33
34
|
|
@@ -29,8 +29,8 @@ class AmplifierFilterTest < Test::Unit::TestCase
|
|
29
29
|
namespace_env_var NAMESPACE
|
30
30
|
]
|
31
31
|
|
32
|
-
def create_driver(conf = CONFIG
|
33
|
-
Fluent::Test::
|
32
|
+
def create_driver(conf = CONFIG)
|
33
|
+
Fluent::Test::Driver::Filter.new(Fluent::Plugin::MesosphereFilter).configure(conf)
|
34
34
|
end
|
35
35
|
|
36
36
|
def setup_docker_stub(file, docker_api_url)
|
@@ -53,15 +53,15 @@ class AmplifierFilterTest < Test::Unit::TestCase
|
|
53
53
|
def test_marathon_filter
|
54
54
|
setup_marathon_container('foobar123', 'marathon')
|
55
55
|
|
56
|
-
d1 = create_driver(CONFIG
|
57
|
-
d1.run do
|
58
|
-
d1.
|
56
|
+
d1 = create_driver(CONFIG)
|
57
|
+
d1.run(default_tag: 'docker.foobar123') do
|
58
|
+
d1.feed('log' => 'Hello World 1')
|
59
59
|
end
|
60
|
-
filtered = d1.
|
60
|
+
filtered = d1.filtered
|
61
61
|
|
62
62
|
task_id = 'hello-world.14b0596d-93ea-11e5-a134-124eefe69197'
|
63
63
|
|
64
|
-
log_entry = filtered[0][
|
64
|
+
log_entry = filtered[0][1]
|
65
65
|
|
66
66
|
assert_equal 'marathon', log_entry['mesos_framework']
|
67
67
|
assert_equal 'hello-world', log_entry['app']
|
@@ -71,30 +71,30 @@ class AmplifierFilterTest < Test::Unit::TestCase
|
|
71
71
|
def test_container_cache
|
72
72
|
setup_marathon_container('foobar123', 'marathon')
|
73
73
|
|
74
|
-
d1 = create_driver(CONFIG
|
75
|
-
d1.run do
|
74
|
+
d1 = create_driver(CONFIG)
|
75
|
+
d1.run(default_tag: 'docker.foobar123') do
|
76
76
|
1000.times do
|
77
|
-
d1.
|
77
|
+
d1.feed('log' => 'Hello World 4')
|
78
78
|
end
|
79
79
|
end
|
80
80
|
docker_api_url = 'http://tcp//example.com:5422/v1.16/containers/foobar123/json'
|
81
81
|
|
82
|
-
assert_equal 1000, d1.
|
82
|
+
assert_equal 1000, d1.filtered.length
|
83
83
|
assert_requested(:get, docker_api_url, times: 2)
|
84
84
|
end
|
85
85
|
|
86
86
|
def test_container_cache_expiration
|
87
87
|
setup_marathon_container('foobar123', 'marathon')
|
88
88
|
|
89
|
-
d1 = create_driver(CONFIG2
|
90
|
-
d1.run do
|
91
|
-
d1.
|
89
|
+
d1 = create_driver(CONFIG2)
|
90
|
+
d1.run(default_tag: 'docker.foobar123') do
|
91
|
+
d1.feed('log' => 'Hello World 4')
|
92
92
|
end
|
93
93
|
|
94
94
|
Timecop.travel(Time.now + 10 * 60)
|
95
95
|
|
96
|
-
d1.run do
|
97
|
-
d1.
|
96
|
+
d1.run(default_tag: 'docker.foobar123') do
|
97
|
+
d1.feed('log' => 'Hello World 4')
|
98
98
|
end
|
99
99
|
|
100
100
|
Timecop.return
|
@@ -107,14 +107,14 @@ class AmplifierFilterTest < Test::Unit::TestCase
|
|
107
107
|
def test_chronos_filter
|
108
108
|
setup_chronos_container
|
109
109
|
|
110
|
-
d1 = create_driver(CONFIG
|
111
|
-
d1.run do
|
112
|
-
d1.
|
110
|
+
d1 = create_driver(CONFIG)
|
111
|
+
d1.run(default_tag: 'docker.foobar124') do
|
112
|
+
d1.feed('log' => 'Hello World 1')
|
113
113
|
end
|
114
|
-
filtered = d1.
|
114
|
+
filtered = d1.filtered
|
115
115
|
|
116
116
|
task_id = 'ct:1448508194000:0:recurring-transaction2:task'
|
117
|
-
log_entry = filtered[0][
|
117
|
+
log_entry = filtered[0][1]
|
118
118
|
|
119
119
|
assert_equal 'chronos', log_entry['mesos_framework']
|
120
120
|
assert_equal 'some-task-app2-11182015-1718', log_entry['app']
|
@@ -127,14 +127,14 @@ class AmplifierFilterTest < Test::Unit::TestCase
|
|
127
127
|
file = File.open('test/containers/chronos_bad.json', 'rb')
|
128
128
|
setup_docker_stub(file, docker_api_url)
|
129
129
|
|
130
|
-
d1 = create_driver(CONFIG
|
131
|
-
d1.run do
|
132
|
-
d1.
|
130
|
+
d1 = create_driver(CONFIG)
|
131
|
+
d1.run(default_tag: 'docker.foobar124') do
|
132
|
+
d1.feed('log' => 'Hello World 1')
|
133
133
|
end
|
134
|
-
filtered = d1.
|
134
|
+
filtered = d1.filtered
|
135
135
|
|
136
136
|
task_id = 'ct:1448508194000:0:recurring-transaction3:task'
|
137
|
-
log_entry = filtered[0][
|
137
|
+
log_entry = filtered[0][1]
|
138
138
|
|
139
139
|
assert_equal 'chronos', log_entry['mesos_framework']
|
140
140
|
assert_equal task_id, log_entry['mesos_task_id']
|
@@ -145,12 +145,12 @@ class AmplifierFilterTest < Test::Unit::TestCase
|
|
145
145
|
def test_merge_json
|
146
146
|
setup_chronos_container
|
147
147
|
|
148
|
-
d1 = create_driver(CONFIG
|
149
|
-
d1.run do
|
150
|
-
d1.
|
148
|
+
d1 = create_driver(CONFIG)
|
149
|
+
d1.run(default_tag: 'docker.foobar124') do
|
150
|
+
d1.feed('log' => '{"test_key":"Hello World"}')
|
151
151
|
end
|
152
|
-
filtered = d1.
|
153
|
-
log_entry = filtered[0][
|
152
|
+
filtered = d1.filtered
|
153
|
+
log_entry = filtered[0][1]
|
154
154
|
|
155
155
|
assert_equal 'Hello World', log_entry['test_key']
|
156
156
|
end
|
@@ -158,12 +158,12 @@ class AmplifierFilterTest < Test::Unit::TestCase
|
|
158
158
|
def test_merge_json_with_namespace
|
159
159
|
setup_chronos_container
|
160
160
|
|
161
|
-
d1 = create_driver(CONFIG4
|
162
|
-
d1.run do
|
163
|
-
d1.
|
161
|
+
d1 = create_driver(CONFIG4)
|
162
|
+
d1.run(default_tag: 'docker.foobar124') do
|
163
|
+
d1.feed('log' => '{"test_key":"Hello World"}')
|
164
164
|
end
|
165
|
-
filtered = d1.
|
166
|
-
log_entry = filtered[0][
|
165
|
+
filtered = d1.filtered
|
166
|
+
log_entry = filtered[0][1]
|
167
167
|
|
168
168
|
assert_equal 'ns', log_entry['namespace']
|
169
169
|
assert_equal 'Hello World', log_entry['ns']['test_key']
|
@@ -174,15 +174,15 @@ class AmplifierFilterTest < Test::Unit::TestCase
|
|
174
174
|
bad_json1 = '{"test_key":"Hello World"'
|
175
175
|
bad_json2 = '{"test_key":"Hello World", "badnews"}'
|
176
176
|
|
177
|
-
d1 = create_driver(CONFIG
|
178
|
-
d1.run do
|
179
|
-
d1.
|
180
|
-
d1.
|
177
|
+
d1 = create_driver(CONFIG)
|
178
|
+
d1.run(default_tag: 'docker.foobar124') do
|
179
|
+
d1.feed('log' => bad_json1)
|
180
|
+
d1.feed('log' => bad_json2)
|
181
181
|
end
|
182
|
-
filtered = d1.
|
182
|
+
filtered = d1.filtered
|
183
183
|
|
184
|
-
assert_equal bad_json1, filtered[0][
|
185
|
-
assert_equal bad_json2, filtered[1][
|
184
|
+
assert_equal bad_json1, filtered[0][1]['log']
|
185
|
+
assert_equal bad_json2, filtered[1][1]['log']
|
186
186
|
end
|
187
187
|
|
188
188
|
def test_bad_merge_json_with_namespace
|
@@ -190,30 +190,30 @@ class AmplifierFilterTest < Test::Unit::TestCase
|
|
190
190
|
bad_json1 = '{"test_key":"Hello World"'
|
191
191
|
bad_json2 = '{"test_key":"Hello World", "badnews"}'
|
192
192
|
|
193
|
-
d1 = create_driver(CONFIG4
|
194
|
-
d1.run do
|
195
|
-
d1.
|
196
|
-
d1.
|
193
|
+
d1 = create_driver(CONFIG4)
|
194
|
+
d1.run(default_tag: 'docker.foobar124') do
|
195
|
+
d1.feed('log' => bad_json1)
|
196
|
+
d1.feed('log' => bad_json2)
|
197
197
|
end
|
198
|
-
filtered = d1.
|
198
|
+
filtered = d1.filtered
|
199
199
|
|
200
|
-
assert_equal bad_json1, filtered[0][
|
201
|
-
assert_equal bad_json2, filtered[1][
|
202
|
-
assert_equal false, filtered[0][
|
203
|
-
assert_equal false, filtered[1][
|
200
|
+
assert_equal bad_json1, filtered[0][1]['log']
|
201
|
+
assert_equal bad_json2, filtered[1][1]['log']
|
202
|
+
assert_equal false, filtered[0][1].key?('ns')
|
203
|
+
assert_equal false, filtered[1][1].key?('ns')
|
204
204
|
end
|
205
205
|
|
206
206
|
def test_container_id_from_record
|
207
207
|
setup_marathon_container('somecontainer123', 'marathon2')
|
208
208
|
|
209
|
-
d1 = create_driver(CONFIG3
|
210
|
-
d1.run do
|
211
|
-
d1.
|
209
|
+
d1 = create_driver(CONFIG3)
|
210
|
+
d1.run(default_tag: 'docker') do
|
211
|
+
d1.feed('log' => 'hello_world', 'container_id' => 'somecontainer123')
|
212
212
|
end
|
213
|
-
filtered = d1.
|
213
|
+
filtered = d1.filtered
|
214
214
|
|
215
215
|
task_id = 'hello-world.14b0596d-93ea-11e5-a134-124eefe69197'
|
216
|
-
log_entry = filtered[0][
|
216
|
+
log_entry = filtered[0][1]
|
217
217
|
|
218
218
|
assert_equal 'marathon', log_entry['mesos_framework']
|
219
219
|
assert_equal 'hello-world', log_entry['app']
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-mesosphere-filter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joseph Hughes
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-10-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fluentd
|
@@ -16,14 +16,20 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.14.0
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '2'
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
27
|
- - ">="
|
25
28
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
29
|
+
version: 0.14.0
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '2'
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: lru_redux
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -234,7 +240,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
234
240
|
version: '0'
|
235
241
|
requirements: []
|
236
242
|
rubyforge_project:
|
237
|
-
rubygems_version: 2.6.
|
243
|
+
rubygems_version: 2.6.14
|
238
244
|
signing_key:
|
239
245
|
specification_version: 4
|
240
246
|
summary: Filter plugin to add Mesosphere metadata to fluentd from Chronos and Marathon
|