fluent-plugin-google-cloud 0.5.5.pre.1 → 0.5.5.pre.2

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
  SHA1:
3
- metadata.gz: 04347e11378a890ae709eb943fae378e4c653948
4
- data.tar.gz: 48f4f8d264c03eb6d4fe6d16cc19f29bbf64b4fb
3
+ metadata.gz: 08888a8334b99ea4dfcf75f9cca5e4bd9c3adfb2
4
+ data.tar.gz: 3ad4733b6f10307039d813527044a3450443fe1a
5
5
  SHA512:
6
- metadata.gz: 9a1baec70a6600ef0b3f086ec1b21ccce2159252da2ff820eaad55a83a8a12eafed606b9336fa43fbaa6ffdc9e5061738f3d74327c4d59e3a79e8267457e3d81
7
- data.tar.gz: d50f6e7f48c8117b6183d8adb91c5b329f9ec58b48c023f4665412f7c293dcd6be50ce7c8bcd3763c17cfb108d5027b131f82270830e1920a34f0c16f660d0af
6
+ metadata.gz: adf57d8a4cf841974cf4992587134a0b335e86b2ca473bda6dc6edbf8cbc9f254e9a0699076d2a9e74f10969eadd07dce054e76bd5fd50fe6c62b2dce5f3c7d8
7
+ data.tar.gz: dea62f362060c090a560a5da926f90054c89874759c28cbe0b3b7bf523672184d5eaac738d98be55a0fa25e55d2e89251dd130bb5234ab76e84698a4bbd9335b
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fluent-plugin-google-cloud (0.5.5.pre.1)
4
+ fluent-plugin-google-cloud (0.5.5.pre.2)
5
5
  fluentd (~> 0.10)
6
6
  google-api-client (> 0.9)
7
7
  googleapis-common-protos (~> 1.3)
@@ -32,7 +32,7 @@ GEM
32
32
  tzinfo (~> 1.0)
33
33
  tzinfo-data (~> 1.0)
34
34
  yajl-ruby (~> 1.0)
35
- google-api-client (0.9.26)
35
+ google-api-client (0.9.28)
36
36
  addressable (~> 2.3)
37
37
  googleauth (~> 0.5)
38
38
  httpclient (~> 2.7)
@@ -41,7 +41,7 @@ GEM
41
41
  mime-types (>= 1.6)
42
42
  representable (~> 2.3.0)
43
43
  retriable (~> 2.0)
44
- google-protobuf (3.0.2)
44
+ google-protobuf (3.0.2-x86_64-linux)
45
45
  googleapis-common-protos (1.3.4)
46
46
  google-protobuf (~> 3.0)
47
47
  grpc (~> 1.0)
@@ -53,7 +53,7 @@ GEM
53
53
  multi_json (~> 1.11)
54
54
  os (~> 0.9)
55
55
  signet (~> 0.7)
56
- grpc (1.0.1)
56
+ grpc (1.0.1-x86_64-linux)
57
57
  google-protobuf (~> 3.0.2)
58
58
  googleauth (~> 0.5.1)
59
59
  hashdiff (0.3.2)
@@ -77,7 +77,7 @@ GEM
77
77
  multi_json (1.12.1)
78
78
  multipart-post (2.0.0)
79
79
  os (0.9.6)
80
- parser (2.3.3.1)
80
+ parser (2.4.0.0)
81
81
  ast (~> 2.2)
82
82
  power_assert (1.0.1)
83
83
  powerpack (0.1.1)
@@ -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.5.5.pre.1'
13
+ gem.version = '0.5.5.pre.2'
14
14
  gem.authors = ['Todd Derr', 'Alex Robinson']
15
15
  gem.email = ['salty@google.com']
16
16
  gem.required_ruby_version = Gem::Requirement.new('>= 2.0')
@@ -39,7 +39,7 @@ module Fluent
39
39
  Fluent::Plugin.register_output('google_cloud', self)
40
40
 
41
41
  PLUGIN_NAME = 'Fluentd Google Cloud Logging plugin'
42
- PLUGIN_VERSION = '0.5.5.pre.1'
42
+ PLUGIN_VERSION = '0.5.5.pre.2'
43
43
 
44
44
  # Constants for service names.
