fluent-plugin-docker-tag-resolver 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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