fluent-plugin-google-cloud 0.3.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +107 -0
- data/fluent-plugin-google-cloud.gemspec +1 -1
- data/lib/fluent/plugin/out_google_cloud.rb +28 -3
- data/test/plugin/test_out_google_cloud.rb +20 -2
- metadata +3 -2
data/Gemfile.lock
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
fluent-plugin-google-cloud (0.3.0)
|
5
|
+
fluentd (>= 0.10)
|
6
|
+
google-api-client (>= 0.8)
|
7
|
+
googleauth (~> 0.4)
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: https://rubygems.org/
|
11
|
+
specs:
|
12
|
+
activesupport (4.2.1)
|
13
|
+
i18n (~> 0.7)
|
14
|
+
json (~> 1.7, >= 1.7.7)
|
15
|
+
minitest (~> 5.1)
|
16
|
+
thread_safe (~> 0.3, >= 0.3.4)
|
17
|
+
tzinfo (~> 1.1)
|
18
|
+
addressable (2.3.8)
|
19
|
+
autoparse (0.3.3)
|
20
|
+
addressable (>= 2.3.1)
|
21
|
+
extlib (>= 0.9.15)
|
22
|
+
multi_json (>= 1.0.0)
|
23
|
+
cool.io (1.3.0)
|
24
|
+
crack (0.4.2)
|
25
|
+
safe_yaml (~> 1.0.0)
|
26
|
+
extlib (0.9.16)
|
27
|
+
faraday (0.9.1)
|
28
|
+
multipart-post (>= 1.2, < 3)
|
29
|
+
fluentd (0.12.8)
|
30
|
+
cool.io (>= 1.2.2, < 2.0.0)
|
31
|
+
http_parser.rb (>= 0.5.1, < 0.7.0)
|
32
|
+
json (>= 1.4.3)
|
33
|
+
msgpack (>= 0.5.11, < 0.6.0)
|
34
|
+
sigdump (~> 0.2.2)
|
35
|
+
string-scrub (>= 0.0.3)
|
36
|
+
tzinfo (>= 1.0.0)
|
37
|
+
tzinfo-data (>= 1.0.0)
|
38
|
+
yajl-ruby (~> 1.0)
|
39
|
+
google-api-client (0.8.6)
|
40
|
+
activesupport (>= 3.2)
|
41
|
+
addressable (~> 2.3)
|
42
|
+
autoparse (~> 0.3)
|
43
|
+
extlib (~> 0.9)
|
44
|
+
faraday (~> 0.9)
|
45
|
+
googleauth (~> 0.3)
|
46
|
+
launchy (~> 2.4)
|
47
|
+
multi_json (~> 1.10)
|
48
|
+
retriable (~> 1.4)
|
49
|
+
signet (~> 0.6)
|
50
|
+
googleauth (0.4.1)
|
51
|
+
faraday (~> 0.9)
|
52
|
+
jwt (~> 1.4)
|
53
|
+
logging (~> 2.0)
|
54
|
+
memoist (~> 0.12)
|
55
|
+
multi_json (= 1.11)
|
56
|
+
signet (~> 0.6)
|
57
|
+
http_parser.rb (0.6.0)
|
58
|
+
i18n (0.7.0)
|
59
|
+
json (1.8.2)
|
60
|
+
jwt (1.4.1)
|
61
|
+
launchy (2.4.3)
|
62
|
+
addressable (~> 2.3)
|
63
|
+
little-plugger (1.1.3)
|
64
|
+
logging (2.0.0)
|
65
|
+
little-plugger (~> 1.1)
|
66
|
+
multi_json (~> 1.10)
|
67
|
+
memoist (0.12.0)
|
68
|
+
metaclass (0.0.4)
|
69
|
+
minitest (5.6.1)
|
70
|
+
mocha (1.1.0)
|
71
|
+
metaclass (~> 0.0.1)
|
72
|
+
msgpack (0.5.11)
|
73
|
+
multi_json (1.11.0)
|
74
|
+
multipart-post (2.0.0)
|
75
|
+
power_assert (0.2.3)
|
76
|
+
rake (10.4.2)
|
77
|
+
retriable (1.4.1)
|
78
|
+
safe_yaml (1.0.4)
|
79
|
+
sigdump (0.2.2)
|
80
|
+
signet (0.6.0)
|
81
|
+
addressable (~> 2.3)
|
82
|
+
extlib (~> 0.9)
|
83
|
+
faraday (~> 0.9)
|
84
|
+
jwt (~> 1.0)
|
85
|
+
multi_json (~> 1.10)
|
86
|
+
string-scrub (0.0.5)
|
87
|
+
test-unit (3.0.9)
|
88
|
+
power_assert
|
89
|
+
thread_safe (0.3.5)
|
90
|
+
tzinfo (1.2.2)
|
91
|
+
thread_safe (~> 0.1)
|
92
|
+
tzinfo-data (1.2015.4)
|
93
|
+
tzinfo (>= 1.0.0)
|
94
|
+
webmock (1.21.0)
|
95
|
+
addressable (>= 2.3.6)
|
96
|
+
crack (>= 0.3.2)
|
97
|
+
yajl-ruby (1.2.1)
|
98
|
+
|
99
|
+
PLATFORMS
|
100
|
+
ruby
|
101
|
+
|
102
|
+
DEPENDENCIES
|
103
|
+
fluent-plugin-google-cloud!
|
104
|
+
mocha (~> 1.1)
|
105
|
+
rake (>= 10.3.2)
|
106
|
+
test-unit (~> 3.0.2)
|
107
|
+
webmock (>= 1.17.0)
|
@@ -4,7 +4,7 @@ Gem::Specification.new do |gem|
|
|
4
4
|
gem.summary = %q{Fluentd plugin to stream logs to the Google Cloud Platform's logging API}
|
5
5
|
gem.homepage = 'https://github.com/GoogleCloudPlatform/fluent-plugin-google-cloud'
|
6
6
|
gem.license = 'Apache 2.0'
|
7
|
-
gem.version = '0.3.
|
7
|
+
gem.version = '0.3.1'
|
8
8
|
gem.authors = ['Todd Derr', 'Alex Robinson']
|
9
9
|
gem.email = ['salty@google.com']
|
10
10
|
|
@@ -100,6 +100,7 @@ module Fluent
|
|
100
100
|
init_api_client()
|
101
101
|
|
102
102
|
@successful_call = false
|
103
|
+
@timenanos_warning = false
|
103
104
|
|
104
105
|
if @use_metadata_service
|
105
106
|
# Grab metadata about the Google Compute Engine instance that we're on.
|
@@ -167,10 +168,31 @@ module Fluent
|
|
167
168
|
'entries' => [],
|
168
169
|
}
|
169
170
|
arr.each do |time, record|
|
170
|
-
|
171
|
+
next unless record.is_a? Hash
|
172
|
+
if (record.has_key?('timestamp') &&
|
173
|
+
record['timestamp'].has_key?('seconds') &&
|
174
|
+
record['timestamp'].has_key?('nanos'))
|
175
|
+
ts_secs = record['timestamp']['seconds']
|
176
|
+
ts_nanos = record['timestamp']['nanos']
|
177
|
+
record.delete('timestamp')
|
178
|
+
elsif (record.has_key?('timestampSeconds') &&
|
179
|
+
record.has_key?('timestampNanos'))
|
180
|
+
ts_secs = record['timestampSeconds']
|
181
|
+
ts_nanos = record['timestampNanos']
|
182
|
+
record.delete('timestampSeconds')
|
183
|
+
record.delete('timestampNanos')
|
184
|
+
elsif (record.has_key?('timeNanos'))
|
185
|
+
# This is deprecated since the precision is insufficient.
|
186
|
+
# Use timestampSeconds/timestampNanos instead
|
171
187
|
ts_secs = (record['timeNanos'] / 1000000000).to_i
|
172
188
|
ts_nanos = record['timeNanos'] % 1000000000
|
173
189
|
record.delete('timeNanos')
|
190
|
+
if (!@timenanos_warning)
|
191
|
+
# Warn the user this is deprecated, but only once to avoid spam.
|
192
|
+
@timenanos_warning = true
|
193
|
+
$log.warn ("timeNanos is deprecated - please use " +
|
194
|
+
"timestampSeconds and timestampNanos instead.")
|
195
|
+
end
|
174
196
|
else
|
175
197
|
timestamp = Time.at(time)
|
176
198
|
ts_secs = timestamp.tv_sec
|
@@ -203,6 +225,8 @@ module Fluent
|
|
203
225
|
end
|
204
226
|
write_log_entries_request['entries'].push(entry)
|
205
227
|
end
|
228
|
+
# Don't send an empty request if we rejected all the entries.
|
229
|
+
next if write_log_entries_request['entries'].empty?
|
206
230
|
|
207
231
|
# Add a prefix to VMEngines logs to prevent namespace collisions,
|
208
232
|
# and also escape the log name.
|
@@ -264,7 +288,8 @@ module Fluent
|
|
264
288
|
end
|
265
289
|
|
266
290
|
def fetch_metadata(metadata_path)
|
267
|
-
|
291
|
+
# Fetch GCE metadata - see https://cloud.google.com/compute/docs/metadata
|
292
|
+
open('http://169.254.169.254/computeMetadata/v1/' + metadata_path,
|
268
293
|
{'Metadata-Flavor' => 'Google'}) do |f|
|
269
294
|
f.read
|
270
295
|
end
|
@@ -335,7 +360,7 @@ module Fluent
|
|
335
360
|
def init_api_client
|
336
361
|
@client = Google::APIClient.new(
|
337
362
|
:application_name => 'Fluentd Google Cloud Logging plugin',
|
338
|
-
:application_version => '0.3.
|
363
|
+
:application_version => '0.3.1',
|
339
364
|
:retries => 1)
|
340
365
|
|
341
366
|
if @auth_method == 'private_key'
|
@@ -270,7 +270,7 @@ class GoogleCloudOutputTest < Test::Unit::TestCase
|
|
270
270
|
expected_ts = []
|
271
271
|
emit_index = 0
|
272
272
|
[Time.at(123456.789), Time.at(0), Time.now].each do |ts|
|
273
|
-
# Test
|
273
|
+
# Test the "native" fluentd timestamp as well as our nanosecond tags.
|
274
274
|
d.emit({'message' => log_entry(emit_index)}, ts.to_f)
|
275
275
|
# The native timestamp currently only supports second granularity
|
276
276
|
# (fluentd issue #461), so strip nanoseconds from the expected value.
|
@@ -280,6 +280,14 @@ class GoogleCloudOutputTest < Test::Unit::TestCase
|
|
280
280
|
'timeNanos' => ts.tv_sec * 1000000000 + ts.tv_nsec})
|
281
281
|
expected_ts.push(ts)
|
282
282
|
emit_index += 1
|
283
|
+
d.emit({'message' => log_entry(emit_index),
|
284
|
+
'timestamp' => {'seconds' => ts.tv_sec, 'nanos' => ts.tv_nsec}})
|
285
|
+
expected_ts.push(ts)
|
286
|
+
emit_index += 1
|
287
|
+
d.emit({'message' => log_entry(emit_index),
|
288
|
+
'timestampSeconds' => ts.tv_sec, 'timestampNanos' => ts.tv_nsec})
|
289
|
+
expected_ts.push(ts)
|
290
|
+
emit_index += 1
|
283
291
|
end
|
284
292
|
d.run
|
285
293
|
verify_index = 0
|
@@ -330,6 +338,16 @@ class GoogleCloudOutputTest < Test::Unit::TestCase
|
|
330
338
|
end
|
331
339
|
end
|
332
340
|
|
341
|
+
def test_malformed_log
|
342
|
+
setup_gce_metadata_stubs
|
343
|
+
setup_logging_stubs
|
344
|
+
d = create_driver()
|
345
|
+
# if the entry is not a hash, the plugin should silently drop it.
|
346
|
+
d.emit("a string is not a valid message")
|
347
|
+
d.run
|
348
|
+
assert @logs_sent.empty?
|
349
|
+
end
|
350
|
+
|
333
351
|
def test_client_error
|
334
352
|
setup_gce_metadata_stubs
|
335
353
|
# The API Client should not retry this and the plugin should consume
|
@@ -511,7 +529,7 @@ class GoogleCloudOutputTest < Test::Unit::TestCase
|
|
511
529
|
end
|
512
530
|
|
513
531
|
def stub_metadata_request(metadata_path, response_body)
|
514
|
-
stub_request(:get, 'http://
|
532
|
+
stub_request(:get, 'http://169.254.169.254/computeMetadata/v1/' + metadata_path).
|
515
533
|
to_return(:body => response_body, :status => 200,
|
516
534
|
:headers => {'Content-Length' => response_body.length})
|
517
535
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-google-cloud
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2015-05-
|
13
|
+
date: 2015-05-19 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: fluentd
|
@@ -144,6 +144,7 @@ files:
|
|
144
144
|
- fluent-plugin-google-cloud.gemspec
|
145
145
|
- lib/fluent/plugin/out_google_cloud.rb
|
146
146
|
- CONTRIBUTING
|
147
|
+
- Gemfile.lock
|
147
148
|
- Gemfile
|
148
149
|
- README.rdoc
|
149
150
|
homepage: https://github.com/GoogleCloudPlatform/fluent-plugin-google-cloud
|