fluent-plugin-google-cloud 0.5.6 → 0.6.0.v2.alpha.1

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.
@@ -19,6 +19,8 @@ require 'webmock/test_unit'
19
19
 
20
20
  # Unit tests for Google Cloud Logging plugin
21
21
  module BaseTest
22
+ include Fluent::GoogleCloudOutput::Constants
23
+
22
24
  def setup
23
25
  Fluent::Test.setup
24
26
  # delete environment variables that googleauth uses to find credentials.
@@ -40,6 +42,8 @@ module BaseTest
40
42
  # generic attributes
41
43
  HOSTNAME = Socket.gethostname
42
44
 
45
+ WRITE_LOG_ENTRIES_URI = 'https://logging.googleapis.com/v2beta1/entries:write'
46
+
43
47
  # attributes used for the GCE metadata service
44
48
  PROJECT_ID = 'test-project-id'
45
49
  ZONE = 'us-central1-b'
@@ -96,6 +100,21 @@ module BaseTest
96
100
  CLOUDFUNCTIONS_POD_NAME = 'd.dc.myu.uc.functionp.pc.name-a.a1.987-c0l82'
97
101
  CLOUDFUNCTIONS_CONTAINER_NAME = 'worker'
98
102
 
103
+ # Dataflow specific labels
104
+ DATAFLOW_REGION = 'us-central1'
105
+ DATAFLOW_JOB_NAME = 'job_name_1'
106
+ DATAFLOW_JOB_ID = 'job_id_1'
107
+ DATAFLOW_STEP_ID = 'step_1'
108
+ DATAFLOW_TAG = 'dataflow.googleapis.com/worker'
109
+
110
+ # ML specific labels
111
+ ML_REGION = 'us-central1'
112
+ ML_JOB_ID = 'job_name_1'
113
+ ML_TASK_NAME = 'task_name_1'
114
+ ML_TRIAL_ID = 'trial_id_1'
115
+ ML_LOG_AREA = 'log_area_1'
116
+ ML_TAG = 'master-replica-0'
117
+
99
118
  # Parameters used for authentication
100
119
  AUTH_GRANT_TYPE = 'urn:ietf:params:oauth:grant-type:jwt-bearer'
101
120
  FAKE_AUTH_TOKEN = 'abc123'
@@ -171,36 +190,56 @@ module BaseTest
171
190
  vm_id #{CUSTOM_VM_ID}
172
191
  )
173
192
 
174
- # Service configurations for various services
175
- COMPUTE_SERVICE_NAME = 'compute.googleapis.com'
176
- APPENGINE_SERVICE_NAME = 'appengine.googleapis.com'
177
- CONTAINER_SERVICE_NAME = 'container.googleapis.com'
178
- CLOUDFUNCTIONS_SERVICE_NAME = 'cloudfunctions.googleapis.com'
179
- EC2_SERVICE_NAME = 'ec2.amazonaws.com'
193
+ CONFIG_DATAFLOW = %(
194
+ subservice_name "#{DATAFLOW_CONSTANTS[:service]}"
195
+ labels {
196
+ "#{DATAFLOW_CONSTANTS[:service]}/region" : "#{DATAFLOW_REGION}",
197
+ "#{DATAFLOW_CONSTANTS[:service]}/job_name" : "#{DATAFLOW_JOB_NAME}",
198
+ "#{DATAFLOW_CONSTANTS[:service]}/job_id" : "#{DATAFLOW_JOB_ID}"
199
+ }
200
+ label_map { "step": "#{DATAFLOW_CONSTANTS[:service]}/step_id" }
201
+ )
180
202
 
203
+ CONFIG_ML = %(
204
+ subservice_name "#{ML_CONSTANTS[:service]}"
205
+ labels {
206
+ "#{ML_CONSTANTS[:service]}/job_id" : "#{ML_JOB_ID}",
207
+ "#{ML_CONSTANTS[:service]}/task_name" : "#{ML_TASK_NAME}",
208
+ "#{ML_CONSTANTS[:service]}/trial_id" : "#{ML_TRIAL_ID}"
209
+ }
210
+ label_map { "name": "#{ML_CONSTANTS[:service]}/job_id/log_area" }
211
+ )
212
+
213
+ # Service configurations for various services
181
214
  COMPUTE_PARAMS = {
182
- service_name: COMPUTE_SERVICE_NAME,
215
+ resource: {
216
+ type: COMPUTE_CONSTANTS[:resource_type],
217
+ labels: {
218
+ 'instance_id' => VM_ID,
219
+ 'zone' => ZONE
220
+ }
221
+ },
183
222
  log_name: 'test',
184
223
  project_id: PROJECT_ID,
185
- zone: ZONE,
186
224
  labels: {
187
- "#{COMPUTE_SERVICE_NAME}/resource_type" => 'instance',
188
- "#{COMPUTE_SERVICE_NAME}/resource_id" => VM_ID,
189
- "#{COMPUTE_SERVICE_NAME}/resource_name" => HOSTNAME
225
+ "#{COMPUTE_CONSTANTS[:service]}/resource_name" => HOSTNAME
190
226
  }
191
227
  }
192
228
 
193
229
  VMENGINE_PARAMS = {
194
- service_name: APPENGINE_SERVICE_NAME,
195
- log_name: "#{APPENGINE_SERVICE_NAME}%2Ftest",
230
+ resource: {
231
+ type: APPENGINE_CONSTANTS[:resource_type],
232
+ labels: {
233
+ 'module_id' => MANAGED_VM_BACKEND_NAME,
234
+ 'version_id' => MANAGED_VM_BACKEND_VERSION
235
+ }
236
+ },
237
+ log_name: "#{APPENGINE_CONSTANTS[:service]}%2Ftest",
196
238
  project_id: PROJECT_ID,
197
- zone: ZONE,
198
239
  labels: {
199
- "#{APPENGINE_SERVICE_NAME}/module_id" => MANAGED_VM_BACKEND_NAME,
200
- "#{APPENGINE_SERVICE_NAME}/version_id" => MANAGED_VM_BACKEND_VERSION,
201
- "#{COMPUTE_SERVICE_NAME}/resource_type" => 'instance',
202
- "#{COMPUTE_SERVICE_NAME}/resource_id" => VM_ID,
203
- "#{COMPUTE_SERVICE_NAME}/resource_name" => HOSTNAME
240
+ "#{COMPUTE_CONSTANTS[:service]}/resource_id" => VM_ID,
241
+ "#{COMPUTE_CONSTANTS[:service]}/resource_name" => HOSTNAME,
242
+ "#{COMPUTE_CONSTANTS[:service]}/zone" => ZONE
204
243
  }
205
244
  }
