fluent-plugin-docker-tag-resolver 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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8de876a20e60190cee56842ee3bb1cb267c49302
4
+ data.tar.gz: cfd31975efe710f63f9985d8363c288eb92cc772
5
+ SHA512:
6
+ metadata.gz: 76b56e4bb5d8675fffb471ade8384d779447969272301fe2c1312f98d63905f3b9af79f6ea19bb7306a80c4318ad942ecd24fdf82c8d1c01ad996e7d3f6da0a2
7
+ data.tar.gz: 25a2f782ad9f0174ea5b9a4b40d3fc4d0acc4ce3504cea1a33aa109bf831d0e4dcba13e6c11bfb22aac009d4b46f2e06d1d2da76b99d0779b3ed5e2602b5fe55
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ vendor/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in fluent-plugin-docker-tag-resolver.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,14 @@
1
+ Copyright (c) 2015- Naoki AINOYA
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
14
+
data/README.md ADDED
@@ -0,0 +1,80 @@
1
+ # fluent-plugin-docker-tag-resolver
2
+
3
+ ## Overview
4
+
5
+ This plugin finds the docker container name and its image name from container-id in record tag,
6
+ and rewrite container-id to human-readable tag name.
7
+
8
+ It's focused on collecting docker container logs from `/var/lib/docker/containrs/*/*-json.log`.
9
+
10
+ For example, the plugin rewrites the tags like below:
11
+
12
+ Before:
13
+
14
+ ```
15
+ "docker.log.var.lib.docker.containers.695e035397f1d5c6cd88225dab54afaed170b93c3ebf51e4354c4daf796e6017.695e035397f1d5c6cd88225dab54afaed170b93c3ebf51e4354c4daf796e6017-json.log"
16
+ ```
17
+
18
+ After:
19
+
20
+ ```
21
+ #The tags represented with docker.container.#{image_name}.#{container_name}.#{container_id}
22
+
23
+ docker.container.kubernetes/fluentd-gcp:1.0.backstabbing_yonath.695e035397f1d5c6cd88225dab54afaed170b93c3ebf51e4354c4daf796e6017
24
+ ```
25
+
26
+
27
+ ## Installation
28
+
29
+ Install with fluent-gem command as:
30
+
31
+ ```
32
+ # for google-fluentd
33
+ $ /opt/google-fluentd/embedded/lib/ruby/gems/2.1.0/gems/fluent-plugin-docker-tag-resolver-0.1.0# /opt/google-fluentd/embedded/bin/gem install
34
+ ```
35
+
36
+ ## Configuration
37
+
38
+ ### Usage
39
+
40
+
41
+ ```
42
+ <source>
43
+ type tail
44
+ format none
45
+ time_key time
46
+ path /var/lib/docker/containers/*/*-json.log
47
+ pos_file /var/lib/docker/containers/containers.log.pos
48
+ time_format %Y-%m-%dT%H:%M:%S
49
+ tag docker.log.*
50
+ </source>
51
+
52
+ <match docker.log.**>
53
+ type docker_tag_resolver
54
+ </match>
55
+
56
+ <match docker.container.**>
57
+ type stdout
58
+ </match>
59
+
60
+ ```
61
+
62
+ ### Result
63
+
64
+ ```
65
+ 2015-03-06 08:09:34 +0000 docker.container.kubernetes/fluentd-gcp:1.0.backstabbing_yonath.695e035397f1d5c6cd88225dab54afaed170b93c3ebf51e4354c4daf796e6017: {"message":"{\"log\":\"\\u001b(B\\u001b[m 349 root 20 0 91208 23124 6888 S 0.0 1.1 0:00.21 google-fluentd \\u001b(B\\u001b[m\\u001b[39;49m\\u001b[K\\r\\n\",\"stream\":\"stdout\",\"time\":\"2015-03-06T08:09:34.980863575Z\"}"}
66
+ 2015-03-06 08:09:34 +0000 docker.container.kubernetes/fluentd-gcp:1.0.backstabbing_yonath.695e035397f1d5c6cd88225dab54afaed170b93c3ebf51e4354c4daf796e6017: {"message":"{\"log\":\"\\u001b(B\\u001b[m 355 root 20 0 4388 680 604 S 0.0 0.0 0:00.01 tail \\u001b(B\\u001b[m\\u001b[39;49m\\u001b[K\\r\\n\",\"stream\":\"stdout\",\"time\":\"2015-03-06T08:09:34.980863575Z\"}"}
67
+ 2015-03-06 08:09:34 +0000 docker.container.kubernetes/fluentd-gcp:1.0.backstabbing_yonath.695e035397f1d5c6cd88225dab54afaed170b93c3ebf51e4354c4daf796e6017: {"message":"{\"log\":\"\\u001b(B\\u001b[m\\u001b[1m 356 root 20 0 19872 2516 2176 R 0.0 0.1 0:00.01 top \\u001b(B\\u001b[m\\u001b[39;49m\\u001b[K\\r\\n\",\"stream\":\"stdout\",\"time\":\"2015-03-06T08:09:34.980863575Z\"}"}
68
+ 2015-03-06 08:09:37 +0000 docker.container.kubernetes/fluentd-gcp:1.0.backstabbing_yonath.695e035397f1d5c6cd88225dab54afaed170b93c3ebf51e4354c4daf796e6017: {"message":"{\"log\":\"\\u001b[J\\u001b[?1l\\u001b\\u003e\\u001b[31;1H\\r\\n\",\"stream\":\"stdout\",\"time\":\"2015-03-06T08:09:37.507569483Z\"}"}
69
+ ```
70
+
71
+ ## Reference
72
+
73
+ [fluent/fluent-plugin-rewrite-tag-filter](https://github.com/fluent/fluent-plugin-rewrite-tag-filter)
74
+
75
+ [Collecting Docker Log Files with Fluentd and sending to GCP.](https://github.com/GoogleCloudPlatform/kubernetes/tree/master/contrib/logging/fluentd-gcp-image)
76
+
77
+ ## License
78
+
79
+ Apache License, Version 2.0
80
+
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+ Rake::TestTask.new(:test) do |test|
4
+ test.libs << 'lib' << 'test'
5
+ test.pattern = 'test/**/test_*.rb'
6
+ test.verbose = true
7
+ end
8
+
9
+ task :default => :test
10
+
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "fluent-plugin-docker-tag-resolver"
6
+ s.version = "0.1.0"
7
+ s.license = "Apache 2.0"
8
+ s.authors = ["Naoki AINOYA"]
9
+ s.email = ["ainonic@gmail.com"]
10
+ s.homepage = "https://github.com/ainoya/fluent-plugin-docker-tag-resolver"
11
+ s.summary = %q{Fluentd Output filter plugin.}
12
+
13
+ s.files = `git ls-files`.split("\n")
14
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
15
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
16
+ s.require_paths = ["lib"]
17
+
18
+ s.add_development_dependency "rake"
19
+ s.add_development_dependency "pry"
20
+ s.add_runtime_dependency "fluentd"
21
+ s.add_runtime_dependency "string-scrub"
22
+ s.add_runtime_dependency "docker-api"
23
+ end
@@ -0,0 +1,59 @@
1
+ class Fluent::DockerTagResolverOutput < Fluent::Output
2
+
3
+ # Define `log` method for v0.10.42 or earlier
4
+ unless method_defined?(:log)
5
+ define_method("log") { $log }
6
+ end
7
+
8
+ Fluent::Plugin.register_output('docker_tag_resolver', self)
9
+
10
+ def initialize
11
+ super
12
+ require 'docker'
13
+
14
+ @containers = Docker::Container.all
15
+
16
+ @find_containers = Proc.new do |id|
17
+ container = @containers.select{|c| c.id == id}.first
18
+
19
+ if container.nil?
20
+ @containers = Docker::Container.all
21
+ @containers.select{|c| c.id == id}.first
22
+ else
23
+ container
24
+ end
25
+ end
26
+ end
27
+
28
+ def emit(tag, es, chain)
29
+ es.each do |time,record|
30
+ rewrited_tag = rewrite_tag(tag, record)
31
+ next if rewrited_tag.nil? || tag == rewrited_tag
32
+ Fluent::Engine.emit(rewrited_tag, time, record)
33
+ end
34
+
35
+ chain.next
36
+ end
37
+
38
+ def rewrite_tag(tag, record)
39
+ container_id, _ , _ = tag.split('.').last(3)
40
+
41
+ container = @find_containers.call(container_id)
42
+
43
+ return tag unless container
44
+
45
+ image_name = container.info['Image']
46
+ container_name = container.info['Names'].first
47
+
48
+ return tag if image_name.nil? or container_name.nil?
49
+
50
+ container_name.sub!(/^\//, '')
51
+ container_name.tr!('.','_')
52
+
53
+ rewrited_tag = "docker.container.%s.%s.%s" % [image_name, container_name, container_id]
54
+ return rewrited_tag
55
+ end
56
+
57
+
58
+ end
59
+
data/test/helper.rb ADDED
@@ -0,0 +1,28 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+
12
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
13
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
14
+ require 'fluent/test'
15
+ unless ENV.has_key?('VERBOSE')
16
+ nulllogger = Object.new
17
+ nulllogger.instance_eval {|obj|
18
+ def method_missing(method, *args)
19
+ # pass
20
+ end
21
+ }
22
+ $log = nulllogger
23
+ end
24
+
25
+ require 'fluent/plugin/out_docker_tag_resolver'
26
+
27
+ class Test::Unit::TestCase
28
+ end
@@ -0,0 +1,12 @@
1
+ require 'helper'
2
+
3
+ class DockerTagResolverOutputTest < Test::Unit::TestCase
4
+ def setup
5
+ Fluent::Test.setup
6
+ end
7
+
8
+ def create_driver(conf=CONFIG,tag='test')
9
+ Fluent::Test::OutputTestDriver.new(Fluent::DockerTagResolver, tag).configure(conf)
10
+ end
11
+
12
+ end
metadata ADDED
@@ -0,0 +1,125 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-plugin-docker-tag-resolver
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Naoki AINOYA
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-03-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: pry
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: fluentd
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: string-scrub
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: docker-api
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description:
84
+ email:
85
+ - ainonic@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - Gemfile
92
+ - LICENSE.txt
93
+ - README.md
94
+ - Rakefile
95
+ - fluent-plugin-docker-tag-resolver.gemspec
96
+ - lib/fluent/plugin/out_docker_tag_resolver.rb
97
+ - test/helper.rb
98
+ - test/plugin/test_out_docker_tag_resolver.rb
99
+ homepage: https://github.com/ainoya/fluent-plugin-docker-tag-resolver
100
+ licenses:
101
+ - Apache 2.0
102
+ metadata: {}
103
+ post_install_message:
104
+ rdoc_options: []
105
+ require_paths:
106
+ - lib
107
+ required_ruby_version: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ required_rubygems_version: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ requirements: []
118
+ rubyforge_project:
119
+ rubygems_version: 2.2.2
120
+ signing_key:
121
+ specification_version: 4
122
+ summary: Fluentd Output filter plugin.
123
+ test_files:
124
+ - test/helper.rb
125
+ - test/plugin/test_out_docker_tag_resolver.rb