fluent-plugin-kubernetes_metadata_input 0.21.8
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/Gemfile +7 -0
- data/README.md +2 -0
- data/Rakefile +37 -0
- data/fluent-plugin-kubernetes_metadata_input.gemspec +37 -0
- data/lib/fluent/plugin/in_kubernetes_metadata.rb +172 -0
- metadata +231 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 9d6046a3e056886887ed41df204015cb3a5203f0
|
4
|
+
data.tar.gz: 294f347610284f83500c72167b9cd9b1bb45b7ec
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e14ccc276c48558aa350fdb1d6929bb1b2127db9dd6f6cb834145c029ccb34171e71ee9cd87c0b645695674c861d377fdb4ff509c6eca1e6541f05365921995c
|
7
|
+
data.tar.gz: cc47b47a2c514cd516a9bbb5fccc2e79da917d88afd4ddbb86c7f895d7b855c1024a12f7cc95fa4c4e01c0620c11cbaaa69901a49d2b049383752cb65acd4c81
|
data/Gemfile
ADDED
data/README.md
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'bump/tasks'
|
4
|
+
|
5
|
+
task :test => [:base_test]
|
6
|
+
|
7
|
+
task :default => [:test, :build]
|
8
|
+
|
9
|
+
desc 'Run test_unit based test'
|
10
|
+
Rake::TestTask.new(:base_test) do |t|
|
11
|
+
# To run test for only one file (or file path pattern)
|
12
|
+
# $ bundle exec rake base_test TEST=test/test_specified_path.rb
|
13
|
+
# $ bundle exec rake base_test TEST=test/test_*.rb
|
14
|
+
t.libs << 'test'
|
15
|
+
t.test_files = Dir['test/**/test_*.rb'].sort
|
16
|
+
t.verbose = true
|
17
|
+
#t.warning = true
|
18
|
+
end
|
19
|
+
|
20
|
+
desc 'Add copyright headers'
|
21
|
+
task :headers do
|
22
|
+
require 'rubygems'
|
23
|
+
require 'copyright_header'
|
24
|
+
|
25
|
+
args = {
|
26
|
+
:license => 'ASL2',
|
27
|
+
:copyright_software => 'Fluentd Kubernetes Metadata Filter Plugin',
|
28
|
+
:copyright_software_description => 'Enrich Fluentd events with Kubernetes metadata',
|
29
|
+
:copyright_holders => ['Red Hat, Inc.'],
|
30
|
+
:copyright_years => ['2015'],
|
31
|
+
:add_path => 'lib:test',
|
32
|
+
:output_dir => '.'
|
33
|
+
}
|
34
|
+
|
35
|
+
command_line = CopyrightHeader::CommandLine.new( args )
|
36
|
+
command_line.execute
|
37
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
|
5
|
+
Gem::Specification.new do |gem|
|
6
|
+
gem.name = "fluent-plugin-kubernetes_metadata_input"
|
7
|
+
gem.version = "0.21.8"
|
8
|
+
gem.authors = ["Anton Sherkhonov"]
|
9
|
+
gem.email = ["sherkhonov@gmail.com"]
|
10
|
+
gem.description = %q{Input plugin to collect Kubernetes metadata}
|
11
|
+
gem.summary = %q{Input plugin to collect Kubernetes metadata}
|
12
|
+
gem.homepage = "https://github.com/t0ffel/fluent-plugin-kubernetes_metadata_input"
|
13
|
+
gem.license = "ASL2"
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
gem.has_rdoc = false
|
20
|
+
|
21
|
+
gem.required_ruby_version = '>= 2.0.0'
|
22
|
+
|
23
|
+
gem.add_runtime_dependency "fluentd", "~> 0.12.0"
|
24
|
+
gem.add_runtime_dependency "lru_redux"
|
25
|
+
gem.add_runtime_dependency "kubeclient", "~> 1.1.1"
|
26
|
+
|
27
|
+
gem.add_development_dependency "bundler", "~> 1.3"
|
28
|
+
gem.add_development_dependency "rake"
|
29
|
+
gem.add_development_dependency "minitest", "~> 4.0"
|
30
|
+
gem.add_development_dependency "test-unit", "~> 3.0.2"
|
31
|
+
gem.add_development_dependency "test-unit-rr", "~> 1.0.3"
|
32
|
+
gem.add_development_dependency "copyright-header"
|
33
|
+
gem.add_development_dependency "webmock"
|
34
|
+
gem.add_development_dependency "vcr"
|
35
|
+
gem.add_development_dependency "bump"
|
36
|
+
gem.add_development_dependency "yajl-ruby"
|
37
|
+
end
|
@@ -0,0 +1,172 @@
|
|
1
|
+
#
|
2
|
+
# Fluentd Kubernetes Metadata Filter Plugin - Enrich Fluentd events with
|
3
|
+
# Kubernetes 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
|
+
require 'fluent/input'
|
20
|
+
|
21
|
+
|
22
|
+
module Fluent
|
23
|
+
class KubernetesMetadataInput < Fluent::Input
|
24
|
+
K8_POD_CA_CERT = 'ca.crt'
|
25
|
+
K8_POD_TOKEN = 'token'
|
26
|
+
|
27
|
+
Fluent::Plugin.register_input('kubernetes_metadata', self)
|
28
|
+
|
29
|
+
config_param :kubernetes_url, :string, default: nil
|
30
|
+
config_param :apiVersion, :string, default: 'v1'
|
31
|
+
config_param :client_cert, :string, default: nil
|
32
|
+
config_param :client_key, :string, default: nil
|
33
|
+
config_param :ca_file, :string, default: nil
|
34
|
+
config_param :verify_ssl, :bool, default: true
|
35
|
+
config_param :bearer_token_file, :string, default: nil
|
36
|
+
config_param :secret_dir, :string, default: '/var/run/secrets/kubernetes.io/serviceaccount'
|
37
|
+
desc 'Kubernetes resource type to watch.'
|
38
|
+
config_param :resource, :string, default: "Events"
|
39
|
+
|
40
|
+
def syms_to_strs(hsh)
|
41
|
+
newhsh = {}
|
42
|
+
hsh.each_pair do |kk,vv|
|
43
|
+
if vv.is_a?(Hash)
|
44
|
+
vv = syms_to_strs(vv)
|
45
|
+
end
|
46
|
+
if kk.is_a?(Symbol)
|
47
|
+
newhsh[kk.to_s] = vv
|
48
|
+
else
|
49
|
+
newhsh[kk] = vv
|
50
|
+
end
|
51
|
+
end
|
52
|
+
newhsh
|
53
|
+
end
|
54
|
+
|
55
|
+
def initialize
|
56
|
+
super
|
57
|
+
require 'kubeclient'
|
58
|
+
require 'active_support/core_ext/object/blank'
|
59
|
+
end
|
60
|
+
|
61
|
+
def configure(conf)
|
62
|
+
super
|
63
|
+
|
64
|
+
# Use Kubernetes default service account if we're in a pod.
|
65
|
+
if @kubernetes_url.nil?
|
66
|
+
env_host = ENV['KUBERNETES_SERVICE_HOST']
|
67
|
+
env_port = ENV['KUBERNETES_SERVICE_PORT']
|
68
|
+
if env_host.present? && env_port.present?
|
69
|
+
@kubernetes_url = "https://#{env_host}:#{env_port}/api"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
unless @kubernetes_url
|
73
|
+
raise Fluent::ConfigError, "kubernetes_url is not defined"
|
74
|
+
end
|
75
|
+
|
76
|
+
# Use SSL certificate and bearer token from Kubernetes service account.
|
77
|
+
if Dir.exist?(@secret_dir)
|
78
|
+
ca_cert = File.join(@secret_dir, K8_POD_CA_CERT)
|
79
|
+
pod_token = File.join(@secret_dir, K8_POD_TOKEN)
|
80
|
+
|
81
|
+
if !@ca_file.present? and File.exist?(ca_cert)
|
82
|
+
@ca_file = ca_cert
|
83
|
+
end
|
84
|
+
|
85
|
+
if !@bearer_token_file.present? and File.exist?(pod_token)
|
86
|
+
@bearer_token_file = pod_token
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def start
|
92
|
+
|
93
|
+
start_kubclient
|
94
|
+
|
95
|
+
@thread = Thread.new(&method(:watch_resource))
|
96
|
+
@thread.abort_on_exception = true
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
def start_kubclient
|
101
|
+
return @client if @client
|
102
|
+
|
103
|
+
if @kubernetes_url.present?
|
104
|
+
|
105
|
+
ssl_options = {
|
106
|
+
client_cert: @client_cert.present? ? OpenSSL::X509::Certificate.new(File.read(@client_cert)) : nil,
|
107
|
+
client_key: @client_key.present? ? OpenSSL::PKey::RSA.new(File.read(@client_key)) : nil,
|
108
|
+
ca_file: @ca_file,
|
109
|
+
verify_ssl: @verify_ssl ? OpenSSL::SSL::VERIFY_PEER : OpenSSL::SSL::VERIFY_NONE
|
110
|
+
}
|
111
|
+
|
112
|
+
auth_options = {}
|
113
|
+
|
114
|
+
if @bearer_token_file.present?
|
115
|
+
bearer_token = File.read(@bearer_token_file)
|
116
|
+
auth_options[:bearer_token] = bearer_token
|
117
|
+
end
|
118
|
+
|
119
|
+
@client = Kubeclient::Client.new @kubernetes_url, @apiVersion,
|
120
|
+
ssl_options: ssl_options,
|
121
|
+
auth_options: auth_options
|
122
|
+
|
123
|
+
begin
|
124
|
+
@client.api_valid?
|
125
|
+
rescue KubeException => kube_error
|
126
|
+
raise Fluent::ConfigError, "Invalid Kubernetes API #{@apiVersion} endpoint #{@kubernetes_url}: #{kube_error.message}"
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def shutdown
|
132
|
+
@thread.exit
|
133
|
+
end
|
134
|
+
|
135
|
+
def watch_resource
|
136
|
+
begin
|
137
|
+
resource_version = @client.get_pods.resourceVersion
|
138
|
+
watcher = @client.watch_entities(@resource, options = {resource_version: resource_version})
|
139
|
+
rescue Exception => e
|
140
|
+
raise Fluent::ConfigError, "Exception encountered fetching metadata from Kubernetes API endpoint: #{e.message}"
|
141
|
+
end
|
142
|
+
|
143
|
+
|
144
|
+
watcher.each do |notice|
|
145
|
+
time = Engine.now
|
146
|
+
emit_event(notice.object, time, notice.type)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
def emit_event(event_obj, time, type)
|
151
|
+
payload = syms_to_strs(event_obj)
|
152
|
+
payload['event_type'] = type
|
153
|
+
res_name = @resource.to_s.downcase
|
154
|
+
namespace_name = event_obj['metadata']['namespace'] ? event_obj['metadata']['namespace'] : "openshift-infra"
|
155
|
+
if event_obj['metadata']['labels'] then
|
156
|
+
labels = []
|
157
|
+
syms_to_strs(event_obj['metadata']['labels'].to_h).each{|k,v| labels << "#{k}=#{v}"}
|
158
|
+
payload['metadata']['labels'] = labels
|
159
|
+
end
|
160
|
+
if event_obj['metadata']['annotations'] then
|
161
|
+
annotations = []
|
162
|
+
syms_to_strs(event_obj['metadata']['annotations'].to_h).each{|k,v| annotations << "#{k}=#{v}"}
|
163
|
+
payload['metadata']['annotations'] = annotations
|
164
|
+
end
|
165
|
+
|
166
|
+
tag = "kubernetes.#{res_name}.#{namespace_name}.#{event_obj['metadata']['name']}"
|
167
|
+
|
168
|
+
router.emit(tag, time, payload)
|
169
|
+
end
|
170
|
+
|
171
|
+
end
|
172
|
+
end
|
metadata
ADDED
@@ -0,0 +1,231 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fluent-plugin-kubernetes_metadata_input
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.21.8
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Anton Sherkhonov
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-05-24 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: fluentd
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.12.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.12.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: lru_redux
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
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: kubeclient
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.1.1
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.1.1
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: bundler
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.3'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.3'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
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: minitest
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '4.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '4.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: test-unit
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 3.0.2
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 3.0.2
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: test-unit-rr
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 1.0.3
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 1.0.3
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: copyright-header
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: webmock
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: vcr
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: bump
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: yajl-ruby
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - ">="
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0'
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - ">="
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
195
|
+
description: Input plugin to collect Kubernetes metadata
|
196
|
+
email:
|
197
|
+
- sherkhonov@gmail.com
|
198
|
+
executables: []
|
199
|
+
extensions: []
|
200
|
+
extra_rdoc_files: []
|
201
|
+
files:
|
202
|
+
- Gemfile
|
203
|
+
- README.md
|
204
|
+
- Rakefile
|
205
|
+
- fluent-plugin-kubernetes_metadata_input.gemspec
|
206
|
+
- lib/fluent/plugin/in_kubernetes_metadata.rb
|
207
|
+
homepage: https://github.com/t0ffel/fluent-plugin-kubernetes_metadata_input
|
208
|
+
licenses:
|
209
|
+
- ASL2
|
210
|
+
metadata: {}
|
211
|
+
post_install_message:
|
212
|
+
rdoc_options: []
|
213
|
+
require_paths:
|
214
|
+
- lib
|
215
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
216
|
+
requirements:
|
217
|
+
- - ">="
|
218
|
+
- !ruby/object:Gem::Version
|
219
|
+
version: 2.0.0
|
220
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
221
|
+
requirements:
|
222
|
+
- - ">="
|
223
|
+
- !ruby/object:Gem::Version
|
224
|
+
version: '0'
|
225
|
+
requirements: []
|
226
|
+
rubyforge_project:
|
227
|
+
rubygems_version: 2.4.8
|
228
|
+
signing_key:
|
229
|
+
specification_version: 4
|
230
|
+
summary: Input plugin to collect Kubernetes metadata
|
231
|
+
test_files: []
|