206
245
 
@@ -208,42 +247,48 @@ module BaseTest
208
247
  "#{CONTAINER_NAMESPACE_NAME}_#{CONTAINER_CONTAINER_NAME}"
209
248
 
210
249
  CONTAINER_FROM_METADATA_PARAMS = {
211
- service_name: CONTAINER_SERVICE_NAME,
250
+ resource: {
251
+ type: CONTAINER_CONSTANTS[:resource_type],
252
+ labels: {
253
+ 'cluster_name' => CONTAINER_CLUSTER_NAME,
254
+ 'namespace_id' => CONTAINER_NAMESPACE_ID,
255
+ 'instance_id' => VM_ID,
256
+ 'pod_id' => CONTAINER_POD_ID,
257
+ 'container_name' => CONTAINER_CONTAINER_NAME,
258
+ 'zone' => ZONE
259
+ }
260
+ },
212
261
  log_name: CONTAINER_CONTAINER_NAME,
213
262
  project_id: PROJECT_ID,
214
- zone: ZONE,
215
263
  labels: {
216
- "#{CONTAINER_SERVICE_NAME}/instance_id" => VM_ID,
217
- "#{CONTAINER_SERVICE_NAME}/cluster_name" => CONTAINER_CLUSTER_NAME,
218
- "#{CONTAINER_SERVICE_NAME}/namespace_name" => CONTAINER_NAMESPACE_NAME,
219
- "#{CONTAINER_SERVICE_NAME}/namespace_id" => CONTAINER_NAMESPACE_ID,
220
- "#{CONTAINER_SERVICE_NAME}/pod_name" => CONTAINER_POD_NAME,
221
- "#{CONTAINER_SERVICE_NAME}/pod_id" => CONTAINER_POD_ID,
222
- "#{CONTAINER_SERVICE_NAME}/container_name" => CONTAINER_CONTAINER_NAME,
223
- "#{CONTAINER_SERVICE_NAME}/stream" => CONTAINER_STREAM,
264
+ "#{CONTAINER_CONSTANTS[:service]}/namespace_name" =>
265
+ CONTAINER_NAMESPACE_NAME,
266
+ "#{CONTAINER_CONSTANTS[:service]}/pod_name" => CONTAINER_POD_NAME,
267
+ "#{CONTAINER_CONSTANTS[:service]}/stream" => CONTAINER_STREAM,
224
268
  "label/#{CONTAINER_LABEL_KEY}" => CONTAINER_LABEL_VALUE,
225
- "#{COMPUTE_SERVICE_NAME}/resource_type" => 'instance',
226
- "#{COMPUTE_SERVICE_NAME}/resource_id" => VM_ID,
227
- "#{COMPUTE_SERVICE_NAME}/resource_name" => HOSTNAME
269
+ "#{COMPUTE_CONSTANTS[:service]}/resource_name" => HOSTNAME
228
270
  }
229
271
  }
230
272
 
231
273
  # Almost the same as from metadata, but missing namespace_id and pod_id.
232
274
  CONTAINER_FROM_TAG_PARAMS = {
233
- service_name: CONTAINER_SERVICE_NAME,
275
+ resource: {
276
+ type: CONTAINER_CONSTANTS[:resource_type],
277
+ labels: {
278
+ 'cluster_name' => CONTAINER_CLUSTER_NAME,
279
+ 'instance_id' => VM_ID,
280
+ 'container_name' => CONTAINER_CONTAINER_NAME,
281
+ 'zone' => ZONE
282
+ }
283
+ },
234
284
  log_name: CONTAINER_CONTAINER_NAME,
235
285
  project_id: PROJECT_ID,
236
- zone: ZONE,
237
286
  labels: {
238
- "#{CONTAINER_SERVICE_NAME}/instance_id" => VM_ID,
239
- "#{CONTAINER_SERVICE_NAME}/cluster_name" => CONTAINER_CLUSTER_NAME,
240
- "#{CONTAINER_SERVICE_NAME}/namespace_name" => CONTAINER_NAMESPACE_NAME,
241
- "#{CONTAINER_SERVICE_NAME}/pod_name" => CONTAINER_POD_NAME,
242
- "#{CONTAINER_SERVICE_NAME}/container_name" => CONTAINER_CONTAINER_NAME,
243
- "#{CONTAINER_SERVICE_NAME}/stream" => CONTAINER_STREAM,
244
- "#{COMPUTE_SERVICE_NAME}/resource_type" => 'instance',
245
- "#{COMPUTE_SERVICE_NAME}/resource_id" => VM_ID,
246
- "#{COMPUTE_SERVICE_NAME}/resource_name" => HOSTNAME
287
+ "#{CONTAINER_CONSTANTS[:service]}/namespace_name" =>
288
+ CONTAINER_NAMESPACE_NAME,
289
+ "#{CONTAINER_CONSTANTS[:service]}/pod_name" => CONTAINER_POD_NAME,
290
+ "#{CONTAINER_CONSTANTS[:service]}/stream" => CONTAINER_STREAM,
291
+ "#{COMPUTE_CONSTANTS[:service]}/resource_name" => HOSTNAME
247
292
  }
248
293
  }
249
294
 
@@ -252,62 +297,112 @@ module BaseTest
252
297
  "#{CLOUDFUNCTIONS_CONTAINER_NAME}"
253
298
 
