fluent-plugin-google-cloud 0.7.2 → 0.7.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6d9571be109300197bc432ba7f561345addc0c2e9b477b676a05c0a56f661b46
4
- data.tar.gz: b18d90aa70e5b25876fbe64912096225c21ad52e3bb81ad056fb0f5938d4efa4
3
+ metadata.gz: fbcd8e43170062fe787c54619c5ad959f0a8d1603fb7dfc2a1c2be5ac7997d4e
4
+ data.tar.gz: d22989b9d59f470ecc3e184bff6bd1bc049f66f0d0e3918a649f36e2cbbd0424
5
5
  SHA512:
6
- metadata.gz: c64ce586b924a3900ea389ab424cf5027e2e5df3703d23afde7f3076c805acc9da6c382256f722ba463e5af64f2dd8f4a311457ceb6276c76c203d2d115b3b8f
7
- data.tar.gz: 144524c87fb2d803591d57fa0f62543a49121a4028ac2cba0efb1cf45a1f7a19a5ae094b0dc3d56651609efc36f143fe0e9aadf02700b88c93d39f0c353780f5
6
+ metadata.gz: b5b5e63ddf4cc5bffcc92ae9a89dc47b25570c4108c5fde3a34a9c3a77b8b15dbeb2832e55295a5b44505fb2b7b3919a521ab89f847642427728f8c698537a1e
7
+ data.tar.gz: 19554fb0fc748dc0a246850053874dcc53dbc7264d4d75d321e0a64c812f2beb887616945d73f104090aae92656386dde464f87b52ffc9e6c745ad72c10d2bf3
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fluent-plugin-google-cloud (0.7.2)
4
+ fluent-plugin-google-cloud (0.7.3)
5
5
  fluentd (= 1.2.5)
6
6
  google-api-client (= 0.23.9)
7
7
  google-cloud-logging (= 1.5.4)
@@ -129,7 +129,7 @@ GEM
129
129
  stackdriver-core (1.3.3)
130
130
  google-cloud-core (~> 1.2)
131
131
  strptime (0.2.3)
132
- test-unit (3.2.8)
132
+ test-unit (3.2.9)
133
133
  power_assert
134
134
  thread_safe (0.3.6)
135
135
  tzinfo (1.2.5)
@@ -137,7 +137,7 @@ GEM
137
137
  tzinfo-data (1.2018.7)
138
138
  tzinfo (>= 1.0.0)
139
139
  uber (0.1.0)
140
- unicode-display_width (1.4.0)
140
+ unicode-display_width (1.4.1)
141
141
  webmock (2.3.2)
142
142
  addressable (>= 2.3.6)
143
143
  crack (>= 0.3.2)
@@ -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.7.2'
13
+ gem.version = '0.7.3'
14
14
  gem.authors = ['Stackdriver Agents Team']
15
15
  gem.email = ['stackdriver-agents@google.com']
16
16
  gem.required_ruby_version = Gem::Requirement.new('>= 2.2')
@@ -186,6 +186,7 @@ module Fluent
186
186
  %w(responseSize response_size parse_int),
187
187
  %w(userAgent user_agent parse_string),
188
188
  %w(remoteIp remote_ip parse_string),
189
+ %w(serverIp server_ip parse_string),
189
190
  %w(referer referer parse_string),
190
191
  %w(cacheHit cache_hit parse_bool),