45
45
  APPENGINE_SERVICE = 'appengine.googleapis.com'
@@ -87,6 +87,11 @@ module Fluent
87
87
  # The subservice_name overrides the subservice detection, if provided.
88
88
  config_param :subservice_name, :string, :default => nil
89
89
 
90
+ # Whether to reject log entries with invalid tags. If this option is set to
91
+ # false, tags will be made valid by converting any non-string tag to a
92
+ # string, and sanitizing any non-utf8 or other invalid characters.
93
+ config_param :require_valid_tags, :bool, :default => false
94
+
90
95
  # The regular expression to use on Kubernetes logs to extract some basic
91
96
  # information about the log source. The regex must contain capture groups
92
97
  # for pod_name, namespace_name, and container_name.
@@ -334,12 +339,32 @@ module Fluent
334
339
  [tag, time, record].to_msgpack
335
340
  end
336
341
 
342
+ # Given a tag, returns the corresponding valid tag if possible, or nil if
343
+ # the tag should be rejected. If 'require_valid_tags' is false, non-string
344
+ # tags are converted to strings, and invalid characters are sanitized;
345
+ # otherwise such tags are rejected.
346
+ def sanitize_tag(tag)
347
+ if @require_valid_tags &&
348
+ (!tag.is_a?(String) || tag == '' || convert_to_utf8(tag) != tag)
349
+ return nil
350
+ end
351
+ tag = convert_to_utf8(tag.to_s)
352
+ tag = '_' if tag == ''
353
+ tag
354
+ end
355
+
337
356
  def write(chunk)
338
357
  # Group the entries since we have to make one call per tag.
339
358
  grouped_entries = {}
340
359
  chunk.msgpack_each do |tag, *arr|
341
- grouped_entries[tag] = [] unless grouped_entries.key?(tag)
342
- grouped_entries[tag].push(arr)
360
+ sanitized_tag = sanitize_tag(tag)
361
+ if sanitized_tag.nil?
362
+ @log.warn "Dropping log entries with invalid tag: '#{tag}'. " \
363
+ 'A tag should be a string with utf8 characters.'
364
+ next
365
+ end
366
+ grouped_entries[sanitized_tag] ||= []
367
+ grouped_entries[sanitized_tag].push(arr)
343
368
  end
344
369
 
345
370
  grouped_entries.each do |tag, arr|
@@ -504,10 +529,9 @@ module Fluent
504
529
  labels_utf8_pairs = labels.map do |k, v|
505
530
  [k.encode('utf-8'), convert_to_utf8(v)]
506
531
  end
507
- utf8_log_name = convert_to_utf8(log_name)
508
532
 
509
533
  write_request = Google::Logging::V1::WriteLogEntriesRequest.new(
510
- log_name: "projects/#{@project_id}/logs/#{utf8_log_name}",
534
+ log_name: "projects/#{@project_id}/logs/#{log_name}",
511
535
  common_labels: Hash[labels_utf8_pairs],
512
536
  entries: entries
513
537
  )
@@ -986,7 +1010,7 @@ module Fluent
986
1010
 
987
1011
  def field_to_label(record, field, labels, label)
988
1012
  return unless record.key?(field)
989
- labels[label] = record[field].to_s
1013
+ labels[label] = convert_to_utf8(record[field].to_s)
990
1014
  record.delete(field)
991
1015
  end
992
1016
 
@@ -1081,18 +1105,22 @@ module Fluent
1081
1105
 
1082
1106
  def log_name(tag, common_labels)
1083
1107
  if @service_name == CLOUDFUNCTIONS_SERVICE
1084
- return 'cloud-functions'
1108
+ tag = 'cloud-functions'
1085
1109
  elsif @running_on_managed_vm
1086
1110
  # Add a prefix to Managed VM logs to prevent namespace collisions.
1087
- return "#{APPENGINE_SERVICE}/#{tag}"
1111
+ tag = "#{APPENGINE_SERVICE}/#{tag}"
1088
1112
  elsif @service_name == CONTAINER_SERVICE
1089
1113
  # For Kubernetes logs, use just the container name as the log name
1090
1114
  # if we have it.
1091
1115
  container_name_key = "#{CONTAINER_SERVICE}/container_name"
1092
1116
  if common_labels && common_labels.key?(container_name_key)