254
299
  CLOUDFUNCTIONS_PARAMS = {
255
- service_name: CLOUDFUNCTIONS_SERVICE_NAME,
300
+ resource: {
301
+ type: CLOUDFUNCTIONS_CONSTANTS[:resource_type],
302
+ labels: {
303
+ 'function_name' => CLOUDFUNCTIONS_FUNCTION_NAME,
304
+ 'region' => CLOUDFUNCTIONS_REGION
305
+ }
306
+ },
256
307
  log_name: 'cloud-functions',
257
308
  project_id: PROJECT_ID,
258
- zone: ZONE,
259
309
  labels: {
260
310
  'execution_id' => CLOUDFUNCTIONS_EXECUTION_ID,
261
- "#{CLOUDFUNCTIONS_SERVICE_NAME}/function_name" =>
262
- CLOUDFUNCTIONS_FUNCTION_NAME,
263
- "#{CLOUDFUNCTIONS_SERVICE_NAME}/region" => CLOUDFUNCTIONS_REGION,
264
- "#{CONTAINER_SERVICE_NAME}/instance_id" => VM_ID,
265
- "#{CONTAINER_SERVICE_NAME}/cluster_name" => CLOUDFUNCTIONS_CLUSTER_NAME,
266
- "#{COMPUTE_SERVICE_NAME}/resource_type" => 'instance',
267
- "#{COMPUTE_SERVICE_NAME}/resource_id" => VM_ID,
268
- "#{COMPUTE_SERVICE_NAME}/resource_name" => HOSTNAME
311
+ "#{CONTAINER_CONSTANTS[:service]}/instance_id" => VM_ID,
312
+ "#{CONTAINER_CONSTANTS[:service]}/cluster_name" =>
313
+ CLOUDFUNCTIONS_CLUSTER_NAME,
314
+ "#{COMPUTE_CONSTANTS[:service]}/resource_id" => VM_ID,
315
+ "#{COMPUTE_CONSTANTS[:service]}/resource_name" => HOSTNAME,
316
+ "#{COMPUTE_CONSTANTS[:service]}/zone" => ZONE
269
317
  }
270
318
  }
271
319
 
272
320
  CLOUDFUNCTIONS_TEXT_NOT_MATCHED_PARAMS = {
273
- service_name: CLOUDFUNCTIONS_SERVICE_NAME,
321
+ resource: {
322
+ type: CLOUDFUNCTIONS_CONSTANTS[:resource_type],
323
+ labels: {
324
+ 'function_name' => CLOUDFUNCTIONS_FUNCTION_NAME,
325
+ 'region' => CLOUDFUNCTIONS_REGION
326
+ }
327
+ },
274
328
  log_name: 'cloud-functions',
275
329
  project_id: PROJECT_ID,
276
- zone: ZONE,
277
330
  labels: {
278
- "#{CLOUDFUNCTIONS_SERVICE_NAME}/function_name" =>
279
- CLOUDFUNCTIONS_FUNCTION_NAME,
280
- "#{CLOUDFUNCTIONS_SERVICE_NAME}/region" => CLOUDFUNCTIONS_REGION,
281
- "#{CONTAINER_SERVICE_NAME}/instance_id" => VM_ID,
282
- "#{CONTAINER_SERVICE_NAME}/cluster_name" => CLOUDFUNCTIONS_CLUSTER_NAME,
283
- "#{COMPUTE_SERVICE_NAME}/resource_type" => 'instance',
284
- "#{COMPUTE_SERVICE_NAME}/resource_id" => VM_ID,
285
- "#{COMPUTE_SERVICE_NAME}/resource_name" => HOSTNAME
331
+ "#{CONTAINER_CONSTANTS[:service]}/instance_id" => VM_ID,
332
+ "#{CONTAINER_CONSTANTS[:service]}/cluster_name" =>
333
+ CLOUDFUNCTIONS_CLUSTER_NAME,
334
+ "#{COMPUTE_CONSTANTS[:service]}/resource_id" => VM_ID,
335
+ "#{COMPUTE_CONSTANTS[:service]}/resource_name" => HOSTNAME,
336
+ "#{COMPUTE_CONSTANTS[:service]}/zone" => ZONE
337
+ }
338
+ }
339
+
340
+ DATAFLOW_PARAMS = {
341
+ resource: {
342
+ type: DATAFLOW_CONSTANTS[:resource_type],
343
+ labels: {
344
+ 'job_name' => DATAFLOW_JOB_NAME,
345
+ 'job_id' => DATAFLOW_JOB_ID,
346
+ 'step_id' => DATAFLOW_STEP_ID,
347
+ 'region' => DATAFLOW_REGION
348
+ }
349
+ },
350
+ log_name: DATAFLOW_TAG,
351
+ project_id: PROJECT_ID,
352
+ labels: {
353
+ "#{COMPUTE_CONSTANTS[:service]}/resource_id" => VM_ID,
354
+ "#{COMPUTE_CONSTANTS[:service]}/resource_name" => HOSTNAME,
355
+ "#{COMPUTE_CONSTANTS[:service]}/zone" => ZONE
356
+ }
357
+ }
358
+
359
+ ML_PARAMS = {
360
+ resource: {
361
+ type: ML_CONSTANTS[:resource_type],
362
+ labels: {
363
+ 'job_id' => ML_JOB_ID,
364
+ 'task_name' => ML_TASK_NAME
365
+ }
366
+ },
367
+ log_name: ML_TAG,
368
+ project_id: PROJECT_ID,
369
+ labels: {
370
+ "#{ML_CONSTANTS[:service]}/trial_id" => ML_TRIAL_ID,
371
+ "#{ML_CONSTANTS[:service]}/job_id/log_area" => ML_LOG_AREA,
372
+ "#{COMPUTE_CONSTANTS[:service]}/resource_id" => VM_ID,
373
+ "#{COMPUTE_CONSTANTS[:service]}/resource_name" => HOSTNAME,
374
+ "#{COMPUTE_CONSTANTS[:service]}/zone" => ZONE
286
375
  }
287
376
  }
288
377
 
289
378
  CUSTOM_PARAMS = {
290
- service_name: COMPUTE_SERVICE_NAME,
379
+ resource: {
380
+ type: COMPUTE_CONSTANTS[:resource_type],
381
+ labels: {
382
+ 'instance_id' => CUSTOM_VM_ID,
383
+ 'zone' => CUSTOM_ZONE
384
+ }
385
+ },
291
386
  log_name: 'test',
292
387
  project_id: CUSTOM_PROJECT_ID,
293
- zone: CUSTOM_ZONE,
294
388
  labels: {
295
- "#{COMPUTE_SERVICE_NAME}/resource_type" => 'instance',
296
- "#{COMPUTE_SERVICE_NAME}/resource_id" => CUSTOM_VM_ID,
297
- "#{COMPUTE_SERVICE_NAME}/resource_name" => CUSTOM_HOSTNAME
389
+ "#{COMPUTE_CONSTANTS[:service]}/resource_name" => CUSTOM_HOSTNAME
298
390
  }
299
391
  }
300
392
 