191
192
  %w(cacheValidatedWithOriginServer
@@ -609,7 +610,14 @@ module Fluent
609
610
  # allow for determining whether we should parse the log or message
610
611
  # field.
611
612
  preserved_keys = [
612
- 'time', 'severity', @trace_key, @span_id_key, @insert_id_key
613
+ 'time',
614
+ 'severity',
615
+ @http_request_key,
616
+ @insert_id_key,
617
+ @operation_key,
618
+ @source_location_key,
619
+ @span_id_key,
620
+ @trace_key
613
621
  ]
614
622
 
615
623
  # If the log is json, we want to export it as a structured log
@@ -612,6 +612,30 @@ module BaseTest
612
612
  end
613
613
  end
614
614
 
615
+ # Verify that when the log has only one effective field (named 'log',
616
+ # 'message', or 'msg') and the field is in JSON format, the field is parsed as
617
+ # JSON and sent as jsonPayload.
618
+ def test_detect_json_auto_triggered_with_one_field
619
+ setup_gce_metadata_stubs
620
+ json_string = '{"msg": "test log entry 0", "tag2": "test", ' \
621
+ '"data": 5000, "some_null_field": null}'
622
+ setup_logging_stubs do
623
+ d = create_driver(DETECT_JSON_CONFIG)
624
+ %w(message log msg).each do |field|
625
+ d.emit(PRESERVED_KEYS_MAP.merge(field => json_string))
626
+ end
627
+ d.run
628
+ end
629
+ verify_log_entries(3, COMPUTE_PARAMS, 'jsonPayload') do |entry|
630
+ fields = get_fields(entry['jsonPayload'])
631
+ assert_equal 4, fields.size, entry
632
+ assert_equal 'test log entry 0', get_string(fields['msg']), entry
633
+ assert_equal 'test', get_string(fields['tag2']), entry
634
+ assert_equal 5000, get_number(fields['data']), entry
635
+ assert_equal null_value, fields['some_null_field'], entry
636
+ end
637
+ end
638
+
615
639
  # Verify that we drop the log entries when 'require_valid_tags' is true and
616
640
  # any non-string tags or tags with non-utf8 characters are detected.
617
641
  def test_reject_invalid_tags_with_require_valid_tags_true
@@ -1219,6 +1243,8 @@ module BaseTest
1219
1243
  verify_log_entries(1, DATAFLOW_PARAMS)
1220
1244
  end
1221
1245
 
1246
+ # Verify the subfields extraction of LogEntry fields.
1247
+
1222
1248
  def test_log_entry_http_request_field_from_record
1223
1249
  verify_subfields_from_record(DEFAULT_HTTP_REQUEST_KEY)
1224
1250
  end
@@ -1231,6 +1257,9 @@ module BaseTest
1231
1257
  verify_subfields_from_record(DEFAULT_OPERATION_KEY)
1232
1258
  end
1233
1259
 
1260
+ # Verify the subfields extraction of LogEntry fields when there are other
1261
+ # fields.
1262
+
1234
1263
  def test_log_entry_http_request_field_partial_from_record
1235
1264
  verify_subfields_partial_from_record(DEFAULT_HTTP_REQUEST_KEY)
1236
1265
  end
@@ -1243,6 +1272,8 @@ module BaseTest
1243
1272
  verify_subfields_partial_from_record(DEFAULT_OPERATION_KEY)
1244
1273
  end
1245
1274
 
1275
+ # Verify the subfields extraction of LogEntry fields when they are not hashes.
1276
+
1246
1277
  def test_log_entry_http_request_field_when_not_hash
1247
1278
  verify_subfields_when_not_hash(DEFAULT_HTTP_REQUEST_KEY)
1248
1279
  end
@@ -1255,6 +1286,8 @@ module BaseTest
1255
1286
  verify_subfields_when_not_hash(DEFAULT_OPERATION_KEY)
1256
1287
  end
1257
1288
 
1289
+ # Verify the subfields extraction of LogEntry fields when they are nil.
1290
+
1258
1291
  def test_log_entry_http_request_field_when_nil
1259
1292
  verify_subfields_when_nil(DEFAULT_HTTP_REQUEST_KEY)
1260
1293
  end
@@ -1324,9 +1357,23 @@ module BaseTest
1324
1357
  end
1325
1358
  end
1326
1359
 
1327
- def test_log_entry_trace_field
1328
- verify_field_key('trace', DEFAULT_TRACE_KEY, 'custom_trace_key',
1329
- CONFIG_CUSTOM_TRACE_KEY_SPECIFIED, TRACE)
1360
+ # Verify the default and customization of LogEntry field extraction key.
1361
+
1362
+ def test_log_entry_insert_id_field
1363
+ verify_field_key('insertId', DEFAULT_INSERT_ID_KEY, 'custom_insert_id_key',
1364
+ CONFIG_CUSTOM_INSERT_ID_KEY_SPECIFIED, INSERT_ID)
1365
+ end
1366
+
1367
+ def test_log_entry_operation_field
1368
+ verify_field_key('operation', DEFAULT_OPERATION_KEY, 'custom_operation_key',
1369
+ CONFIG_CUSTOM_OPERATION_KEY_SPECIFIED, OPERATION_MESSAGE)
1370
+ end
1371
+
1372
+ def test_log_entry_source_location_field
1373
+ verify_field_key('sourceLocation', DEFAULT_SOURCE_LOCATION_KEY,
1374
+ 'custom_source_location_key',
1375
+ CONFIG_CUSTOM_SOURCE_LOCATION_KEY_SPECIFIED,
1376
+ source_location_message)
1330
1377
  end
1331
1378
 
1332
1379
  def test_log_entry_span_id_field
@@ -1334,24 +1381,47 @@ module BaseTest
1334
1381
  CONFIG_CUSTOM_SPAN_ID_KEY_SPECIFIED, SPAN_ID)
