fluent-plugin-gcloud-metadata 1.0.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 +18 -0
- data/.travis.yml +11 -0
- data/Gemfile +8 -0
- data/README.md +22 -0
- data/Rakefile +11 -0
- data/fluent-plugin-gcloud-metadata.gemspec +28 -0
- data/lib/fluent/plugin/filter_gcloud_metadata.rb +56 -0
- data/test/cassettes/metadata.yml +55 -0
- data/test/helper.rb +24 -0
- data/test/plugin/test_filter_gcloud_metadata.rb +78 -0
- metadata +143 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 135a1e2e9934318488499e58501d0cee9617691a
|
4
|
+
data.tar.gz: dcf9c91aae07f032a25d016a01f750eb5525907e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: feac76eca0f0401b2a8d2c2df41c3dfaac295a99f579e65dfd49b538c2d5834eb0d0cb078508857f4f1d81ff71c8688925327bb263825a9686677922fafad4ca
|
7
|
+
data.tar.gz: cccc34125a376067cf8e7e5e31687387bc5e71a5b65dc92a0a85c9d7fdcdab81b8d8d79d4dfca5a6f3768361aeed6aeca65ff377d917351643e96581b400b003
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# Specify your gem's dependencies in fluent-plugin-gcloud-metadata.gemspec
|
4
|
+
gemspec
|
5
|
+
|
6
|
+
gem 'simplecov', require: false
|
7
|
+
gem 'coveralls', require: false
|
8
|
+
gem 'strptime', require: false if RUBY_ENGINE == "ruby" && RUBY_VERSION =~ /^2/
|
data/README.md
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# Fluentd GoogleCloud Metadata Filter Pluging
|
2
|
+
|
3
|
+
[](https://travis-ci.org/tourstream/fluentd-plugin-gcloud-metadata)
|
4
|
+
|
5
|
+
|
6
|
+
The plugin uses the google cloud metadata api in [version1](https://cloud.google.com/compute/docs/storing-retrieving-metadata)
|
7
|
+
|
8
|
+
## Installation
|
9
|
+
```bash
|
10
|
+
gem install fluent-plugin-gcloud-metadata
|
11
|
+
```
|
12
|
+
|
13
|
+
## plugin configuration
|
14
|
+
```
|
15
|
+
<filter **>
|
16
|
+
@type gcloud_metadata
|
17
|
+
<metadata>
|
18
|
+
project_name project/project-id
|
19
|
+
...
|
20
|
+
</metadata>
|
21
|
+
</filter>
|
22
|
+
```
|
data/Rakefile
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path('../lib', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = 'fluent-plugin-gcloud-metadata'
|
6
|
+
s.version = '1.0.0'
|
7
|
+
s.authors = ['engerim']
|
8
|
+
s.email = ['alexander.miehe@tourstream.eu']
|
9
|
+
s.description = %q{gcloud metadata filter plugin for Fluent. The Plugin adds gcloud metadata to the record }
|
10
|
+
s.summary = s.description
|
11
|
+
s.homepage = 'https://github.com/tourstream/fluent-plugin-gcloud-metadata'
|
12
|
+
s.license = 'MIT'
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split($/)
|
15
|
+
s.executables = s.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
16
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
17
|
+
s.require_paths = ['lib']
|
18
|
+
|
19
|
+
s.required_ruby_version = Gem::Requirement.new(">= 2.1".freeze)
|
20
|
+
|
21
|
+
s.add_runtime_dependency 'fluentd', '~> 0.14'
|
22
|
+
|
23
|
+
s.add_development_dependency 'rake', '~> 0'
|
24
|
+
s.add_development_dependency 'webmock', '~> 2.3'
|
25
|
+
s.add_development_dependency 'test-unit', '~> 3.1'
|
26
|
+
s.add_development_dependency 'minitest', '~> 5.8'
|
27
|
+
s.add_development_dependency 'vcr', '~> 3.0'
|
28
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'fluent/filter'
|
2
|
+
require 'net/http'
|
3
|
+
require 'uri'
|
4
|
+
|
5
|
+
module Fluent
|
6
|
+
|
7
|
+
class GcloudMetadataFilter < Fluent::Filter
|
8
|
+
class ConnectionFailure < StandardError; end
|
9
|
+
Fluent::Plugin.register_filter('gcloud_metadata', self)
|
10
|
+
|
11
|
+
def configure(conf)
|
12
|
+
super
|
13
|
+
@map = {}
|
14
|
+
@cache = {}
|
15
|
+
# <record></record> directive
|
16
|
+
conf.elements.select { |element| element.name == 'metadata' }.each do |element|
|
17
|
+
element.each_pair do |k, v|
|
18
|
+
element.has_key?(k) # to suppress unread configuration warning
|
19
|
+
@map[k] = v
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def filter(tag, time, record)
|
25
|
+
@map.each do |recordName, pathSegment|
|
26
|
+
|
27
|
+
if @cache.has_key?(recordName)
|
28
|
+
record[recordName] = @cache[recordName]
|
29
|
+
next
|
30
|
+
end
|
31
|
+
|
32
|
+
begin
|
33
|
+
uri = URI.parse("http://metadata.google.internal/computeMetadata/v1/#{pathSegment}")
|
34
|
+
request = Net::HTTP::Get.new(uri)
|
35
|
+
request['Metadata-Flavor'] = 'Google'
|
36
|
+
|
37
|
+
req_options = {
|
38
|
+
use_ssl: uri.scheme == 'https',
|
39
|
+
}
|
40
|
+
|
41
|
+
response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
|
42
|
+
http.request(request)
|
43
|
+
end
|
44
|
+
|
45
|
+
record[recordName] = response.body
|
46
|
+
@cache[recordName] = record[recordName]
|
47
|
+
rescue => e
|
48
|
+
log.warn "failed to get metadata for #{recordName} from #{pathSegment}. ", error: e
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
record
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: http://metadata.google.internal/computeMetadata/v1/project/project-id
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Metadata-Flavor:
|
11
|
+
- "Google"
|
12
|
+
User-Agent:
|
13
|
+
- Ruby
|
14
|
+
response:
|
15
|
+
status:
|
16
|
+
code: 200
|
17
|
+
message: OK
|
18
|
+
headers:
|
19
|
+
Content-Type:
|
20
|
+
- application/text
|
21
|
+
Date:
|
22
|
+
- Fri, 08 May 2015 10:35:37 GMT
|
23
|
+
body:
|
24
|
+
encoding: UTF-8
|
25
|
+
string: foobar_project
|
26
|
+
|
27
|
+
http_version:
|
28
|
+
recorded_at: Tue, 23 May 2017 04:58:44 GMT
|
29
|
+
|
30
|
+
- request:
|
31
|
+
method: get
|
32
|
+
uri: http://metadata.google.internal/computeMetadata/v1/instance/attributes/cluster-name
|
33
|
+
body:
|
34
|
+
encoding: UTF-8
|
35
|
+
string: ''
|
36
|
+
headers:
|
37
|
+
Metadata-Flavor:
|
38
|
+
- "Google"
|
39
|
+
User-Agent:
|
40
|
+
- Ruby
|
41
|
+
response:
|
42
|
+
status:
|
43
|
+
code: 200
|
44
|
+
message: OK
|
45
|
+
headers:
|
46
|
+
Content-Type:
|
47
|
+
- application/text
|
48
|
+
Date:
|
49
|
+
- Fri, 08 May 2015 10:35:37 GMT
|
50
|
+
body:
|
51
|
+
encoding: UTF-8
|
52
|
+
string: testing
|
53
|
+
|
54
|
+
http_version:
|
55
|
+
recorded_at: Tue, 23 May 2017 04:58:44 GMT
|
data/test/helper.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# simplecov must be loaded before any of target code
|
2
|
+
#if ENV['SIMPLE_COV']
|
3
|
+
require 'simplecov'
|
4
|
+
if defined?(SimpleCov::SourceFile)
|
5
|
+
mod = SimpleCov::SourceFile
|
6
|
+
def mod.new(*args, &block)
|
7
|
+
m = allocate
|
8
|
+
m.instance_eval do
|
9
|
+
begin
|
10
|
+
initialize(*args, &block)
|
11
|
+
rescue Encoding::UndefinedConversionError
|
12
|
+
@src = "".force_encoding('UTF-8')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
m
|
16
|
+
end
|
17
|
+
end
|
18
|
+
unless SimpleCov.running
|
19
|
+
SimpleCov.start do
|
20
|
+
add_filter '/test/'
|
21
|
+
add_filter '/gems/'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
#end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require_relative '../helper'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'fluent/test'
|
4
|
+
require 'fluent/plugin/filter_gcloud_metadata'
|
5
|
+
require 'vcr'
|
6
|
+
|
7
|
+
VCR.configure do |config|
|
8
|
+
config.cassette_library_dir = 'test/cassettes'
|
9
|
+
config.hook_into :webmock
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
class TestGcloudMetadataFilter < Test::Unit::TestCase
|
14
|
+
|
15
|
+
def setup
|
16
|
+
Fluent::Test.setup
|
17
|
+
end
|
18
|
+
|
19
|
+
CONFIG = %[
|
20
|
+
<metadata>
|
21
|
+
gce_project project/project-id
|
22
|
+
environment instance/attributes/cluster-name
|
23
|
+
</metadata>
|
24
|
+
]
|
25
|
+
|
26
|
+
def create_driver(conf = CONFIG, tag='test.input')
|
27
|
+
Fluent::Test::FilterTestDriver.new(Fluent::GcloudMetadataFilter, tag).configure(conf)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_filter_metadata
|
31
|
+
|
32
|
+
input = {'message' => 'foobar'}
|
33
|
+
|
34
|
+
d = create_driver
|
35
|
+
VCR.use_cassette('metadata', :allow_unused_http_interactions => false) do
|
36
|
+
d.run do
|
37
|
+
d.filter input
|
38
|
+
end
|
39
|
+
end
|
40
|
+
expected = {'message' => 'foobar', 'gce_project' => 'foobar_project', 'environment' => 'testing'}
|
41
|
+
|
42
|
+
assert_equal expected, d.filtered_as_array[0][2]
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_filter_metadata_with_cache
|
46
|
+
|
47
|
+
inputs = [
|
48
|
+
{'message' => 'foobar'},
|
49
|
+
{'message' => 'foobar2'},
|
50
|
+
]
|
51
|
+
|
52
|
+
d = create_driver
|
53
|
+
VCR.use_cassette('metadata', :allow_unused_http_interactions => false) do
|
54
|
+
d.run do
|
55
|
+
inputs.each do |dat|
|
56
|
+
d.filter dat
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
expected = {'message' => 'foobar2', 'gce_project' => 'foobar_project', 'environment' => 'testing'}
|
61
|
+
|
62
|
+
assert_equal expected, d.filtered_as_array[1][2]
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_filter_return_orignal_record_for_error
|
66
|
+
|
67
|
+
input = {'message' => 'foobar'}
|
68
|
+
|
69
|
+
d = create_driver
|
70
|
+
d.run do
|
71
|
+
d.filter input
|
72
|
+
end
|
73
|
+
|
74
|
+
expected = {'message' => 'foobar'}
|
75
|
+
|
76
|
+
assert_equal expected, d.filtered_as_array[0][2]
|
77
|
+
end
|
78
|
+
end
|
metadata
ADDED
@@ -0,0 +1,143 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fluent-plugin-gcloud-metadata
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- engerim
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-05-23 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.14'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.14'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
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: webmock
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.3'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.3'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: test-unit
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.1'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.1'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: minitest
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '5.8'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '5.8'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: vcr
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '3.0'
|
97
|
+
description: 'gcloud metadata filter plugin for Fluent. The Plugin adds gcloud metadata
|
98
|
+
to the record '
|
99
|
+
email:
|
100
|
+
- alexander.miehe@tourstream.eu
|
101
|
+
executables: []
|
102
|
+
extensions: []
|
103
|
+
extra_rdoc_files: []
|
104
|
+
files:
|
105
|
+
- ".gitignore"
|
106
|
+
- ".travis.yml"
|
107
|
+
- Gemfile
|
108
|
+
- README.md
|
109
|
+
- Rakefile
|
110
|
+
- fluent-plugin-gcloud-metadata.gemspec
|
111
|
+
- lib/fluent/plugin/filter_gcloud_metadata.rb
|
112
|
+
- test/cassettes/metadata.yml
|
113
|
+
- test/helper.rb
|
114
|
+
- test/plugin/test_filter_gcloud_metadata.rb
|
115
|
+
homepage: https://github.com/tourstream/fluent-plugin-gcloud-metadata
|
116
|
+
licenses:
|
117
|
+
- MIT
|
118
|
+
metadata: {}
|
119
|
+
post_install_message:
|
120
|
+
rdoc_options: []
|
121
|
+
require_paths:
|
122
|
+
- lib
|
123
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: '2.1'
|
128
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - ">="
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '0'
|
133
|
+
requirements: []
|
134
|
+
rubyforge_project:
|
135
|
+
rubygems_version: 2.6.11
|
136
|
+
signing_key:
|
137
|
+
specification_version: 4
|
138
|
+
summary: gcloud metadata filter plugin for Fluent. The Plugin adds gcloud metadata
|
139
|
+
to the record
|
140
|
+
test_files:
|
141
|
+
- test/cassettes/metadata.yml
|
142
|
+
- test/helper.rb
|
143
|
+
- test/plugin/test_filter_gcloud_metadata.rb
|