301
393
  EC2_PARAMS = {
302
- service_name: EC2_SERVICE_NAME,
394
+ resource: {
395
+ type: EC2_CONSTANTS[:resource_type],
396
+ labels: {
397
+ 'instance_id' => EC2_VM_ID,
398
+ 'region' => EC2_PREFIXED_ZONE,
399
+ 'aws_account' => EC2_ACCOUNT_ID
400
+ }
401
+ },
303
402
  log_name: 'test',
304
403
  project_id: EC2_PROJECT_ID,
305
- zone: EC2_PREFIXED_ZONE,
306
404
  labels: {
307
- "#{EC2_SERVICE_NAME}/resource_type" => 'instance',
308
- "#{EC2_SERVICE_NAME}/resource_id" => EC2_VM_ID,
309
- "#{EC2_SERVICE_NAME}/account_id" => EC2_ACCOUNT_ID,
310
- "#{EC2_SERVICE_NAME}/resource_name" => HOSTNAME
405
+ "#{EC2_CONSTANTS[:service]}/resource_name" => HOSTNAME
311
406
  }
312
407
  }
313
408
 
@@ -434,12 +529,12 @@ module BaseTest
434
529
 
435
530
  def test_gce_used_when_detect_subservice_is_false
436
531
  setup_gce_metadata_stubs
437
- # This would cause the service to be container.googleapis.com if not for the
438
- # detect_subservice=false config.
532
+ # This would cause the resource type to be container.googleapis.com if not
533
+ # for the detect_subservice=false config.
439
534
  setup_container_metadata_stubs
440
535
  d = create_driver(NO_DETECT_SUBSERVICE_CONFIG)
441
536
  d.run
442
- assert_equal COMPUTE_SERVICE_NAME, d.instance.service_name
537
+ assert_equal COMPUTE_CONSTANTS[:resource_type], d.instance.resource.type
443
538
  end
444
539
 
445
540
  def test_metadata_overrides
@@ -554,7 +649,7 @@ module BaseTest
554
649
  verify_log_entries(1, EC2_PARAMS)
555
650
  end
556
651
 
557
- def test_struct_payload_log
652
+ def test_structured_payload_log
558
653
  setup_gce_metadata_stubs
559
654
  setup_logging_stubs do
560
655
  d = create_driver
@@ -562,8 +657,8 @@ module BaseTest
562
657
  'some_null_field' => nil)
563
658
  d.run
564
659
  end
565
- verify_log_entries(1, COMPUTE_PARAMS, 'structPayload') do |entry|
566
- fields = get_fields(entry['structPayload'])
660
+ verify_log_entries(1, COMPUTE_PARAMS, 'jsonPayload') do |entry|
661
+ fields = get_fields(entry['jsonPayload'])
567
662
  assert_equal 4, fields.size, entry
568
663
  assert_equal 'test log entry 0', get_string(fields['msg']), entry
569
664
  assert_equal 'test', get_string(fields['tag2']), entry
@@ -572,7 +667,7 @@ module BaseTest
572
667
  end
573
668
  end
574
669
 
575
- def test_struct_payload_malformatted_log
670
+ def test_structured_payload_malformatted_log
576
671
  setup_gce_metadata_stubs
577
672
  message = 'test message'
578
673
  setup_logging_stubs do
@@ -588,8 +683,8 @@ module BaseTest
588
683
  )
589
684
  d.run
590
685
  end
591
- verify_log_entries(1, COMPUTE_PARAMS, 'structPayload') do |entry|
592
- fields = get_fields(entry['structPayload'])
686
+ verify_log_entries(1, COMPUTE_PARAMS, 'jsonPayload') do |entry|
687
+ fields = get_fields(entry['jsonPayload'])
593
688
  assert_equal 7, fields.size, entry
594
689
  assert_equal message, get_string(get_fields(get_struct(fields \
595
690
  ['int_key']))['1']), entry
@@ -608,7 +703,7 @@ module BaseTest
608
703
  end
609
704
  end
610
705
 
611
- def test_struct_payload_json_log
706
+ def test_structured_payload_json_log
612
707
  setup_gce_metadata_stubs
613
708
  setup_logging_stubs do
614
709
  d = create_driver
@@ -624,7 +719,7 @@ module BaseTest
624
719
  end
625
720
  end
626
721
 
627
- def test_struct_payload_json_container_log
722
+ def test_structured_payload_json_container_log
628
723
  setup_gce_metadata_stubs
629
724
  setup_container_metadata_stubs
630
725
  setup_logging_stubs do
@@ -643,8 +738,8 @@ module BaseTest
643
738
  if log_index == 1
644
739
  assert entry.key?('textPayload'), 'Entry did not have textPayload'
645
740
  else
646
- assert entry.key?('structPayload'), 'Entry did not have structPayload'
647
- fields = get_fields(entry['structPayload'])
741
+ assert entry.key?('jsonPayload'), 'Entry did not have jsonPayload'
742
+ fields = get_fields(entry['jsonPayload'])
648
743
  assert_equal 4, fields.size, entry
649
744
  assert_equal 'test log entry 0', get_string(fields['msg']), entry
650
745
  assert_equal 'test', get_string(fields['tag2']), entry
@@ -665,7 +760,7 @@ module BaseTest
665
760
  d.emit('msg' => log_entry(0))
666
761
  d.run
667
762
  end
668
- verify_log_entries(0, COMPUTE_PARAMS, 'structPayload')
763
+ verify_log_entries(0, COMPUTE_PARAMS, 'jsonPayload')
669
764
  end
670
765
  end
671
766
 
@@ -678,18 +773,17 @@ module BaseTest
678
773
  # This tag will not match the kubernetes regex because it requires a
679
774
  # non-empty container name.
680
775
  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 = []
776
+ setup_logging_stubs do
687
777
  d = create_driver(REQUIRE_VALID_TAGS_CONFIG, tag)
688
778
  d.emit(container_log_entry_with_metadata(log_entry(0), container_name))
689
779
  d.run
690
780
  end
781
+ params = CONTAINER_FROM_METADATA_PARAMS.merge(
782
+ resource: CONTAINER_FROM_METADATA_PARAMS[:resource].merge(
783
+ labels: CONTAINER_FROM_METADATA_PARAMS[:resource][:labels].merge(
784
+ 'container_name' => container_name)),
785
+ log_name: tag)
691
786
  verify_log_entries(1, params, 'textPayload')
692
- assert_equal "projects/#{PROJECT_ID}/logs/#{tag}", @logs_sent[0]['logName']
693
787
  end
694
788
 
695
789
  # Verify that container names with non-utf8 characters should be rejected when
@@ -701,18 +795,18 @@ module BaseTest
701
795
  tag.is_a?(String) && !tag.empty?
702
796
  end
703
797
  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
798
+ setup_logging_stubs do
710
799
  @logs_sent = []