1335
1382
  end
1336
1383
 
1337
- def test_log_entry_insert_id_field
1338
- verify_field_key('insertId', DEFAULT_INSERT_ID_KEY, 'custom_insert_id_key',
1339
- CONFIG_CUSTOM_INSERT_ID_KEY_SPECIFIED, INSERT_ID)
1384
+ def test_log_entry_trace_field
1385
+ verify_field_key('trace', DEFAULT_TRACE_KEY, 'custom_trace_key',
1386
+ CONFIG_CUSTOM_TRACE_KEY_SPECIFIED, TRACE)
1340
1387
  end
1341
1388
 
1342
- def test_cascading_json_detection_with_log_entry_trace_field
1389
+ # Verify the cascading JSON detection of LogEntry fields.
1390
+
1391
+ def test_cascading_json_detection_with_log_entry_insert_id_field
1343
1392
  verify_cascading_json_detection_with_log_entry_fields(
1344
- 'trace', DEFAULT_TRACE_KEY, TRACE, TRACE2)
1393
+ 'insertId', DEFAULT_INSERT_ID_KEY,
1394
+ root_level_value: INSERT_ID,
1395
+ nested_level_value: INSERT_ID2)
1396
+ end
1397
+
1398
+ def test_cascading_json_detection_with_log_entry_operation_field
1399
+ verify_cascading_json_detection_with_log_entry_fields(
1400
+ 'operation', DEFAULT_OPERATION_KEY,
1401
+ root_level_value: OPERATION_MESSAGE,
1402
+ nested_level_value: OPERATION_MESSAGE2,
1403
+ expected_value_from_nested: expected_operation_message2)
1404
+ end
1405
+
1406
+ def test_cascading_json_detection_with_log_entry_source_location_field
1407
+ verify_cascading_json_detection_with_log_entry_fields(
1408
+ 'sourceLocation', DEFAULT_SOURCE_LOCATION_KEY,
1409
+ root_level_value: source_location_message,
1410
+ nested_level_value: source_location_message2)
1345
1411
  end
1346
1412
 
1347
1413
  def test_cascading_json_detection_with_log_entry_span_id_field
1348
1414
  verify_cascading_json_detection_with_log_entry_fields(
1349
- 'spanId', DEFAULT_SPAN_ID_KEY, SPAN_ID, SPAN_ID2)
1415
+ 'spanId', DEFAULT_SPAN_ID_KEY,
1416
+ root_level_value: SPAN_ID,
1417
+ nested_level_value: SPAN_ID2)
1350
1418
  end
1351
1419
 
1352
- def test_cascading_json_detection_with_log_entry_insert_id_field
1420
+ def test_cascading_json_detection_with_log_entry_trace_field
1353
1421
  verify_cascading_json_detection_with_log_entry_fields(
1354
- 'insertId', DEFAULT_INSERT_ID_KEY, INSERT_ID, INSERT_ID2)
1422
+ 'trace', DEFAULT_TRACE_KEY,
1423
+ root_level_value: TRACE,
1424
+ nested_level_value: TRACE2)
1355
1425
  end
1356
1426
 
1357
1427
  # Metadata Agent related tests.
@@ -2177,7 +2247,14 @@ module BaseTest
2177
2247
  # left with name "log", "message" or "msg". This test verifies additional
2178
2248
  # LogEntry fields like spanId and traceId do not disable that by accident.