1093
- return common_labels[container_name_key]
1117
+ sanitized_log_name = sanitize_tag(common_labels[container_name_key])
1118
+ tag = sanitized_log_name unless sanitized_log_name.nil?
1094
1119
  end
1095
1120
  end
1121
+ # Only encode the log name for the grpc path, since the non-grpc client
1122
+ # lib already handles encoding.
1123
+ tag = ERB::Util.url_encode(tag) if @use_grpc
1096
1124
  tag
1097
1125
  end
1098
1126
 
@@ -128,6 +128,10 @@ module BaseTest
128
128
  )
129
129
  # rubocop:enable Metrics/LineLength
130
130
 
131
+ REQUIRE_VALID_TAGS_CONFIG = %(
132
+ require_valid_tags true
133
+ )
134
+
131
135
  NO_METADATA_SERVICE_CONFIG = %(
132
136
  use_metadata_service false
133
137
  )
@@ -320,6 +324,30 @@ module BaseTest
320
324
  'cacheValidatedWithOriginServer' => true
321
325
  }
322
326
 
327
+ # Tags and their sanitized and encoded version.
328
+ VALID_TAGS = {
329
+ 'test' => 'test',
330
+ 'germanß' => 'german%C3%9F',
331
+ 'chinese中' => 'chinese%E4%B8%AD',
332
+ 'specialCharacter/_-.' => 'specialCharacter%2F_-.',
333
+ 'abc@&^$*' => 'abc%40%26%5E%24%2A',
334
+ '@&^$*' => '%40%26%5E%24%2A'
335
+ }
336
+ INVALID_TAGS = {
337
+ # Non-string tags.
338
+ 123 => '123',
339
+ 1.23 => '1.23',
340
+ [1, 2, 3] => '%5B1%2C%202%2C%203%5D',
341
+ { key: 'value' } => '%7B%22key%22%3D%3E%22value%22%7D',
342
+ # Non-utf8 string tags.
343
+ "nonutf8#{[0x92].pack('C*')}" => 'nonutf8%20',
344
+ "abc#{[0x92].pack('C*')}" => 'abc%20',
345
+ "#{[0x92].pack('C*')}" => '%20',
346
+ # Empty string tag.
347
+ '' => '_'
348
+ }
349
+ ALL_TAGS = VALID_TAGS.merge(INVALID_TAGS)
350
+
323
351
  # Shared tests.
324
352
 
325
353
  def test_configure_service_account_application_default
@@ -626,6 +654,157 @@ module BaseTest
626
654
  end
627
655
  end
628
656
 