711
800
  d = create_driver(REQUIRE_VALID_TAGS_CONFIG,
712
801
  container_tag_with_container_name(container_name))
713
802
  d.emit(container_log_entry_with_metadata(log_entry(0), container_name))
714
803
  d.run
715
804
  end
805
+ params = CONTAINER_FROM_METADATA_PARAMS.merge(
806
+ labels: CONTAINER_FROM_METADATA_PARAMS[:labels].merge(
807
+ "#{CONTAINER_CONSTANTS[:service]}/container_name" =>
808
+ URI.decode(encoded_name)),
809
+ log_name: encoded_name)
716
810
  verify_log_entries(0, params, 'textPayload')
717
811
  end
718
812
  end
@@ -722,15 +816,14 @@ module BaseTest
722
816
  def test_encode_tags_with_require_valid_tags_true
723
817
  setup_gce_metadata_stubs
724
818
  VALID_TAGS.each do |tag, encoded_tag|
725
- setup_logging_stubs([COMPUTE_PARAMS.merge(log_name: encoded_tag)]) do
819
+ setup_logging_stubs do
726
820
  @logs_sent = []
727
821
  d = create_driver(REQUIRE_VALID_TAGS_CONFIG, tag)
728
822
  d.emit('msg' => log_entry(0))
729
823
  d.run
730
824
  end
731
- verify_log_entries(1, COMPUTE_PARAMS, 'structPayload')
732
- assert_equal "projects/#{PROJECT_ID}/logs/#{encoded_tag}",
733
- @logs_sent[0]['logName']
825
+ verify_log_entries(1, COMPUTE_PARAMS.merge(log_name: encoded_tag),
826
+ 'jsonPayload')
734
827
  end
735
828
  end
736
829
 
@@ -739,20 +832,19 @@ module BaseTest
739
832
  setup_gce_metadata_stubs
740
833
  setup_container_metadata_stubs
741
834
  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
835
+ setup_logging_stubs do
747
836
  @logs_sent = []
748
837
  d = create_driver(REQUIRE_VALID_TAGS_CONFIG,
749
838
  container_tag_with_container_name(tag))
750
839
  d.emit(container_log_entry_with_metadata(log_entry(0), tag))
751
840
  d.run
752
841
  end
842
+ params = CONTAINER_FROM_METADATA_PARAMS.merge(
843
+ resource: CONTAINER_FROM_METADATA_PARAMS[:resource].merge(
844
+ labels: CONTAINER_FROM_METADATA_PARAMS[:resource][:labels].merge(
845
+ 'container_name' => tag)),
846
+ log_name: encoded_tag)
753
847
  verify_log_entries(1, params, 'textPayload')
754
- assert_equal "projects/#{PROJECT_ID}/logs/#{encoded_tag}",
755
- @logs_sent[0]['logName']
756
848
  end
757
849
  end
758
850
 
@@ -762,15 +854,14 @@ module BaseTest
762
854
  def test_sanitize_tags_with_require_valid_tags_false
763
855
  setup_gce_metadata_stubs
764
856
  ALL_TAGS.each do |tag, sanitized_tag|
765
- setup_logging_stubs([COMPUTE_PARAMS.merge(log_name: sanitized_tag)]) do
857
+ setup_logging_stubs do
766
858
  @logs_sent = []
767
859
  d = create_driver(APPLICATION_DEFAULT_CONFIG, tag)
768
860
  d.emit('msg' => log_entry(0))
769
861
  d.run
770
862
  end
771
- verify_log_entries(1, COMPUTE_PARAMS, 'structPayload')
772
- assert_equal "projects/#{PROJECT_ID}/logs/#{sanitized_tag}",
773
- @logs_sent[0]['logName']
863
+ verify_log_entries(1, COMPUTE_PARAMS.merge(log_name: sanitized_tag),
864
+ 'jsonPayload')
774
865
  end
775
866
  end
776
867
 
@@ -787,21 +878,19 @@ module BaseTest
787
878
  string_tags.each do |container_name, encoded_container_name|
788
879
  # Container name in the label is sanitized but not encoded, while the log
789
880
  # 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
881
+ setup_logging_stubs do
796
882
  @logs_sent = []
797
883
  d = create_driver(APPLICATION_DEFAULT_CONFIG,
798
884
  container_tag_with_container_name(container_name))
799
885
  d.emit(container_log_entry_with_metadata(log_entry(0), container_name))
800
886
  d.run
801
887
  end
888
+ params = CONTAINER_FROM_METADATA_PARAMS.merge(
889
+ resource: CONTAINER_FROM_METADATA_PARAMS[:resource].merge(
890
+ labels: CONTAINER_FROM_METADATA_PARAMS[:resource][:labels].merge(
891
+ 'container_name' => URI.decode(encoded_container_name))),
892
+ log_name: encoded_container_name)
802
893
  verify_log_entries(1, params, 'textPayload')
803
- assert_equal "projects/#{PROJECT_ID}/logs/#{encoded_container_name}",
804
- @logs_sent[0]['logName']
805
894
  end
806
895
  end
807
896
 
@@ -833,9 +922,9 @@ module BaseTest
833
922
  end
834
923
  verify_index = 0
835
924
  verify_log_entries(emit_index, COMPUTE_PARAMS) do |entry|
836
- assert_equal_with_default entry['metadata']['timestamp']['seconds'],
925
+ assert_equal_with_default entry['timestamp']['seconds'],
837
926
  expected_ts[verify_index].tv_sec, 0, entry
838
- assert_equal_with_default entry['metadata']['timestamp']['nanos'],
927
+ assert_equal_with_default entry['timestamp']['nanos'],
839
928
  expected_ts[verify_index].tv_nsec, 0, entry do
840
929
  # Fluentd v0.14 onwards supports nanosecond timestamp values.
841
930
  # Added in 600 ns delta to avoid flaky tests introduced
@@ -843,7 +932,7 @@ module BaseTest
843
932
  # (to account for the missing 9 bits of precision ~ 512 ns).
844
933
  # See http://wikipedia.org/wiki/Double-precision_floating-point_format
845
934
  assert_in_delta expected_ts[verify_index].tv_nsec,
846
- entry['metadata']['timestamp']['nanos'], 600, entry
935
+ entry['timestamp']['nanos'], 600, entry
847
936
  end
848
937
  verify_index += 1
849
938
  end
@@ -853,12 +942,12 @@ module BaseTest
853
942
  setup_gce_metadata_stubs
854
943
  setup_logging_stubs do