2179
2249
  def verify_cascading_json_detection_with_log_entry_fields(
2180
- log_entry_field, default_key, root_level_value, nested_level_value)
2250
+ log_entry_field, default_key, expectation)
2251
+ root_level_value = expectation[:root_level_value]
2252
+ nested_level_value = expectation[:nested_level_value]
2253
+ expected_value_from_root = expectation.fetch(
2254
+ :expected_value_from_root, root_level_value)
2255
+ expected_value_from_nested = expectation.fetch(
2256
+ :expected_value_from_nested, nested_level_value)
2257
+
2181
2258
  setup_gce_metadata_stubs
2182
2259
 
2183
2260
  # {
@@ -2215,9 +2292,9 @@ module BaseTest
2215
2292
  default_key => root_level_value)
2216
2293
 
2217
2294
  {
2218
- log_entry_with_root_level_field => root_level_value,
2219
- log_entry_with_nested_level_field => nested_level_value,
2220
- log_entry_with_both_level_fields => nested_level_value
2295
+ log_entry_with_root_level_field => expected_value_from_root,
2296
+ log_entry_with_nested_level_field => expected_value_from_nested,
2297
+ log_entry_with_both_level_fields => expected_value_from_nested
2221
2298
  }.each_with_index do |(input_log_entry, expected_value), index|
2222
2299
  setup_logging_stubs do
2223
2300
  @logs_sent = []
@@ -2283,20 +2360,12 @@ module BaseTest
2283
2360
  payload_fields = get_fields(entry['jsonPayload'])
2284
2361
  assert_equal input[:expected_payload].size, payload_fields.size, input
2285
2362
  payload_fields.each do |key, value|
2286
- assert_equal input[:expected_payload][key], get_string(value), input
2363
+ assert_hash_equal_json(input[:expected_payload][key], value)
2287
2364
  end
2288
2365
  end
2289
2366
  end
2290
2367
  end
2291
2368
 
2292
- def http_request_message
2293
- HTTP_REQUEST_MESSAGE
2294
- end
2295
-
2296
- def source_location_message
2297
- SOURCE_LOCATION_MESSAGE
2298
- end
2299
-
2300
2369
  # Replace the 'referer' field with nil.
2301
2370
  def http_request_message_with_nil_referer
2302
2371
  http_request_message.merge('referer' => nil)
@@ -2395,6 +2464,31 @@ module BaseTest
2395
2464
  _undefined
2396
2465
  end
2397
2466
 
2467
+ # Defined in specific gRPC or REST files.
2468
+ def http_request_message
2469
+ _undefined
2470
+ end
2471
+
2472
+ # Defined in specific gRPC or REST files.
2473
+ def source_location_message
2474
+ _undefined
2475
+ end
2476
+
2477
+ # Defined in specific gRPC or REST files.
2478
+ def source_location_message2
2479
+ _undefined
2480
+ end
2481
+
2482
+ # Defined in specific gRPC or REST files.
2483
+ def expected_operation_message2
2484
+ _undefined
2485
+ end
2486
+
2487
+ # Defined in specific gRPC or REST files.
2488
+ def assert_hash_equal_json(_expected, _actual)
2489
+ _undefined
2490
+ end
2491
+
2398
2492
  def _undefined
2399
2493
  raise "Method #{__callee__} is unimplemented and needs to be overridden."
2400
2494
  end
@@ -371,16 +371,24 @@ module Constants
371
371
  label_map { "name": "#{ML_CONSTANTS[:service]}/job_id/log_area" }
372
372
  ).freeze
373
373
 
