fluent-plugin-kubernetes 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9077f299db0493efda09f44151f89239a6e1ae4e
4
- data.tar.gz: 2e3264f349f3ba041be43eb39c66e739d630d994
3
+ metadata.gz: e5d5f6b5708cabfe5acb67a6ca8887b4527a0159
4
+ data.tar.gz: ae3b534361d548138b2a8629fc22723c0d004957
5
5
  SHA512:
6
- metadata.gz: a3dab5944d7eececb8ca54dd9958efc39761033e68386aa96c2430d80af9656be1a2ffd046da809a623c3270979ad69024568bdb8a6fe45797b77776ef62ac92
7
- data.tar.gz: 40385e50cb28ba086abd61158eb92f7ae39d65bb58cf5f888bd4e45e942c6d1c2b057b198c4cc06fd55e510c32834d36197419a16397ab5b8fd509d09ab66d4d
6
+ metadata.gz: 2924405f00af9e58a592ce103c5638c2fbadf0f959a7a722c9be8298bfc14c4104bc41d160e410f60af9a694d7ae95bd6dc1472d47598f0f2387f8f5be8cc0fd
7
+ data.tar.gz: 5451e026ff16df9e148def5bfbb9c93580f449f9dcb95940837b2137706155bf51d8c21fd0a74424b34052d333a7d2b653aa6cae25bdf6965ee1bd31ba941289
data/Gemfile CHANGED
@@ -1,4 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
+ gem "codeclimate-test-reporter", group: :test, require: nil
4
+
3
5
  # Specify your gem's dependencies in fluent-plugin-add.gemspec
4
6
  gemspec