855
944
  d = create_driver
856
- # if timestamp is not a hash it is passed through to the struct payload.
945
+ # if timestamp is not a hash it is passed through to the json payload.
857
946
  d.emit('message' => log_entry(0), 'timestamp' => 'not-a-hash')
858
947
  d.run
859
948
  end
860
- verify_log_entries(1, COMPUTE_PARAMS, 'structPayload') do |entry|
861
- fields = get_fields(entry['structPayload'])
949
+ verify_log_entries(1, COMPUTE_PARAMS, 'jsonPayload') do |entry|
950
+ fields = get_fields(entry['jsonPayload'])
862
951
  assert_equal 2, fields.size, entry
863
952
  assert_equal 'not-a-hash', get_string(fields['timestamp']), entry
864
953
  end
@@ -937,7 +1026,7 @@ module BaseTest
937
1026
  }
938
1027
  )
939
1028
  d = create_driver(config)
940
- # not_a_label passes through to the struct payload
1029
+ # not_a_label passes through to the json payload
941
1030
  d.emit('message' => log_entry(0),
942
1031
  'label1' => 'value1',
943
1032
  'label_number_two' => 'value2',
@@ -950,8 +1039,8 @@ module BaseTest
950
1039
  params[:labels]['sent_label_1'] = 'value1'
951
1040
  params[:labels]['foo.googleapis.com/bar'] = 'value2'
952
1041
  params[:labels]['label3'] = 'value3'
953
- verify_log_entries(1, params, 'structPayload') do |entry|
954
- fields = get_fields(entry['structPayload'])
1042
+ verify_log_entries(1, params, 'jsonPayload') do |entry|
1043
+ fields = get_fields(entry['jsonPayload'])
955
1044
  assert_equal 2, fields.size, entry
956
1045
  assert_equal 'test log entry 0', get_string(fields['message']), entry
957
1046
  assert_equal 'value4', get_string(fields['not_a_label']), entry
@@ -1023,11 +1112,9 @@ module BaseTest
1023
1112
  d.run
1024
1113
  end
1025
1114
  verify_log_entries(1, CONTAINER_FROM_METADATA_PARAMS) do |entry|
1026
- assert_equal CONTAINER_SECONDS_EPOCH, \
1027
- entry['metadata']['timestamp']['seconds'], entry
1028
- assert_equal CONTAINER_NANOS, \
1029
- entry['metadata']['timestamp']['nanos'], entry
1030
- assert_equal CONTAINER_SEVERITY, entry['metadata']['severity'], entry
1115
+ assert_equal CONTAINER_SECONDS_EPOCH, entry['timestamp']['seconds'], entry
1116
+ assert_equal CONTAINER_NANOS, entry['timestamp']['nanos'], entry
1117
+ assert_equal CONTAINER_SEVERITY, entry['severity'], entry
1031
1118
  end
1032
1119
  end
1033
1120
 
@@ -1045,11 +1132,10 @@ module BaseTest
1045
1132
  d.run
1046
1133
  end
1047
1134
  verify_log_entries(n, CONTAINER_FROM_METADATA_PARAMS) do |entry|
1048
- assert_equal CONTAINER_SECONDS_EPOCH, \
1049
- entry['metadata']['timestamp']['seconds'], entry
1050
- assert_equal CONTAINER_NANOS, \
1051
- entry['metadata']['timestamp']['nanos'], entry
1052
- assert_equal CONTAINER_SEVERITY, entry['metadata']['severity'], entry
1135
+ assert_equal CONTAINER_SECONDS_EPOCH, entry['timestamp']['seconds'],
1136
+ entry
1137
+ assert_equal CONTAINER_NANOS, entry['timestamp']['nanos'], entry
1138
+ assert_equal CONTAINER_SEVERITY, entry['severity'], entry
1053
1139
  end
1054
1140
  end
1055
1141
  end
@@ -1068,11 +1154,10 @@ module BaseTest
1068
1154
  d.run
1069
1155
  end
1070
1156
  verify_log_entries(n, CONTAINER_FROM_TAG_PARAMS) do |entry|
1071
- assert_equal CONTAINER_SECONDS_EPOCH, \
1072
- entry['metadata']['timestamp']['seconds'], entry
1073
- assert_equal CONTAINER_NANOS, \
1074
- entry['metadata']['timestamp']['nanos'], entry
1075
- assert_equal CONTAINER_SEVERITY, entry['metadata']['severity'], entry
1157
+ assert_equal CONTAINER_SECONDS_EPOCH, entry['timestamp']['seconds'],
1158
+ entry
1159
+ assert_equal CONTAINER_NANOS, entry['timestamp']['nanos'], entry
1160
+ assert_equal CONTAINER_SEVERITY, entry['severity'], entry
1076
1161
  end
1077
1162
  end
1078
1163
  end
@@ -1086,11 +1171,9 @@ module BaseTest
1086
1171
  d.run
1087
1172
  end
1088
1173
  verify_log_entries(1, CONTAINER_FROM_TAG_PARAMS) do |entry|
1089
- assert_equal CONTAINER_SECONDS_EPOCH, \
1090
- entry['metadata']['timestamp']['seconds'], entry
1091
- assert_equal CONTAINER_NANOS, \
1092
- entry['metadata']['timestamp']['nanos'], entry
1093
- assert_equal CONTAINER_SEVERITY, entry['metadata']['severity'], entry
1174
+ assert_equal CONTAINER_SECONDS_EPOCH, entry['timestamp']['seconds'], entry
1175
+ assert_equal CONTAINER_NANOS, entry['timestamp']['nanos'], entry
1176
+ assert_equal CONTAINER_SEVERITY, entry['severity'], entry
1094
1177
  end
1095
1178
  end
1096
1179
 
@@ -1103,18 +1186,16 @@ module BaseTest
1103
1186
  d.run
1104
1187
  end
1105
1188
  expected_params = CONTAINER_FROM_TAG_PARAMS.merge(
1106
- labels: { "#{CONTAINER_SERVICE_NAME}/stream" => 'stderr' }
1189
+ labels: { "#{CONTAINER_CONSTANTS[:service]}/stream" => 'stderr' }
1107
1190
  ) { |_, oldval, newval| oldval.merge(newval) }
1108
1191
  verify_log_entries(1, expected_params) do |entry|
1109
- assert_equal CONTAINER_SECONDS_EPOCH, \
1110
- entry['metadata']['timestamp']['seconds'], entry
1111
- assert_equal CONTAINER_NANOS, \
1112
- entry['metadata']['timestamp']['nanos'], entry
1113
- assert_equal 'ERROR', entry['metadata']['severity'], entry
1192
+ assert_equal CONTAINER_SECONDS_EPOCH, entry['timestamp']['seconds'], entry
1193
+ assert_equal CONTAINER_NANOS, entry['timestamp']['nanos'], entry
1194
+ assert_equal 'ERROR', entry['severity'], entry
1114
1195
  end
1115
1196
  end
1116
1197
 
1117
- def test_struct_container_log_metadata_from_plugin
1198
+ def test_json_container_log_metadata_from_plugin
1118
1199
  setup_gce_metadata_stubs
1119
1200
  setup_container_metadata_stubs
1120
1201
  setup_logging_stubs do
@@ -1125,21 +1206,19 @@ module BaseTest
1125
1206
  d.run
1126
1207
  end
1127
1208
  verify_log_entries(1, CONTAINER_FROM_METADATA_PARAMS,
1128
- 'structPayload') do |entry|
1129
- fields = get_fields(entry['structPayload'])
1209
+ 'jsonPayload') do |entry|
1210
+ fields = get_fields(entry['jsonPayload'])
1130
1211
  assert_equal 3, fields.size, entry
