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.
- checksums.yaml +4 -4
- data/Gemfile.lock +20 -1
- data/fluent-plugin-google-cloud.gemspec +2 -1
- data/lib/fluent/plugin/out_google_cloud.rb +355 -205
- data/test/plugin/base_test.rb +301 -211
- data/test/plugin/test_out_google_cloud.rb +17 -33
- data/test/plugin/test_out_google_cloud_grpc.rb +26 -33
- metadata +18 -9
- data/lib/google/logging/type/http_request_pb.rb +0 -30
- data/lib/google/logging/type/log_severity_pb.rb +0 -26
- data/lib/google/logging/v1/log_entry_pb.rb +0 -52
- data/lib/google/logging/v1/logging_pb.rb +0 -84
- data/lib/google/logging/v1/logging_services_pb.rb +0 -150
data/test/plugin/base_test.rb
CHANGED
@@ -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
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
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
|
-
|
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
|
-
"#{
|
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
|
-
|
195
|
-
|
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
|
-
"#{
|
200
|
-
"#{
|
201
|
-
"#{
|
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
|
-
|
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
|
-
"#{
|
217
|
-
|
218
|
-
"#{
|
219
|
-
"#{
|
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
|
-
"#{
|
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
|
-
|
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
|
-
"#{
|
239
|
-
|
240
|
-
"#{
|
241
|
-
"#{
|
242
|
-
"#{
|
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
|
-
|
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
|
-
"#{
|
262
|
-
|
263
|
-
|
264
|
-
"#{
|
265
|
-
"#{
|
266
|
-
"#{
|
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
|
-
|
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
|
-
"#{
|
279
|
-
|
280
|
-
|
281
|
-
"#{
|
282
|
-
"#{
|
283
|
-
"#{
|
284
|
-
|
285
|
-
|
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
|
-
|
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
|
-
"#{
|
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
|
-
|
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
|
-
"#{
|
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
|
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
|
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
|
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, '
|
566
|
-
fields = get_fields(entry['
|
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
|
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, '
|
592
|
-
fields = get_fields(entry['
|
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
|
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
|
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?('
|
647
|
-
fields = get_fields(entry['
|
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, '
|
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
|
-
|
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
|
-
|
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
|
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
|
732
|
-
|
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
|
-
|
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
|
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
|
772
|
-
|
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
|
-
|
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['
|
925
|
+
assert_equal_with_default entry['timestamp']['seconds'],
|
837
926
|
expected_ts[verify_index].tv_sec, 0, entry
|
838
|
-
assert_equal_with_default entry['
|
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['
|
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
|
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, '
|
861
|
-
fields = get_fields(entry['
|
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
|
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, '
|
954
|
-
fields = get_fields(entry['
|
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
|
-
|
1028
|
-
assert_equal
|
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
|
1050
|
-
assert_equal CONTAINER_NANOS,
|
1051
|
-
|
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
|
1073
|
-
assert_equal CONTAINER_NANOS,
|
1074
|
-
|
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
|
-
|
1091
|
-
assert_equal
|
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: { "#{
|
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
|
-
|
1111
|
-
assert_equal
|
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
|
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
|
-
'
|
1129
|
-
fields = get_fields(entry['
|
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
|
-
|
1136
|
-
assert_equal
|
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
|
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
|
-
'
|
1154
|
-
fields = get_fields(entry['
|
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
|
-
|
1161
|
-
assert_equal
|
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['
|
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['
|
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' =>
|
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
|
1240
|
-
assert_nil get_fields(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' =>
|
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
|
1254
|
-
fields = get_fields(entry['
|
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, '
|
1268
|
-
fields = get_fields(entry['
|
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(
|
1429
|
-
|
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,
|
1440
|
-
"#{expected_labels.length} labels, got
|
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 |
|
1447
|
-
|
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'],
|
1537
|
+
assert_equal "test log entry #{i}", entry['textPayload'], request
|
1454
1538
|
end
|
1455
1539
|
end
|
1456
1540
|
|
1457
|
-
|
1458
|
-
|
1459
|
-
|
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
|
-
|
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
|
1507
|
-
def get_fields(
|
1596
|
+
# Get the fields of the payload.
|
1597
|
+
def get_fields(_payload)
|
1508
1598
|
_undefined
|
1509
1599
|
end
|
1510
1600
|
|