fluent-plugin-google-cloud 0.6.19 → 0.6.20

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a6d301ee1e5098270379065a452a62e1764d322e
4
- data.tar.gz: 973c4d138bd5ac58f44c21a49afc3146949446d4
3
+ metadata.gz: 38cbf8464d2ca792e5d134d1edd66a2a4f6654ca
4
+ data.tar.gz: 2d15be19df0ca83a865c0cea38a4199f6ef42b7e
5
5
  SHA512:
6
- metadata.gz: 2d5120e4508b5d218241cdca371b878e64d2d8da6c1a97bc712f845363886e2a8cd96807bc2098ab55232bcf2c7f97b103766ae446b71adea874aa713af5e7db
7
- data.tar.gz: b4a3e052be29fe201d6c7ca3a10893ad53a292fe09ad309e20a04cc7af979d12548b483a3ca72d51734125bc27a35fdefa123d8d315ad210b7b011408597f9d9
6
+ metadata.gz: 04eaab1746f9d66c14cd402fb6f7960affbc2e36ac79ccecc84eb00c8af19e5793f7c591d94cfa1765f7a3f0d8e1807ecd24238a4209f99d29635a61a4793e68
7
+ data.tar.gz: 6a692ee7e882ce8b36e119432229b4fcc3f7aa855c59f1e806943885c465165a10d664b0a42baac1577277039d94ddb0d8f05a7fa035196a55b894d8ad606d1c
@@ -10,7 +10,7 @@ eos
10
10
  gem.homepage =
11
11
  'https://github.com/GoogleCloudPlatform/fluent-plugin-google-cloud'
12
12
  gem.license = 'Apache-2.0'
13
- gem.version = '0.6.19'
13
+ gem.version = '0.6.20'
14
14
  gem.authors = ['Ling Huang', 'Igor Peshansky']
15
15
  gem.email = ['stackdriver-agents@google.com']
16
16
  gem.required_ruby_version = Gem::Requirement.new('>= 2.2')
@@ -156,6 +156,7 @@ module Fluent
156
156
 
157
157
  # Internal constants.
158
158
  module InternalConstants
159
+ CREDENTIALS_PATH_ENV_VAR = 'GOOGLE_APPLICATION_CREDENTIALS'.freeze
159
160
  DEFAULT_LOGGING_API_URL = 'https://logging.googleapis.com'.freeze
160
161
 
161
162
  # The label name of local_resource_id in the json payload. When a record
@@ -226,7 +227,7 @@ module Fluent
226
227
  Fluent::Plugin.register_output('google_cloud', self)
227
228
 
228
229
  PLUGIN_NAME = 'Fluentd Google Cloud Logging plugin'.freeze
229
- PLUGIN_VERSION = '0.6.19'.freeze
230
+ PLUGIN_VERSION = '0.6.20'.freeze
230
231
 
231
232
  # Name of the the Google cloud logging write scope.
232
233
  LOGGING_SCOPE = 'https://www.googleapis.com/auth/logging.write'.freeze
@@ -482,6 +483,12 @@ module Fluent
482
483
 
483
484
  @platform = detect_platform
484
485
 
486
+ # Treat an empty setting of the credentials file path environment variable
487
+ # as unset. This way the googleauth lib could fetch the credentials
488
+ # following the fallback path.
489
+ ENV.delete(CREDENTIALS_PATH_ENV_VAR) if
490
+ ENV[CREDENTIALS_PATH_ENV_VAR] == ''
491
+
485
492
  # Set required variables: @project_id, @vm_id, @vm_name and @zone.
486
493
  set_required_metadata_variables
487
494
 
@@ -804,11 +811,16 @@ module Fluent
804
811
 
805
812
  else
806
813
  # Assume it's a problem with the request itself and don't retry.
807
- increment_failed_requests_count(error.code)
808
- increment_dropped_entries_count(entries_count, error.code)
809
- @log.error "Unknown response code #{error.code} from the server," \
814
+ error_code = if error.respond_to?(:code)
815
+ error.code
816
+ else
817
+ GRPC::Core::StatusCodes::UNKNOWN
818
+ end
819
+ increment_failed_requests_count(error_code)
820
+ increment_dropped_entries_count(entries_count, error_code)
821
+ @log.error "Unknown response code #{error_code} from the server," \
810
822
  " dropping #{entries_count} log message(s)",
811
- error: error.to_s, error_code: error.code.to_s
823
+ error: error.to_s, error_code: error_code.to_s
812
824
  end
813
825
 
814
826
  # Got an unexpected error (not Google::Gax::GaxError) from the
@@ -1451,6 +1463,7 @@ module Fluent
1451
1463
  end
1452
1464
  rescue StandardError => e
1453
1465
  @log.error "Error calling Metadata Agent at #{url}.", error: e
1466
+ nil
1454
1467
  end
1455
1468
 
1456
1469
  # TODO: This functionality should eventually be available in another
@@ -27,7 +27,7 @@ module BaseTest
27
27
  def setup
28
28
  Fluent::Test.setup
29
29
  # delete environment variables that googleauth uses to find credentials.
30
- ENV.delete('GOOGLE_APPLICATION_CREDENTIALS')
30
+ ENV.delete(CREDENTIALS_PATH_ENV_VAR)
31
31
  # service account env.
32
32
  ENV.delete('PRIVATE_KEY_VAR')
33
33
  ENV.delete('CLIENT_EMAIL_VAR')
@@ -229,7 +229,7 @@ module BaseTest
229
229
  send("setup_#{platform}_metadata_stubs")
230
230
  [IAM_CREDENTIALS, NEW_STYLE_CREDENTIALS, LEGACY_CREDENTIALS].each \
231
231
  do |creds|
232
- ENV['GOOGLE_APPLICATION_CREDENTIALS'] = creds[:path]
232
+ ENV[CREDENTIALS_PATH_ENV_VAR] = creds[:path]
233
233
  d = create_driver
234
234
  d.run
235
235
  assert_equal creds[:project_id], d.instance.project_id
@@ -249,7 +249,7 @@ module BaseTest
249
249
 
250
250
  def test_one_log_with_json_credentials
251
251
  setup_gce_metadata_stubs
252
- ENV['GOOGLE_APPLICATION_CREDENTIALS'] = IAM_CREDENTIALS[:path]
252
+ ENV[CREDENTIALS_PATH_ENV_VAR] = IAM_CREDENTIALS[:path]
253
253
  setup_logging_stubs do
254
254
  d = create_driver
255
255
  d.emit('message' => log_entry(0))
@@ -263,7 +263,7 @@ module BaseTest
263
263
  %w(gce_metadata ec2_metadata no_metadata_service).each do |platform|
264
264
  send("setup_#{platform}_stubs")
265
265
  exception_count = 0
266
- ENV['GOOGLE_APPLICATION_CREDENTIALS'] = INVALID_CREDENTIALS[:path]
266
+ ENV[CREDENTIALS_PATH_ENV_VAR] = INVALID_CREDENTIALS[:path]
267
267
  begin
268
268
  create_driver
269
269
  rescue RuntimeError => error
@@ -274,11 +274,21 @@ module BaseTest
274
274
  end
275
275
  end
276
276
 
277
+ def test_unset_or_empty_credentials_path_env_var
278
+ # An empty string should be treated as if it's not set.
279
+ [nil, ''].each do |value|
280
+ ENV[CREDENTIALS_PATH_ENV_VAR] = value
281
+ setup_gce_metadata_stubs
282
+ create_driver
283
+ assert_nil ENV[CREDENTIALS_PATH_ENV_VAR]
284
+ end
285
+ end
286
+
277
287
  def test_one_log_custom_metadata
278
288
  # don't set up any metadata stubs, so the test will fail if we try to
279
289
  # fetch metadata (and explicitly check this as well).
280
290
  Fluent::GoogleCloudOutput.any_instance.expects(:fetch_metadata).never
281
- ENV['GOOGLE_APPLICATION_CREDENTIALS'] = IAM_CREDENTIALS[:path]
291
+ ENV[CREDENTIALS_PATH_ENV_VAR] = IAM_CREDENTIALS[:path]
282
292
  setup_logging_stubs do
283
293
  d = create_driver(NO_METADATA_SERVICE_CONFIG + CUSTOM_METADATA_CONFIG)
284
294
  d.emit('message' => log_entry(0))
@@ -288,7 +298,7 @@ module BaseTest
288
298
  end
289
299
 
290
300
  def test_one_log_ec2
291
- ENV['GOOGLE_APPLICATION_CREDENTIALS'] = IAM_CREDENTIALS[:path]
301
+ ENV[CREDENTIALS_PATH_ENV_VAR] = IAM_CREDENTIALS[:path]
292
302
  setup_ec2_metadata_stubs
293
303
  setup_logging_stubs do
294
304
  d = create_driver(CONFIG_EC2_PROJECT_ID)
@@ -299,7 +309,7 @@ module BaseTest
299
309
  end
300
310
 
301
311
  def test_one_log_ec2_region
302
- ENV['GOOGLE_APPLICATION_CREDENTIALS'] = IAM_CREDENTIALS[:path]
312
+ ENV[CREDENTIALS_PATH_ENV_VAR] = IAM_CREDENTIALS[:path]
303
313
  setup_ec2_metadata_stubs
304
314
  setup_logging_stubs do
305
315
  d = create_driver(CONFIG_EC2_PROJECT_ID_USE_REGION)
@@ -40,7 +40,8 @@ class GoogleCloudOutputGRPCTest < Test::Unit::TestCase
40
40
  GRPC::Core::StatusCodes::ABORTED => 'Aborted',
41
41
  GRPC::Core::StatusCodes::UNAUTHENTICATED => 'Unauthenticated'
42
42
  }.each_with_index do |(code, message), index|
43
- setup_logging_stubs(true, code, message) do
43
+ setup_logging_stubs(
44
+ GRPC::BadStatus.new_status_exception(code, message)) do
44
45
  d = create_driver(USE_GRPC_CONFIG, 'test')