1131
1212
  assert_equal 'test log entry 0', get_string(fields['msg']), entry
1132
1213
  assert_equal 'test', get_string(fields['tag2']), entry
1133
1214
  assert_equal 5000, get_number(fields['data']), entry
1134
- assert_equal CONTAINER_SECONDS_EPOCH, \
1135
- entry['metadata']['timestamp']['seconds'], entry
1136
- assert_equal CONTAINER_NANOS, \
1137
- entry['metadata']['timestamp']['nanos'], entry
1138
- assert_equal 'WARNING', entry['metadata']['severity'], entry
1215
+ assert_equal CONTAINER_SECONDS_EPOCH, entry['timestamp']['seconds'], entry
1216
+ assert_equal CONTAINER_NANOS, entry['timestamp']['nanos'], entry
1217
+ assert_equal 'WARNING', entry['severity'], entry
1139
1218
  end
1140
1219
  end
1141
1220
 
1142
- def test_struct_container_log_metadata_from_tag
1221
+ def test_json_container_log_metadata_from_tag
1143
1222
  setup_gce_metadata_stubs
1144
1223
  setup_container_metadata_stubs
1145
1224
  setup_logging_stubs do
@@ -1150,17 +1229,15 @@ module BaseTest
1150
1229
  d.run
1151
1230
  end
1152
1231
  verify_log_entries(1, CONTAINER_FROM_TAG_PARAMS,
1153
- 'structPayload') do |entry|
1154
- fields = get_fields(entry['structPayload'])
1232
+ 'jsonPayload') do |entry|
1233
+ fields = get_fields(entry['jsonPayload'])
1155
1234
  assert_equal 3, fields.size, entry
1156
1235
  assert_equal 'test log entry 0', get_string(fields['msg']), entry
1157
1236
  assert_equal 'test', get_string(fields['tag2']), entry
1158
1237
  assert_equal 5000, get_number(fields['data']), entry
1159
- assert_equal CONTAINER_SECONDS_EPOCH, \
1160
- entry['metadata']['timestamp']['seconds'], entry
1161
- assert_equal CONTAINER_NANOS, \
1162
- entry['metadata']['timestamp']['nanos'], entry
1163
- assert_equal 'WARNING', entry['metadata']['severity'], entry
1238
+ assert_equal CONTAINER_SECONDS_EPOCH, entry['timestamp']['seconds'], entry
1239
+ assert_equal CONTAINER_NANOS, entry['timestamp']['nanos'], entry
1240
+ assert_equal 'WARNING', entry['severity'], entry
1164
1241
  end
1165
1242
  end
1166
1243
 
@@ -1178,7 +1255,7 @@ module BaseTest
1178
1255
  d.run
1179
1256
  end
1180
1257
  verify_log_entries(n, CLOUDFUNCTIONS_PARAMS) do |entry|
1181
- assert_equal 'DEBUG', entry['metadata']['severity'],
1258
+ assert_equal 'DEBUG', entry['severity'],
1182
1259
  "Test with #{n} logs failed. \n#{entry}"
1183
1260
  end
1184
1261
  end
@@ -1199,7 +1276,7 @@ module BaseTest
1199
1276
  end
1200
1277
  verify_log_entries(
1201
1278
  n, CLOUDFUNCTIONS_TEXT_NOT_MATCHED_PARAMS) do |entry|
1202
- assert_equal 'INFO', entry['metadata']['severity'],
1279
+ assert_equal 'INFO', entry['severity'],
1203
1280
  "Test with #{n} logs failed. \n#{entry}"
1204
1281
  end
1205
1282
  end
@@ -1232,12 +1309,12 @@ module BaseTest
1232
1309
  setup_gce_metadata_stubs
1233
1310
  setup_logging_stubs do
1234
1311
  d = create_driver
1235
- d.emit('httpRequest' => http_request_message)
1312
+ d.emit('httpRequest' => HTTP_REQUEST_MESSAGE)
1236
1313
  d.run
1237
1314
  end
1238
1315
  verify_log_entries(1, COMPUTE_PARAMS, 'httpRequest') do |entry|
1239
- assert_equal http_request_message, entry['httpRequest'], entry
1240
- assert_nil get_fields(entry['structPayload'])['httpRequest'], entry
1316
+ assert_equal HTTP_REQUEST_MESSAGE, entry['httpRequest'], entry
1317
+ assert_nil get_fields(entry['jsonPayload'])['httpRequest'], entry
1241
1318
  end
1242
1319
  end
1243
1320
 
@@ -1245,13 +1322,13 @@ module BaseTest
1245
1322
  setup_gce_metadata_stubs
1246
1323
  setup_logging_stubs do
1247
1324
  d = create_driver
