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

Sign up to get free protection for your applications and to get access to all the features.
@@ -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