657
+ # Verify that we drop the log entries when 'require_valid_tags' is true and
658
+ # any non-string tags or tags with non-utf8 characters are detected.
659
+ def test_reject_invalid_tags_with_require_valid_tags_true
660
+ setup_gce_metadata_stubs
661
+ INVALID_TAGS.keys.each do |tag|
662
+ setup_logging_stubs do
663
+ @logs_sent = []
664
+ d = create_driver(REQUIRE_VALID_TAGS_CONFIG, tag)
665
+ d.emit('msg' => log_entry(0))
666
+ d.run
667
+ end
668
+ verify_log_entries(0, COMPUTE_PARAMS, 'structPayload')
669
+ end
670
+ end
671
+
672
+ # Verify that empty string container name should fail the kubernetes regex
673
+ # match, thus the original tag is used as the log name.
674
+ def test_handle_empty_container_name
675
+ setup_gce_metadata_stubs
676
+ setup_container_metadata_stubs
677
+ container_name = ''
678
+ # This tag will not match the kubernetes regex because it requires a
679
+ # non-empty container name.
680
+ tag = container_tag_with_container_name(container_name)
681
+ params = CONTAINER_FROM_METADATA_PARAMS.merge(
682
+ labels: CONTAINER_FROM_METADATA_PARAMS[:labels].merge(
683
+ "#{CONTAINER_SERVICE_NAME}/container_name" => container_name),
684
+ log_name: tag)
685
+ setup_logging_stubs([params]) do
686
+ @logs_sent = []
687
+ d = create_driver(REQUIRE_VALID_TAGS_CONFIG, tag)
688
+ d.emit(container_log_entry_with_metadata(log_entry(0), container_name))
689
+ d.run
690
+ end
691
+ verify_log_entries(1, params, 'textPayload')
692
+ assert_equal "projects/#{PROJECT_ID}/logs/#{tag}", @logs_sent[0]['logName']
693
+ end
694
+
695
+ # Verify that container names with non-utf8 characters should be rejected when
696
+ # 'require_valid_tags' is true.
697
+ def test_reject_non_utf8_container_name_with_require_valid_tags_true
698
+ setup_gce_metadata_stubs
699
+ setup_container_metadata_stubs
700
+ non_utf8_tags = INVALID_TAGS.select do |tag, _|
701
+ tag.is_a?(String) && !tag.empty?
702
+ end
703
+ non_utf8_tags.each do |container_name, encoded_name|
704
+ params = CONTAINER_FROM_METADATA_PARAMS.merge(
705
+ labels: CONTAINER_FROM_METADATA_PARAMS[:labels].merge(
706
+ "#{CONTAINER_SERVICE_NAME}/container_name" =>
707
+ URI.decode(encoded_name)),
708
+ log_name: encoded_name)
709
+ setup_logging_stubs([params]) do
710
+ @logs_sent = []
711
+ d = create_driver(REQUIRE_VALID_TAGS_CONFIG,
712
+ container_tag_with_container_name(container_name))
713
+ d.emit(container_log_entry_with_metadata(log_entry(0), container_name))
714
+ d.run
715
+ end
716
+ verify_log_entries(0, params, 'textPayload')
717
+ end
718
+ end
719
+
720
+ # Verify that tags are properly encoded. When 'require_valid_tags' is true, we
721
+ # only accept string tags with utf8 characters.
722
+ def test_encode_tags_with_require_valid_tags_true
723
+ setup_gce_metadata_stubs
724
+ VALID_TAGS.each do |tag, encoded_tag|
725
+ setup_logging_stubs([COMPUTE_PARAMS.merge(log_name: encoded_tag)]) do
726
+ @logs_sent = []
727
+ d = create_driver(REQUIRE_VALID_TAGS_CONFIG, tag)
728
+ d.emit('msg' => log_entry(0))
729
+ d.run
730
+ end
731
+ verify_log_entries(1, COMPUTE_PARAMS, 'structPayload')
732
+ assert_equal "projects/#{PROJECT_ID}/logs/#{encoded_tag}",
733
+ @logs_sent[0]['logName']
734
+ end
735
+ end
736
+
737
+ # Verify that tags extracted from container names are properly encoded.
738
+ def test_encode_tags_from_container_name_with_require_valid_tags_true
739
+ setup_gce_metadata_stubs
740
+ setup_container_metadata_stubs
741
+ VALID_TAGS.each do |tag, encoded_tag|
742
+ params = CONTAINER_FROM_METADATA_PARAMS.merge(
743
+ labels: CONTAINER_FROM_METADATA_PARAMS[:labels].merge(
744
+ "#{CONTAINER_SERVICE_NAME}/container_name" => tag),
745
+ log_name: encoded_tag)
746
+ setup_logging_stubs([params]) do
747
+ @logs_sent = []
748
+ d = create_driver(REQUIRE_VALID_TAGS_CONFIG,
749
+ container_tag_with_container_name(tag))
750
+ d.emit(container_log_entry_with_metadata(log_entry(0), tag))
751
+ d.run
752
+ end
753
+ verify_log_entries(1, params, 'textPayload')
754
+ assert_equal "projects/#{PROJECT_ID}/logs/#{encoded_tag}",
755
+ @logs_sent[0]['logName']
756
+ end
757
+ end
758
+
759
+ # Verify that tags are properly encoded and sanitized. When
760
+ # 'require_valid_tags' is false, we try to convert any non-string tags to
761
+ # strings, and replace non-utf8 characters with a replacement string.
762
+ def test_sanitize_tags_with_require_valid_tags_false
763
+ setup_gce_metadata_stubs
764
+ ALL_TAGS.each do |tag, sanitized_tag|
765
+ setup_logging_stubs([COMPUTE_PARAMS.merge(log_name: sanitized_tag)]) do
766
+ @logs_sent = []
767
+ d = create_driver(APPLICATION_DEFAULT_CONFIG, tag)
768
+ d.emit('msg' => log_entry(0))
769
+ d.run
770
+ end
771
+ verify_log_entries(1, COMPUTE_PARAMS, 'structPayload')
772
+ assert_equal "projects/#{PROJECT_ID}/logs/#{sanitized_tag}",
773
+ @logs_sent[0]['logName']
774
+ end
775
+ end
776
+
777
+ # Verify that tags extracted from container names are properly encoded and
778
+ # sanitized.
779
+ def test_sanitize_tags_from_container_name_with_require_valid_tags_false
780
+ setup_gce_metadata_stubs
781
+ setup_container_metadata_stubs
782
+ # Log names are derived from container names for containers. And container
783
+ # names are extracted from the tag based on a regex match pattern. As a
784
+ # prerequisite, the tag should already be a string, thus we only test
785
+ # non-empty string cases here.
786
+ string_tags = ALL_TAGS.select { |tag, _| tag.is_a?(String) && !tag.empty? }
787
+ string_tags.each do |container_name, encoded_container_name|
788
+ # Container name in the label is sanitized but not encoded, while the log
789
+ # name is encoded.
790
+ params = CONTAINER_FROM_METADATA_PARAMS.merge(
791
+ labels: CONTAINER_FROM_METADATA_PARAMS[:labels].merge(
792
+ "#{CONTAINER_SERVICE_NAME}/container_name" =>
793
+ URI.decode(encoded_container_name)),
794
+ log_name: encoded_container_name)
795
+ setup_logging_stubs([params]) do
796
+ @logs_sent = []
797
+ d = create_driver(APPLICATION_DEFAULT_CONFIG,
798
+ container_tag_with_container_name(container_name))
799
+ d.emit(container_log_entry_with_metadata(log_entry(0), container_name))
800
+ d.run
801
+ end
802
+ verify_log_entries(1, params, 'textPayload')
803
+ assert_equal "projects/#{PROJECT_ID}/logs/#{encoded_container_name}",
804
+ @logs_sent[0]['logName']
805
+ end
806
+ end
807
+
629
808
  def test_timestamps
