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 +7 -0
- data/.gitignore +5 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +14 -0
- data/README.md +80 -0
- data/Rakefile +10 -0
- data/fluent-plugin-docker-tag-resolver.gemspec +23 -0
- data/lib/fluent/plugin/out_docker_tag_resolver.rb +59 -0
- data/test/helper.rb +28 -0
- data/test/plugin/test_out_docker_tag_resolver.rb +12 -0
- metadata +125 -0
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/Gemfile
ADDED
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,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
|