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.
- 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
|
|