data/README.md CHANGED
@@ -1,4 +1,7 @@
1
- # fluent-plugin-kubernetes, a plugin for [Fluentd](http://fluentd.org)
1
+ # fluent-plugin-kubernetes, a plugin for [Fluentd](http://fluentd.org)
2
+ [![Circle CI](https://circleci.com/gh/fabric8io/fluent-plugin-kubernetes.svg?style=svg)](https://circleci.com/gh/fabric8io/fluent-plugin-kubernetes)
3
+ [![Code Climate](https://codeclimate.com/github/fabric8io/fluent-plugin-kubernetes/badges/gpa.svg)](https://codeclimate.com/github/fabric8io/fluent-plugin-kubernetes)
4
+ [![Test Coverage](https://codeclimate.com/github/fabric8io/fluent-plugin-kubernetes/badges/coverage.svg)](https://codeclimate.com/github/fabric8io/fluent-plugin-kubernetes)
2
5
 
3
6
  ## Installation
4
7
 
@@ -27,10 +30,69 @@
27
30
  </match>
28
31
  ```
29
32
 
30
- ### Assuming following inputs are coming:
31
- test.aa: {"container_name":"k8s_CONTAINER.2f44475a_POD.NAMESPACE.api_ae0aeb72-c44f-11e4-a274-54ee7527188d_d442134f", "json":"dayo"}
32
- ### then output bocomes as belows
33
- test.aa: {"container_name":"k8s_CONTAINER.2f44475a_POD.NAMESPACE.api_ae0aeb72-c44f-11e4-a274-54ee7527188d_d442134f", "pod":"POD", "pod_namespace":"NAMESPACE", "pod_container":"CONTAINER", "json":"dayo", "hoge":"moge","hogehoge":"mogemoge"}
33
+ Docker logs in JSON format. Log files are normally in
34
+ `/var/lib/docker/containers/*/*-json.log`, depending on what your Docker
35
+ data directory is.
36
+
37
+ Assuming following inputs are coming from a log file:
38
+ 0bbc558cca13c5a92cc59f33626db0aaa2afea24742d2fbe549e3a30faf7ab09-json.log:
39
+ ```
40
+ {
41
+ "log": "Something happened\n",
42
+ "stream": "stdout",
43
+ "time": "2015-03-07T20:04:17.604503223Z"
44
+ }
45
+ ```
46
+
47
+ Then output becomes as belows
48
+ ```
49
+ {
50
+ "log": "Something happened\n",
51
+ "stream": "stdout",
52
+ "time": "2015-03-07T20:04:17.604503223Z"
53
+ "container_id": "0bbc558cca13c5a92cc59f33626db0aaa2afea24742d2fbe549e3a30faf7ab09",
54
+ "container_name": "k8s_CONTAINER.2f44475a_POD.NAMESPACE.api_ae0aeb72-c44f-11e4-a274-54ee7527188d_d442134f",
55
+ "pod": "POD",
56
+ "pod_namespace": "NAMESPACE",
57
+ "pod_container": "CONTAINER"
58
+ }
59
+ ```
60
+
61
+ ## JSON logging
62
+
63
+ Logging requires context to be really useful. Context can either be derived
64
+ from log lines from known formats, but this is error prone & requires
65
+ processing power. The logging application is the best place to add
66
+ context.
67
+
68
+ If you use JSON for your application logs you can add context to your logs
69
+ as you go. This plugin will parse your log lines & if it sees that they are
70
+ JSON it will merge it in to the top level record so your contextual logging
71
+ will be nicely searchable.
72
+
73
+ Something like this:
74
+
75
+ ```
76
+ {
77
+ "log": "{\"context\":\"something\"}",
78
+ "stream": "stdout",
79
+ "time": "2015-03-07T20:04:17.604503223Z"
80
+ }
81
+ ```
82
+
83
+ Then output becomes as belows
84
+ ```
85
+ {
86
+ "context": "something",
87
+ "stream": "stdout",
88
+ "time": "2015-03-07T20:04:17.604503223Z"
89
+ "container_id": "0bbc558cca13c5a92cc59f33626db0aaa2afea24742d2fbe549e3a30faf7ab09",
90
+ "container_name": "k8s_CONTAINER.2f44475a_POD.NAMESPACE.api_ae0aeb72-c44f-11e4-a274-54ee7527188d_d442134f",
91
+ "pod": "POD",
92
+ "pod_namespace": "NAMESPACE",
93
+ "pod_container": "CONTAINER"
94
+ }
95
+ ```
34
96
 
35
97
  ## Contributing
36
98
 
@@ -0,0 +1,3 @@
1
+ test:
2
+ override:
3
+ - bundle exec rake test
@@ -1,11 +1,10 @@
1
1
  # coding: utf-8
2
2
  lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- # require 'fluent/plugin/add/version'
5
4
 
6
5
  Gem::Specification.new do |spec|
7
6
  spec.name = "fluent-plugin-kubernetes"
8
- spec.version = "0.3.0"
7
+ spec.version = "0.3.1"
9
8
  spec.authors = ["Jimmi Dyson"]
10
9
  spec.email = ["jimmidyson@gmail.com"]
11
10
  spec.description = %q{Output filter plugin to add Kubernetes metadata}
@@ -22,6 +21,8 @@ Gem::Specification.new do |spec|
22
21
  spec.add_development_dependency "rake"
23
22
  spec.add_development_dependency "minitest", "~> 4.0"
24
23
  spec.add_development_dependency "copyright-header"
24
+ spec.add_development_dependency "minitest-vcr"
25
+ spec.add_development_dependency "webmock"
25
26
  spec.add_runtime_dependency "fluentd"
26
27
  spec.add_runtime_dependency "docker-api"
27
28
  end
@@ -16,8 +16,6 @@
16
16
  # See the License for the specific language governing permissions and
17
17
  # limitations under the License.
18
18
  #
19
- require 'open3'
20
-
21
19
  class Fluent::KubernetesOutput < Fluent::Output
22
20
  Fluent::Plugin.register_output('kubernetes', self)
23
21
 
@@ -55,7 +53,37 @@ class Fluent::KubernetesOutput < Fluent::Output
55
53
  end
56
54
 
57
55
  def enrich_record(tag, record)
58
- if @container_id
56
+ id = interpolate(tag, @container_id)
57
+ if !id.empty?
58
+ record['container_id'] = id
59
+ record = enrich_container_data(id, record)
60
+ record = merge_json_log(record)
61
+ end
62
+ record
63
+ end
64
+
65
+ def enrich_container_data(id, record)
66
+ container = Docker::Container.get(id)
67
+ if container
68
+ container_name = container.json['Name']
69
+ if container_name
70
+ record["container_name"] = container_name[1..-1] if container_name[0] == '/'
71
+ regex = Regexp.new(@kubernetes_pod_regex)
72
+ match = container_name.match(regex)
73
+ if match
74
+ pod_container_name, pod_name, pod_namespace =
75
+ match.captures
76
+ record["pod_namespace"] = pod_namespace
77
+ record["pod"] = pod_name
78
+ record["pod_container"] = pod_container_name
79
+ end
80
+ end
81
+ end
82
+ record
83
+ end
84
+
85
+ def merge_json_log(record)
86
+ if record.has_key?('log')
59
87
  log = record['log'].strip
60
88
  if log[0].eql?('{') && log[-1].eql?('}')
61
89
  begin
@@ -67,24 +95,6 @@ class Fluent::KubernetesOutput < Fluent::Output
67
95
  rescue JSON::ParserError
68
96
  end
69
97
  end
70
- id = interpolate(tag, @container_id)
71
- record['container_id'] = id
72
- container = Docker::Container.get(id)
73
- if container
74
- container_name = container.json['Name']
75
- if container_name
76
- record["container_name"] = container_name[1..-1]
77
- regex = Regexp.new(@kubernetes_pod_regex)
78
- match = container_name.match(regex)
79
- if match
80
- pod_container_name, pod_name, pod_namespace =
81
- match.captures
82
- record["pod_namespace"] = pod_namespace
83
- record["pod"] = pod_name
84
- record["pod_container"] = pod_container_name
85
- end
86
- end
87
- end
88
98
  end
89
99
  record
90
100
  end
@@ -0,0 +1,73 @@
1
+ #
2
+ # Fluentd Kubernetes Output Plugin - Enrich Fluentd events with Kubernetes
3
+ # metadata
4
+ #
5
+ # Copyright 2015 Red Hat, Inc.
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ ---
20
+ http_interactions:
21
+ - request:
22
+ method: get
23
+ uri: "<DOCKER_HOST>/v1.16/containers/9b26b527e73550b1fb217d0d643b15aa2ec6607593a6b477cda82a9c72cb82a7/json"
24
+ body:
25
+ encoding: US-ASCII
26
+ string: ''
27
+ headers:
28
+ User-Agent:
29
+ - Swipely/Docker-API 1.20.0
30
+ Content-Type:
31
+ - text/plain
32
+ response:
33
+ status:
34
+ code: 200
35
+ message:
36
+ headers:
37
+ Content-Type:
38
+ - application/json
39
+ Date:
40
+ - Mon, 09 Mar 2015 11:43:55 GMT
41
+ body:
42
+ encoding: UTF-8
43
+ string: |
44
+ {"Id": "9b26b527e73550b1fb217d0d643b15aa2ec6607593a6b477cda82a9c72cb82a7","Name":"no-leading-slash"}
45
+ http_version:
46
+ recorded_at: Mon, 09 Mar 2015 11:43:55 GMT
47
+ - request:
48
+ method: get
49
+ uri: "<DOCKER_HOST>/v1.16/containers/9b26b527e73550b1fb217d0d643b15aa2ec6607593a6b477cda82a9c72cb82a7/json"
50
+ body:
51
+ encoding: US-ASCII
52
+ string: ''
53
+ headers:
54
+ User-Agent:
55
+ - Swipely/Docker-API 1.20.0
56
+ Content-Type:
57
+ - text/plain
58
+ response:
59
+ status:
60
+ code: 200
61
+ message:
62
+ headers:
63
+ Content-Type:
64
+ - application/json
65
+ Date:
66
+ - Mon, 09 Mar 2015 11:43:55 GMT
67
+ body:
68
+ encoding: UTF-8
69
+ string: |
70
+ {"Id": "9b26b527e73550b1fb217d0d643b15aa2ec6607593a6b477cda82a9c72cb82a7","Name":"no-leading-slash"}
71
+ http_version:
72
+ recorded_at: Mon, 09 Mar 2015 11:43:55 GMT
73
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,73 @@
1
+ #
2
+ # Fluentd Kubernetes Output Plugin - Enrich Fluentd events with Kubernetes
3
+ # metadata
4
+ #
5
+ # Copyright 2015 Red Hat, Inc.
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ ---
20
+ http_interactions:
21
+ - request:
22
+ method: get
23
+ uri: "<DOCKER_HOST>/v1.16/containers/9b26b527e73550b1fb217d0d643b15aa2ec6607593a6b477cda82a9c72cb82a7/json"
24
+ body:
25
+ encoding: US-ASCII
26
+ string: ''
27
+ headers:
28
+ User-Agent:
29
+ - Swipely/Docker-API 1.20.0
30
+ Content-Type:
31
+ - text/plain
32
+ response:
33
+ status:
34
+ code: 200
35
+ message:
36
+ headers:
37
+ Content-Type:
38
+ - application/json
39
+ Date:
40
+ - Mon, 09 Mar 2015 11:43:55 GMT
41
+ body:
42
+ encoding: UTF-8
43
+ string: |
44
+ {"Id": "9b26b527e73550b1fb217d0d643b15aa2ec6607593a6b477cda82a9c72cb82a7","Name":"/non-kubernetes"}
45
+ http_version:
46
+ recorded_at: Mon, 09 Mar 2015 11:43:55 GMT
47
+ - request:
48
+ method: get
49
+ uri: "<DOCKER_HOST>/v1.16/containers/9b26b527e73550b1fb217d0d643b15aa2ec6607593a6b477cda82a9c72cb82a7/json"
50
+ body:
51
+ encoding: US-ASCII
52
+ string: ''
53
+ headers:
54
+ User-Agent:
55
+ - Swipely/Docker-API 1.20.0
56
+ Content-Type:
57
+ - text/plain
58
+ response:
59
+ status:
60
+ code: 200
61
+ message:
62
+ headers:
63
+ Content-Type:
64
+ - application/json
65
+ Date:
66
+ - Mon, 09 Mar 2015 11:43:55 GMT
67
+ body:
68
+ encoding: UTF-8
69
+ string: |
70
+ {"Id": "9b26b527e73550b1fb217d0d643b15aa2ec6607593a6b477cda82a9c72cb82a7","Name":"/non-kubernetes"}
71
+ http_version:
72
+ recorded_at: Mon, 09 Mar 2015 11:43:55 GMT
73
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,73 @@
1
+ #
2
+ # Fluentd Kubernetes Output Plugin - Enrich Fluentd events with Kubernetes
3
+ # metadata
4
+ #
5
+ # Copyright 2015 Red Hat, Inc.
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ ---
20
+ http_interactions:
21
+ - request:
22
+ method: get
23
+ uri: "<DOCKER_HOST>/v1.16/containers/9b26b527e73550b1fb217d0d643b15aa2ec6607593a6b477cda82a9c72cb82a7/json"
24
+ body:
25
+ encoding: US-ASCII
26
+ string: ''
27
+ headers:
28
+ User-Agent:
29
+ - Swipely/Docker-API 1.20.0
30
+ Content-Type:
31
+ - text/plain
32
+ response:
33
+ status:
34
+ code: 200
35
+ message:
36
+ headers:
37
+ Content-Type:
38
+ - application/json
39
+ Date:
40
+ - Mon, 09 Mar 2015 11:43:55 GMT
41
+ body:
42
+ encoding: UTF-8
43
+ string: |
44
+ {"Id": "9b26b527e73550b1fb217d0d643b15aa2ec6607593a6b477cda82a9c72cb82a7","Name":"/k8s_CONTAINER.ff8e9ce_POD.NAMESPACE.api_2b249189-c3e0-11e4-839d-54ee7527188d_c306d8a8"}
45
+ http_version:
46
+ recorded_at: Mon, 09 Mar 2015 11:43:55 GMT
47
+ - request:
48
+ method: get
49
+ uri: "<DOCKER_HOST>/v1.16/containers/9b26b527e73550b1fb217d0d643b15aa2ec6607593a6b477cda82a9c72cb82a7/json"
50
+ body:
51
+ encoding: US-ASCII
52
+ string: ''
53
+ headers:
54
+ User-Agent:
55
+ - Swipely/Docker-API 1.20.0
56
+ Content-Type:
57
+ - text/plain
58
+ response:
59
+ status:
60
+ code: 200
61
+ message:
62
+ headers:
63
+ Content-Type:
64
+ - application/json
65
+ Date:
66
+ - Mon, 09 Mar 2015 11:43:55 GMT
67
+ body:
68
+ encoding: UTF-8
69
+ string: |
70
+ {"Id": "9b26b527e73550b1fb217d0d643b15aa2ec6607593a6b477cda82a9c72cb82a7","Name":"/k8s_CONTAINER.ff8e9ce_POD.NAMESPACE.api_2b249189-c3e0-11e4-839d-54ee7527188d_c306d8a8"}
71
+ http_version:
72
+ recorded_at: Mon, 09 Mar 2015 11:43:55 GMT
73
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,73 @@
1
+ #
2
+ # Fluentd Kubernetes Output Plugin - Enrich Fluentd events with Kubernetes
3
+ # metadata
4
+ #
5
+ # Copyright 2015 Red Hat, Inc.
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ ---
20
+ http_interactions:
21
+ - request:
22
+ method: get
23
+ uri: "<DOCKER_HOST>/v1.16/containers/9b26b527e73550b1fb217d0d643b15aa2ec6607593a6b477cda82a9c72cb82a7/json"
24
+ body:
25
+ encoding: US-ASCII
26
+ string: ''
27
+ headers:
28
+ User-Agent:
29
+ - Swipely/Docker-API 1.20.0
30
+ Content-Type:
31
+ - text/plain
32
+ response:
33
+ status:
34
+ code: 200
35
+ message:
36
+ headers:
37
+ Content-Type:
38
+ - application/json
39
+ Date:
40
+ - Mon, 09 Mar 2015 11:43:55 GMT
41
+ body:
42
+ encoding: UTF-8
43
+ string: |
44
+ {"Id": "9b26b527e73550b1fb217d0d643b15aa2ec6607593a6b477cda82a9c72cb82a7","Name":"/non-kubernetes"}
45
+ http_version:
46
+ recorded_at: Mon, 09 Mar 2015 11:43:55 GMT
47
+ - request:
48
+ method: get
49
+ uri: "<DOCKER_HOST>/v1.16/containers/9b26b527e73550b1fb217d0d643b15aa2ec6607593a6b477cda82a9c72cb82a7/json"
50
+ body:
51
+ encoding: US-ASCII
52
+ string: ''
53
+ headers:
54
+ User-Agent:
55
+ - Swipely/Docker-API 1.20.0
56
+ Content-Type:
57
+ - text/plain
58
+ response:
59
+ status:
60
+ code: 200
61
+ message:
62
+ headers:
63
+ Content-Type:
64
+ - application/json
65
+ Date:
66
+ - Mon, 09 Mar 2015 11:43:55 GMT
67
+ body:
68
+ encoding: UTF-8
69
+ string: |
70
+ {"Id": "9b26b527e73550b1fb217d0d643b15aa2ec6607593a6b477cda82a9c72cb82a7","Name":"/non-kubernetes"}
71
+ http_version:
72
+ recorded_at: Mon, 09 Mar 2015 11:43:55 GMT
73
+ recorded_with: VCR 2.9.3
@@ -16,8 +16,30 @@
16
16
  # See the License for the specific language governing permissions and
17
17
  # limitations under the License.
18
18
  #
19
- require 'rubygems'
20
- require 'bundler'
19
+ require "simplecov"
20
+ require "codeclimate-test-reporter"
21
+ if ENV['CIRCLE_ARTIFACTS']
22
+ dir = File.join("..", "..", "..", ENV['CIRCLE_ARTIFACTS'], "coverage")
23
+ SimpleCov.coverage_dir(dir)
24
+ end
25
+
26
+ SimpleCov.add_filter 'vendor'
27
+
28
+ SimpleCov.start do
29
+ formatter SimpleCov::Formatter::MultiFormatter[
30
+ SimpleCov::Formatter::HTMLFormatter,
31
+ CodeClimate::TestReporter::Formatter
32
+ ]
33
+ end
34
+
35
+ begin
36
+ require "bundler"
37
+ rescue LoadError => e
38
+ STDERR.puts e.message
39
+ STDERR.puts "Run `gem install bundler` to install Bundler."
40
+ exit e.status_code
41
+ end
42
+
21
43
  begin
22
44
  Bundler.setup(:default, :development)
23
45
  rescue Bundler::BundlerError => e
@@ -42,7 +64,19 @@ unless ENV.has_key?('VERBOSE')
42
64
  $log = nulllogger
43
65
  end
44
66
 
67
+ require "minispec-metadata"
68
+ require "vcr"
69
+ require "minitest-vcr"
70
+ require "webmock"
71
+
72
+ VCR.configure do |c|
73
+ c.cassette_library_dir = 'test/cassettes'
74
+ c.hook_into :excon, :webmock
75
+ c.filter_sensitive_data('<DOCKER_HOST>') { Docker.url.sub(/tcp\:/, 'https:') }
76
+ c.ignore_hosts 'codeclimate.com'
77
+ end
78
+
79
+ MinitestVcr::Spec.configure!
80
+
45
81
  require 'fluent/plugin/out_kubernetes'
46
82
 
47
- class Test::Unit::TestCase
48
- end
@@ -18,54 +18,71 @@
18
18
  #
19
19
  require 'helper'
20
20
 
21
- class KubernetesOutputTest < Test::Unit::TestCase
22
- def setup
23
- Fluent::Test.setup
24
- end
21
+ describe 'Fluentd Kubernetes Output Plugin' do
25
22
 
26
- CONFIG = %[
27
- ]
23
+ CONFIG = %{
24
+ container_id ${tag_parts[5]}
25
+ tag docker.${name}
26
+ }
28
27
 
29
- def create_driver(conf = CONFIG, tag='test')
30
- Fluent::Test::OutputTestDriver.new(Fluent::KubernetesOutput, tag).configure(conf)
28
+ before do
29
+ Fluent::Test.setup
30
+ @fluentd_driver = Fluent::Test::OutputTestDriver.new(
31
+ Fluent::KubernetesOutput,
32
+ 'docker.var.lib.docker.containers.9b26b527e73550b1fb217d0d643b15aa2ec6607593a6b477cda82a9c72cb82a7')
33
+ .configure(CONFIG)
31
34
  end
32
35
 
33
- def test_k8s_pod
34
- d = create_driver
36
+ describe 'add kubernetes metadata', vcr: {record: :once} do
37
+ describe 'kubernetes container' do
38
+ it 'enriches with correct kubernets metadata' do
39
+ @fluentd_driver.run do
40
+ @fluentd_driver.emit("container_name" => "k8s_CONTAINER.ff8e9ce_POD.NAMESPACE.api_2b249189-c3e0-11e4-839d-54ee7527188d_c306d8a8")
41
+ end
42
+ mapped = {'container_id' => '9b26b527e73550b1fb217d0d643b15aa2ec6607593a6b477cda82a9c72cb82a7', 'pod' => 'POD', 'pod_namespace' => 'NAMESPACE', 'pod_container' => 'CONTAINER'}
43
+ assert_equal [
44
+ {"container_name" => "k8s_CONTAINER.ff8e9ce_POD.NAMESPACE.api_2b249189-c3e0-11e4-839d-54ee7527188d_c306d8a8"}.merge(mapped),
45
+ ], @fluentd_driver.records
35
46
 
36
- d.run do
37
- d.emit("container_name" => "k8s_CONTAINER.ff8e9ce_POD.NAMESPACE.api_2b249189-c3e0-11e4-839d-54ee7527188d_c306d8a8")
47
+ @fluentd_driver.run
48
+ end
38
49
  end
39
- mapped = {'pod' => 'POD', 'pod_namespace' => 'NAMESPACE', 'pod_container' => 'CONTAINER'}
40
- assert_equal [
41
- {"container_name" => "k8s_CONTAINER.ff8e9ce_POD.NAMESPACE.api_2b249189-c3e0-11e4-839d-54ee7527188d_c306d8a8"}.merge(mapped),
42
- ], d.records
43
-
44
- d.run
45
- end
50
+ describe 'non-kubernetes container' do
51
+ it 'leaves event untouched' do
52
+ @fluentd_driver.run do
53
+ @fluentd_driver.emit("container_name" => "/non-kubernetes")
54
+ end
55
+ assert_equal [
56
+ {'container_id' => '9b26b527e73550b1fb217d0d643b15aa2ec6607593a6b477cda82a9c72cb82a7', "container_name" => "non-kubernetes"},
57
+ ], @fluentd_driver.records
46
58
 
47
- def test_non_k8s_container
48
- d = create_driver
49
-
50
- d.run do
51
- d.emit("container_name" => "nonk8s")
59
+ @fluentd_driver.run
60
+ end
52
61
  end
53
- assert_equal [
54
- {"container_name" => "nonk8s"},
55
- ], d.records
62
+ describe 'container name not starting with slash' do
63
+ it 'uses full container name' do
64
+ @fluentd_driver.run do
65
+ @fluentd_driver.emit("container_name" => "no-leading-slash")
66
+ end
67
+ assert_equal [
68
+ {'container_id' => '9b26b527e73550b1fb217d0d643b15aa2ec6607593a6b477cda82a9c72cb82a7', "container_name" => "no-leading-slash"},
69
+ ], @fluentd_driver.records
56
70
 
57
- d.run
58
- end
71
+ @fluentd_driver.run
72
+ end
73
+ end
74
+ describe 'json log data' do
75
+ it 'merges json log data' do
76
+ @fluentd_driver.run do
77
+ @fluentd_driver.emit({"container_name" => "non-kubernetes", "log" => "{\"this\":\"rocks\"}"})
78
+ end
79
+ assert_equal [
80
+ {'container_id' => '9b26b527e73550b1fb217d0d643b15aa2ec6607593a6b477cda82a9c72cb82a7', "container_name" => "non-kubernetes", "this" => "rocks"},
81
+ ], @fluentd_driver.records
59
82
 
60
- def bench_k8s_pod
61
- input = {"container_name" => "k8s_CONTAINER.ff8e9ce_POD.NAMESPACE.api_2b249189-c3e0-11e4-839d-54ee7527188d_c306d8a8"}
62
- plugin = Fluent::KubernetesOutput.new
63
- plugin.configure({})
64
- assert_performance_linear do |n|
65
- n.times do
66
- plugin.enrich_record(input)
83
+ @fluentd_driver.run
67
84
  end
68
85
  end
69
86
  end
70
87
 
71
- end
88
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-kubernetes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jimmi Dyson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-08 00:00:00.000000000 Z
11
+ date: 2015-03-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,6 +66,34 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest-vcr
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: webmock
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
69
97
  - !ruby/object:Gem::Dependency
70
98
  name: fluentd
71
99
  requirement: !ruby/object:Gem::Requirement
@@ -106,8 +134,13 @@ files:
106
134
  - LICENSE.txt
107
135
  - README.md
108
136
  - Rakefile
137
+ - circle.yml
109
138
  - fluent-plugin-kubernetes.gemspec
110
139
  - lib/fluent/plugin/out_kubernetes.rb
140
+ - test/cassettes/Fluentd_Kubernetes_Output_Plugin/add_kubernetes_metadata/container_name_not_starting_with_slash/uses_full_container_name.yml
141
+ - test/cassettes/Fluentd_Kubernetes_Output_Plugin/add_kubernetes_metadata/json_log_data/merges_json_log_data.yml
142
+ - test/cassettes/Fluentd_Kubernetes_Output_Plugin/add_kubernetes_metadata/kubernetes_container/enriches_with_correct_kubernets_metadata.yml
143
+ - test/cassettes/Fluentd_Kubernetes_Output_Plugin/add_kubernetes_metadata/non-kubernetes_container/leaves_event_untouched.yml
111
144
  - test/helper.rb
112
145
  - test/plugin/test_out_kubernetes.rb
113
146
  homepage: https://github.com/fabric8io/fluent-plugin-kubernetes
@@ -135,5 +168,9 @@ signing_key:
135
168
  specification_version: 4
136
169
  summary: Output filter plugin to add Kubernetes metadata
137
170
  test_files:
171
+ - test/cassettes/Fluentd_Kubernetes_Output_Plugin/add_kubernetes_metadata/container_name_not_starting_with_slash/uses_full_container_name.yml
172
+ - test/cassettes/Fluentd_Kubernetes_Output_Plugin/add_kubernetes_metadata/json_log_data/merges_json_log_data.yml
173
+ - test/cassettes/Fluentd_Kubernetes_Output_Plugin/add_kubernetes_metadata/kubernetes_container/enriches_with_correct_kubernets_metadata.yml
174
+ - test/cassettes/Fluentd_Kubernetes_Output_Plugin/add_kubernetes_metadata/non-kubernetes_container/leaves_event_untouched.yml
138
175
  - test/helper.rb
139
176
  - test/plugin/test_out_kubernetes.rb