1248
- d.emit('httpRequest' => http_request_message.merge(
1325
+ d.emit('httpRequest' => HTTP_REQUEST_MESSAGE.merge(
1249
1326
  'otherKey' => 'value'))
1250
1327
  d.run
1251
1328
  end
1252
1329
  verify_log_entries(1, COMPUTE_PARAMS, 'httpRequest') do |entry|
1253
- assert_equal http_request_message, entry['httpRequest'], entry
1254
- fields = get_fields(entry['structPayload'])
1330
+ assert_equal HTTP_REQUEST_MESSAGE, entry['httpRequest'], entry
1331
+ fields = get_fields(entry['jsonPayload'])
1255
1332
  request = get_fields(get_struct(fields['httpRequest']))
1256
1333
  assert_equal 'value', get_string(request['otherKey']), entry
1257
1334
  end
@@ -1264,8 +1341,8 @@ module BaseTest
1264
1341
  d.emit('httpRequest' => 'a_string')
1265
1342
  d.run
1266
1343
  end
1267
- verify_log_entries(1, COMPUTE_PARAMS, 'structPayload') do |entry|
1268
- fields = get_fields(entry['structPayload'])
1344
+ verify_log_entries(1, COMPUTE_PARAMS, 'jsonPayload') do |entry|
1345
+ fields = get_fields(entry['jsonPayload'])
1269
1346
  assert_equal 'a_string', get_string(fields['httpRequest']), entry
1270
1347
  assert_nil entry['httpRequest'], entry
1271
1348
  end
@@ -1273,11 +1350,6 @@ module BaseTest
1273
1350
 
1274
1351
  private
1275
1352
 
1276
- def uri_for_log(params)
1277
- 'https://logging.googleapis.com/v1beta3/projects/' + params[:project_id] +
1278
- '/logs/' + params[:log_name] + '/entries:write'
1279
- end
1280
-
1281
1353
  def stub_metadata_request(metadata_path, response_body)
1282
1354
  stub_request(:get, 'http://169.254.169.254/computeMetadata/v1/' +
1283
1355
  metadata_path)
@@ -1421,42 +1493,65 @@ module BaseTest
1421
1493
  }
1422
1494
  end
1423
1495
 
1496
+ def dataflow_log_entry(i)
1497
+ {
1498
+ step: DATAFLOW_STEP_ID,
1499
+ message: log_entry(i)
1500
+ }
1501
+ end
1502
+
1503
+ def ml_log_entry(i)
1504
+ {
1505
+ name: ML_LOG_AREA,
1506
+ message: log_entry(i)
1507
+ }
1508
+ end
1509
+
1424
1510
  def log_entry(i)
1425
1511
  'test log entry ' + i.to_s
1426
1512
  end
1427
1513
 
1428
- def check_labels(entry, common_labels, expected_labels)
1429
- # TODO(salty) test/handle overlap between common_labels and entry labels
1430
- all_labels ||= common_labels
1431
- all_labels.merge!(entry['metadata']['labels'] || {})
1432
- all_labels.each do |key, value|
1514
+ def check_labels(labels, expected_labels)
1515
+ labels.each do |key, value|
1433
1516
  assert value.is_a?(String), "Value #{value} for label #{key} " \
1434
1517
  'is not a string: ' + value.class.name
1435
1518
  assert expected_labels.key?(key), "Unexpected label #{key} => #{value}"
1436
1519
  assert_equal expected_labels[key], value, 'Value mismatch - expected ' \
1437
1520
  "#{expected_labels[key]} in #{key} => #{value}"
1438
1521
  end
1439
- assert_equal expected_labels.length, all_labels.length, 'Expected ' \
1440
- "#{expected_labels.length} labels, got #{all_labels.length}"
1522
+ assert_equal expected_labels.length, labels.length, 'Expected ' \
1523
+ "#{expected_labels.length} labels: #{expected_labels}, got " \
1524
+ "#{labels.length} labels: #{labels}"
1441
1525
  end
1442
1526
 
1443
1527
  # The caller can optionally provide a block which is called for each entry.
1444
1528
  def verify_json_log_entries(n, params, payload_type = 'textPayload')
1445
1529
  i = 0
1446
- @logs_sent.each do |batch|
1447
- batch['entries'].each do |entry|
1530
+ @logs_sent.each do |request|
1531
+ request['entries'].each do |entry|
1448
1532
  unless payload_type.empty?
1449
1533
  assert entry.key?(payload_type), 'Entry did not contain expected ' \
1450
1534
  "#{payload_type} key: " + entry.to_s
1451
1535
  # Check the payload for textPayload, otherwise it's up to the caller.
1452
1536
  if payload_type == 'textPayload'
1453
- assert_equal "test log entry #{i}", entry['textPayload'], batch
1537
+ assert_equal "test log entry #{i}", entry['textPayload'], request
1454
1538
  end
1455
1539
  end
1456
1540
 
1457
- assert_equal params[:zone], entry['metadata']['zone']
1458
- assert_equal params[:service_name], entry['metadata']['serviceName']
1459
- check_labels entry, batch['commonLabels'], params[:labels]
1541
+ # per-entry resource or log_name overrides the corresponding field
1542
+ # from the request. Labels are merged, with the per-entry label
1543
+ # taking precedence in case of overlap.
1544
+ resource = entry['resource'] || request['resource']
1545
+ log_name = entry['logName'] || request['logName']
1546
+
1547
+ labels ||= request['labels']
1548
+ labels.merge!(entry['labels'] || {})
1549
+
1550
+ assert_equal \
1551
+ "projects/#{params[:project_id]}/logs/#{params[:log_name]}", log_name
1552
+ assert_equal params[:resource][:type], resource['type']
1553
+ check_labels resource['labels'], params[:resource][:labels]
1554
+ check_labels labels, params[:labels]
1460
1555
  yield(entry) if block_given?
1461
1556
  i += 1
1462
1557
  assert i <= n, "Number of entries #{i} exceeds expected number #{n}"
@@ -1465,14 +1560,9 @@ module BaseTest
1465
1560
  assert i == n, "Number of entries #{i} does not match expected number #{n}"
1466
1561
  end
1467
1562
 
1468
- # The http request message to test against.
1469
- def http_request_message
1470
- HTTP_REQUEST_MESSAGE
1471
- end
1472
-
1473
1563
  # Replace the 'referer' field with nil.
1474
1564
  def http_request_message_with_nil_referer
1475
- http_request_message.merge('referer' => nil)
1565
+ HTTP_REQUEST_MESSAGE.merge('referer' => nil)
1476
1566
  end
1477
1567
 
1478
1568
  # This module expects the methods below to be overridden.
@@ -1503,8 +1593,8 @@ module BaseTest
1503
1593
  _undefined
1504
1594
  end
1505
1595
 
1506
- # Get the fields of the struct payload.
1507
- def get_fields(_struct_payload)
1596
+ # Get the fields of the payload.
1597
+ def get_fields(_payload)
1508
1598
  _undefined
1509
1599
  end
1510
1600