630
809
  setup_gce_metadata_stubs
631
810
  expected_ts = []
@@ -1196,7 +1375,13 @@ module BaseTest
1196
1375
  CLOUDFUNCTIONS_REGION)
1197
1376
  end
1198
1377
 
1199
- def container_log_entry_with_metadata(log)
1378
+ def container_tag_with_container_name(container_name)
1379
+ "kubernetes.#{CONTAINER_POD_NAME}_#{CONTAINER_NAMESPACE_NAME}_" \
1380
+ "#{container_name}"
1381
+ end
1382
+
1383
+ def container_log_entry_with_metadata(
1384
+ log, container_name = CONTAINER_CONTAINER_NAME)
1200
1385
  {
1201
1386
  log: log,
1202
1387
  stream: CONTAINER_STREAM,
@@ -1206,7 +1391,7 @@ module BaseTest
1206
1391
  namespace_name: CONTAINER_NAMESPACE_NAME,
1207
1392
  pod_id: CONTAINER_POD_ID,
1208
1393
  pod_name: CONTAINER_POD_NAME,
1209
- container_name: CONTAINER_CONTAINER_NAME,
1394
+ container_name: container_name,
1210
1395
  labels: {
1211
1396
  CONTAINER_LABEL_KEY => CONTAINER_LABEL_VALUE
1212
1397
  }
@@ -229,12 +229,15 @@ class GoogleCloudOutputTest < Test::Unit::TestCase
229
229
  end
230
230
 
231
231
  # Set up http stubs to mock the external calls.
232
- def setup_logging_stubs
233
- [COMPUTE_PARAMS, VMENGINE_PARAMS, CONTAINER_FROM_TAG_PARAMS,
234
- CONTAINER_FROM_METADATA_PARAMS, CLOUDFUNCTIONS_PARAMS, CUSTOM_PARAMS,
235
- EC2_PARAMS].each do |params|
232
+ def setup_logging_stubs(override_stub_params = nil)
233
+ stub_params = override_stub_params || \
234
+ [COMPUTE_PARAMS, VMENGINE_PARAMS, CONTAINER_FROM_TAG_PARAMS,
235
+ CONTAINER_FROM_METADATA_PARAMS, CLOUDFUNCTIONS_PARAMS,
236
+ CUSTOM_PARAMS, EC2_PARAMS]
237
+ stub_params.each do |params|
236
238
  stub_request(:post, uri_for_log(params)).to_return do |request|
237
- @logs_sent << JSON.parse(request.body)
239
+ log_name = "projects/#{params[:project_id]}/logs/#{params[:log_name]}"
240
+ @logs_sent << JSON.parse(request.body).merge('logName' => log_name)
238
241
  { body: '' }
239
242
  end
240
243
  end
@@ -31,7 +31,7 @@ class GoogleCloudOutputGRPCTest < Test::Unit::TestCase
31
31
  { 8 => 'ResourceExhausted',
32
32
  12 => 'Unimplemented',
33
33
  16 => 'Unauthenticated' }.each_with_index do |(code, message), index|
34
- setup_logging_stubs(true, code, message) do
34
+ setup_logging_stubs(nil, true, code, message) do
35
35
  d = create_driver(USE_GRPC_CONFIG, 'test',
36
36
  GRPCLoggingMockFailingService.rpc_stub_class)
37
37
  # The API Client should not retry this and the plugin should consume the
@@ -51,7 +51,7 @@ class GoogleCloudOutputGRPCTest < Test::Unit::TestCase
51
51
  13 => 'Internal',
52
52
  14 => 'Unavailable' }.each_with_index do |(code, message), index|
53
53
  exception_count = 0
54
- setup_logging_stubs(true, code, message) do
54
+ setup_logging_stubs(nil, true, code, message) do
55
55
  d = create_driver(USE_GRPC_CONFIG, 'test',
56
56
  GRPCLoggingMockFailingService.rpc_stub_class)
57
57
  # The API client should retry this once, then throw an exception which
@@ -224,12 +224,17 @@ class GoogleCloudOutputGRPCTest < Test::Unit::TestCase
224
224
 
225
225
  # GRPC logging mock that successfully logs the records.
226
226
  class GRPCLoggingMockService < Google::Logging::V1::LoggingService::Service
227
- def initialize(requests_received)
227
+ def initialize(stub_params, requests_received)
228
228
  super()
229
229
  @requests_received = requests_received
230
+ @expected_log_names = stub_params.map do |param|
231
+ "projects/#{param[:project_id]}/logs/#{param[:log_name]}"
232
+ end
230
233
  end
231
234
 
232
235
  def write_log_entries(request, _call)
236
+ fail GRPC::BadStatus.new(99, "Unexpected request: #{request.inspect}") \
237
+ unless @expected_log_names.include?(request.log_name)
233
238
  @requests_received << request
234
239
  WriteLogEntriesResponse.new
235
240
  end
@@ -283,14 +288,19 @@ class GoogleCloudOutputGRPCTest < Test::Unit::TestCase
283
288
  end
284
289
 
285
290
  # Set up grpc stubs to mock the external calls.
286
- def setup_logging_stubs(should_fail = false, code = 0, message = 'Ok')
291
+ def setup_logging_stubs(override_stub_params = nil, should_fail = false,
292
+ code = 0, message = 'Ok')
293
+ stub_params = override_stub_params || \
294
+ [COMPUTE_PARAMS, VMENGINE_PARAMS, CONTAINER_FROM_TAG_PARAMS,
295
+ CONTAINER_FROM_METADATA_PARAMS, CLOUDFUNCTIONS_PARAMS,
296
+ CUSTOM_PARAMS, EC2_PARAMS]
287
297
  srv = GRPC::RpcServer.new
288
298
  @failed_attempts = []
289
299
  @requests_sent = []
290
300
  if should_fail
291
301
  grpc = GRPCLoggingMockFailingService.new(code, message, @failed_attempts)
292
302
  else
293
- grpc = GRPCLoggingMockService.new(@requests_sent)
303
+ grpc = GRPCLoggingMockService.new(stub_params, @requests_sent)
294
304
  end
295
305
  srv.handle(grpc)
296
306
  srv.add_http2_port(GRPC_MOCK_HOST, :this_port_is_insecure)
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.5.5.pre.1
4
+ version: 0.5.5.pre.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Todd Derr
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-01-31 00:00:00.000000000 Z
12
+ date: 2017-02-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fluentd