374
- CONFIG_CUSTOM_TRACE_KEY_SPECIFIED = %(
375
- trace_key custom_trace_key
374
+ CONFIG_CUSTOM_INSERT_ID_KEY_SPECIFIED = %(
375
+ insert_id_key custom_insert_id_key
376
+ ).freeze
377
+
378
+ CONFIG_CUSTOM_OPERATION_KEY_SPECIFIED = %(
379
+ operation_key custom_operation_key
380
+ ).freeze
381
+
382
+ CONFIG_CUSTOM_SOURCE_LOCATION_KEY_SPECIFIED = %(
383
+ source_location_key custom_source_location_key
376
384
  ).freeze
377
385
 
378
386
  CONFIG_CUSTOM_SPAN_ID_KEY_SPECIFIED = %(
379
387
  span_id_key custom_span_id_key
380
388
  ).freeze
381
389
 
382
- CONFIG_CUSTOM_INSERT_ID_KEY_SPECIFIED = %(
383
- insert_id_key custom_insert_id_key
390
+ CONFIG_CUSTOM_TRACE_KEY_SPECIFIED = %(
391
+ trace_key custom_trace_key
384
392
  ).freeze
385
393
 
386
394
  # Service configurations for various services.
@@ -740,6 +748,7 @@ module Constants
740
748
  'responseSize' => 65,
741
749
  'userAgent' => 'USER AGENT 1.0',
742
750
  'remoteIp' => '55.55.55.55',
751
+ 'serverIp' => '66.66.66.66',
743
752
  'referer' => 'http://referer/',
744
753
  'cacheHit' => true,
745
754
  'cacheValidatedWithOriginServer' => true
@@ -751,12 +760,24 @@ module Constants
751
760
  'line' => 18
752
761
  }.freeze
753
762
 
763
+ SOURCE_LOCATION_MESSAGE2 = {
764
+ 'file' => 'src/file',
765
+ 'function' => 'my_func',
766
+ 'line' => 8
767
+ }.freeze
768
+
754
769
  OPERATION_MESSAGE = {
755
770
  'id' => 'op_id',
756
771
  'producer' => 'my/app',
757
772
  'last' => true
758
773
  }.freeze
759
774
 
775
+ OPERATION_MESSAGE2 = {
776
+ 'id' => 'op_id2',
777
+ 'producer' => 'my/app2',
778
+ 'last' => false
779
+ }.freeze
780
+
760
781
  CUSTOM_LABELS_MESSAGE = {
761
782
  'customKey' => 'value'
762
783
  }.freeze
@@ -950,4 +971,15 @@ module Constants
950
971
  'grpc-status-details-bin' => status_details.to_proto
951
972
  }.freeze
952
973
  end
974
+
975
+ PRESERVED_KEYS_MAP = {
976
+ 'time' => K8S_TIMESTAMP,
977
+ 'severity' => CONTAINER_SEVERITY,
978
+ DEFAULT_HTTP_REQUEST_KEY => HTTP_REQUEST_MESSAGE,
979
+ DEFAULT_INSERT_ID_KEY => INSERT_ID,
980
+ DEFAULT_OPERATION_KEY => OPERATION_MESSAGE,
981
+ DEFAULT_SOURCE_LOCATION_KEY => SOURCE_LOCATION_MESSAGE,
982
+ DEFAULT_SPAN_ID_KEY => SPAN_ID,
983
+ DEFAULT_TRACE_KEY => TRACE
984
+ }.freeze
953
985
  end
@@ -407,24 +407,44 @@ class GoogleCloudOutputTest < Test::Unit::TestCase
407
407
  nil
408
408
  end
409
409
 
410
- # 'responseSize' and 'requestSize' are Integers in the gRPC proto, yet Strings
411
- # in REST API client.
412
- # TODO(qingling128): Address this accordingly once the following question is
413
- # answered: https://github.com/google/google-api-ruby-client/issues/619.
414
- # If this discrepancy is legit, add some comments to explain the reason.
415
- # Otherwise once the discrepancy is fixed, we need to upgrade to that version
416
- # and change our tests accordingly.
410
+ # Convert certain fields to strings for compatibility between gRPC and REST.
411
+ # See more details in:
412
+ # https://github.com/google/google-api-ruby-client/issues/619.
413
+ def convert_subfields_to_strings(full_hash, fields_to_convert)
414
+ full_hash.merge(Hash[
415
+ fields_to_convert.collect do |field_name|
416
+ [field_name, full_hash[field_name].to_s]
417
+ end
418
+ ])
419
+ end
420
+
421
+ # 'responseSize' and 'requestSize' are Integers in the gRPC protos, yet
422
+ # Strings in REST API client libraries.
417
423
  def http_request_message
418
- HTTP_REQUEST_MESSAGE.merge(
419
- 'responseSize' => HTTP_REQUEST_MESSAGE['responseSize'].to_s,
420
- 'requestSize' => HTTP_REQUEST_MESSAGE['requestSize'].to_s
421
- )
424
+ convert_subfields_to_strings(
425
+ HTTP_REQUEST_MESSAGE, %w(responseSize requestSize))
422
426
  end