45
46
  # The API Client should not retry this and the plugin should consume the
46
47
  # exception.
@@ -51,12 +52,24 @@ class GoogleCloudOutputGRPCTest < Test::Unit::TestCase
51
52
  end
52
53
  end
53
54
 
55
+ def test_invalid_error
56
+ setup_gce_metadata_stubs
57
+ setup_logging_stubs(RuntimeError.new('Some non-gRPC error')) do
58
+ d = create_driver(USE_GRPC_CONFIG, 'test')
59
+ # The API Client should not retry this and the plugin should consume the
60
+ # exception.
61
+ d.emit('message' => log_entry(0))
62
+ d.run
63
+ end
64
+ assert_equal 1, @failed_attempts.size
65
+ end
66
+
54
67
  def test_partial_success
55
68
  setup_gce_metadata_stubs
56
69
  setup_prometheus
57
70
  setup_logging_stubs(
58
- true, GRPC::Core::StatusCodes::PERMISSION_DENIED,
59
- 'User not authorized.', PARTIAL_SUCCESS_GRPC_METADATA) do
71
+ GRPC::PermissionDenied.new('User not authorized.',
72
+ PARTIAL_SUCCESS_GRPC_METADATA)) do
60
73
  # The API Client should not retry this and the plugin should consume
61
74
  # the exception.
62
75
  d = create_driver(ENABLE_PROMETHEUS_CONFIG)
@@ -93,7 +106,8 @@ class GoogleCloudOutputGRPCTest < Test::Unit::TestCase
93
106
  GRPC::Core::StatusCodes::UNAVAILABLE => 'Unavailable'
94
107
  }.each_with_index do |(code, message), index|
95
108
  exception_count = 0
96
- setup_logging_stubs(true, code, message) do
109
+ setup_logging_stubs(
110
+ GRPC::BadStatus.new_status_exception(code, message)) do
97
111
  d = create_driver(USE_GRPC_CONFIG, 'test')
98
112
  # The API client should retry this once, then throw an exception which
99
113
  # gets propagated through the plugin
@@ -130,7 +144,10 @@ class GoogleCloudOutputGRPCTest < Test::Unit::TestCase
130
144
  ].each do |should_fail, code, request_count, entry_count, metric_values|
131
145
  setup_prometheus
132
146
  (1..request_count).each do
133
- setup_logging_stubs(should_fail, code, 'SomeMessage') do
147
+ setup_logging_stubs(
148
+ if should_fail
149
+ GRPC::BadStatus.new_status_exception(code, 'SomeMessage')
150
+ end) do
134
151
  d = create_driver(USE_GRPC_CONFIG + ENABLE_PROMETHEUS_CONFIG, 'test')
135
152
  (1..entry_count).each do |i|
136
153
  d.emit('message' => log_entry(i.to_s))
@@ -311,10 +328,8 @@ class GoogleCloudOutputGRPCTest < Test::Unit::TestCase
311
328
  # GRPC logging mock that fails and returns server side or client side errors.
312
329
  class GRPCLoggingMockFailingService <
313
330
  Google::Cloud::Logging::V2::LoggingServiceV2Client
314
- def initialize(code, message, metadata, failed_attempts)
315
- @code = code
316
- @message = message
317
- @metadata = metadata
331
+ def initialize(error, failed_attempts)
332
+ @error = error
318
333
  @failed_attempts = failed_attempts
319
334
  super()
320
335
  end
@@ -327,7 +342,7 @@ class GoogleCloudOutputGRPCTest < Test::Unit::TestCase
327
342
  partial_success: nil)
328
343
  @failed_attempts << 1
329
344
  begin
330
- raise GRPC::BadStatus.new_status_exception(@code, @message, @metadata)
345
+ raise @error
331
346
  rescue
332
347
  # Google::Gax::GaxError will wrap the latest thrown exception as @cause.
333
348
  raise Google::Gax::GaxError, @message
@@ -337,17 +352,13 @@ class GoogleCloudOutputGRPCTest < Test::Unit::TestCase
337
352
  end
338
353
 
339
354
  # Set up grpc stubs to mock the external calls.
340
- def setup_logging_stubs(should_fail = false,
341
- code = nil,
342
- message = nil,
343
- metadata = {})
344
- if should_fail
345
- @failed_attempts = []
346
- @grpc_stub = GRPCLoggingMockFailingService.new(
347
- code, message, metadata, @failed_attempts)
348
- else
355
+ def setup_logging_stubs(error = nil)
356
+ if error.nil?
349
357
  @requests_sent = []
350
358
  @grpc_stub = GRPCLoggingMockService.new(@requests_sent)
359
+ else
360
+ @failed_attempts = []
361
+ @grpc_stub = GRPCLoggingMockFailingService.new(error, @failed_attempts)
351
362
  end
352
363
  yield
353
364
  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.6.19
4
+ version: 0.6.20
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ling Huang
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-05-08 00:00:00.000000000 Z
12
+ date: 2018-06-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fluentd