423
427
 
424
428
  # 'line' is an Integer in the gRPC proto, yet a String in the REST API client.
425
429
  def source_location_message
426
- SOURCE_LOCATION_MESSAGE.merge(
427
- 'line' => SOURCE_LOCATION_MESSAGE['line'].to_s
428
- )
430
+ convert_subfields_to_strings(
431
+ SOURCE_LOCATION_MESSAGE, ['line'])
432
+ end
433
+
434
+ # 'line' is an Integer in the gRPC proto, yet a String in the REST API client.
435
+ def source_location_message2
436
+ convert_subfields_to_strings(
437
+ SOURCE_LOCATION_MESSAGE2, ['line'])
438
+ end
439
+
440
+ def expected_operation_message2
441
+ OPERATION_MESSAGE2
442
+ end
443
+
444
+ # Both expected and actual are Ruby hashes that represent JSON
445
+ # objects.
446
+ # This method has a different implementation at the gRPC side.
447
+ def assert_hash_equal_json(expected, actual)
448
+ assert_equal expected, actual, "expected: #{expected}\nactual: #{actual}"
429
449
  end
430
450
  end
@@ -466,8 +466,79 @@ class GoogleCloudOutputGRPCTest < Test::Unit::TestCase
466
466
  field['numberValue']
467
467
  end
468
468
 
469
+ def get_bool(field)
470
+ field['boolValue']
471
+ end
472
+
469
473
  # The null value.
470
474
  def null_value
471
475
  { 'nullValue' => 'NULL_VALUE' }
472
476
  end
477
+
478
+ def http_request_message
479
+ HTTP_REQUEST_MESSAGE
480
+ end
481
+
482
+ def source_location_message
483
+ SOURCE_LOCATION_MESSAGE
484
+ end
485
+
486
+ def source_location_message2
487
+ SOURCE_LOCATION_MESSAGE2
488
+ end
489
+
490
+ def expected_operation_message2
491
+ # 'last' is a boolean field with false as default value. Protobuf omit
492
+ # fields with default values during deserialization.
493
+ OPERATION_MESSAGE2.reject { |k, _| k == 'last' }
494
+ end
495
+
496
+ # expected: A Ruby hash that represents a JSON object.
497
+ # e.g.:
498
+ # {
499
+ # "file" => "source/file",
500
+ # "function" => "my_function",
501
+ # "line" => 18
502
+ # }
503
+ #
504
+ # actual: A Ruby hash that represents a Proto object.
505
+ # e.g.:
506
+ # {
507
+ # "structValue" => {
508
+ # "fields" => {
509
+ # "file" => {
510
+ # "stringValue" => "source/file"
511
+ # },
512
+ # "function" => {
513
+ # "stringValue" => "my_function"
514
+ # },
515
+ # "line" => {
516
+ # "numberValue" => 18
517
+ # }
518
+ # }
519
+ # }
520
+ # }
521
+ # This method has a different implementation at the REST side.
522
+ def assert_hash_equal_json(expected, actual)
523
+ error_message = "expected: #{expected}\nactual: #{actual}"
524
+ assert_true actual.is_a?(Hash),
525
+ "Expect the actual value to be a hash. #{error_message}"
526
+ if actual.key?('stringValue')
527
+ assert_equal expected, get_string(actual), error_message
528
+ elsif actual.key?('numberValue')
529
+ assert_equal expected, get_number(actual), error_message
530
+ elsif actual.key?('boolValue')
531
+ assert_equal expected, get_bool(actual), error_message
532
+ elsif actual.key?('structValue')
533
+ expected_copy = expected.dup
534
+ get_fields(get_struct(actual)).each do |field_name, nested_actual|
535
+ assert_hash_equal_json expected_copy[field_name], nested_actual
536
+ expected_copy.reject! { |k, _| k == field_name }
537
+ end
538
+ # Make sure all fields are matched.
539
+ assert_true expected_copy.empty?
540
+ else
541
+ assert_true false, "Unsupported proto format. #{error_message}"
542
+ end
543
+ end
473
544
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-google-cloud
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.2
4
+ version: 0.7.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stackdriver Agents Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-30 00:00:00.000000000 Z
11
+ date: 2018-12-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluentd