fluent-plugin-google-cloud 0.6.5.pre.1 → 0.6.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -516,6 +516,11 @@ module BaseTest
516
516
  'timestampSeconds' => ts.tv_sec, 'timestampNanos' => ts.tv_nsec)
517
517
  expected_ts.push(ts)
518
518
  emit_index += 1
519
+ d.emit('message' => log_entry(emit_index),
520
+ 'timestampSeconds' => "#{ts.tv_sec}",
521
+ 'timestampNanos' => "#{ts.tv_nsec}")
522
+ expected_ts.push(ts)
523
+ emit_index += 1
519
524
  d.run
520
525
  end
521
526
  end
@@ -779,134 +784,6 @@ module BaseTest
779
784
  end
780
785
  end
781
786
 
782
- # Docker Container.
783
-
784
- # Test textPayload logs from Docker container stderr / stdout.
785
- def test_text_payload_docker_container_logs
786
- setup_gce_metadata_stubs
787
- [1, 2, 3, 5, 11, 50].each do |n|
788
- @logs_sent = []
789
- setup_logging_stubs do
790
- d = create_driver(APPLICATION_DEFAULT_CONFIG, DOCKER_CONTAINER_TAG)
791
- # Generate log entries with 'log' (simply a string) and 'time' fields.
792
- n.times { |i| d.emit(docker_container_log_entry(log_entry(i))) }
793
- d.run
794
- end
795
- # 'container_id' and 'container_name' should have been extracted from tag
796
- # and properly set in resource.labels and common metadata labels as in
797
- # DOCKER_CONTAINER_PARAMS.
798
- verify_log_entries(n, DOCKER_CONTAINER_PARAMS) do |entry|
799
- # Timestamp in 'time' field from log entry should be set properly.
800
- assert_equal DOCKER_CONTAINER_SECONDS_EPOCH,
801
- entry['timestamp']['seconds'], entry
802
- assert_equal DOCKER_CONTAINER_NANOS, entry['timestamp']['nanos'],
803
- entry
804
- # Severity is 'DEFAULT' because 'stream' info is absent from log entry.
805
- assert_equal_with_default entry['severity'], 'DEFAULT', 'DEFAULT', entry
806
- end
807
- end
808
- end
809
-
810
- # Test jsonPayload logs from Docker container stderr / stdout.
811
- def test_json_payload_docker_container_logs
812
- setup_gce_metadata_stubs
813
- [1, 2, 3, 5, 11, 50].each do |n|
814
- @logs_sent = []
815
- setup_logging_stubs do
816
- d = create_driver(APPLICATION_DEFAULT_CONFIG, DOCKER_CONTAINER_TAG)
817
- n.times do
818
- # Generate log entries with 'log' (json) and 'time' fields.
819
- d.emit(docker_container_log_entry('{"msg": "test log entry ' \
820
- "#{n}" \
821
- '", "tag2": "test", "data": ' \
822
- '5000, "severity": "WARNING"}'))
823
- end
824
- d.run
825
- end
826
- # 'container_id' and 'container_name' should have been extracted from tag
827
- # and properly set in resource.labels and common metadata labels as in
828
- # DOCKER_CONTAINER_PARAMS.
829
- verify_log_entries(n, DOCKER_CONTAINER_PARAMS, 'jsonPayload') do |entry|
830
- # 'log' field should be detected as json and parsed properly.
831
- fields = get_fields(entry['jsonPayload'])
832
- assert_equal 3, fields.size, entry
833
- assert_equal "test log entry #{n}", get_string(fields['msg']), entry
834
- assert_equal 'test', get_string(fields['tag2']), entry
835
- assert_equal 5000, get_number(fields['data']), entry
836
- # Timestamp in 'time' field from log entry should be set properly.
837
- assert_equal DOCKER_CONTAINER_SECONDS_EPOCH,
838
- entry['timestamp']['seconds'], entry
839
- assert_equal DOCKER_CONTAINER_NANOS, entry['timestamp']['nanos'], entry
840
- # Severity in 'severity' field from log entry should be set properly.
841
- assert_equal 'WARNING', entry['severity'], entry
842
- end
843
- end
844
- end
845
-
846
- # Test the following metadata is properly extracted from json record:
847
- # * container_id
848
- # * container_name
849
- # * source (this field maps to the 'stream' metadata label.
850
- def test_docker_container_logs_metadata_from_json_record
851
- setup_gce_metadata_stubs
852
- {
853
- # 'stream' label should be extracted from json record when present.
854
- docker_container_log_entry_with_metadata(
855
- log_entry(0)
856
- ) => {
857
- # When the 'source' field from the json record has value 'stdout',
858
- # 'severity' should be 'INFO'.
859
- 'params' => DOCKER_CONTAINER_PARAMS_WITH_STREAM_STDOUT,
860
- 'severity' => 'INFO'
861
- },
862
- # 'container_id' and 'container_name' can be extracted from tag or
863
- # json record. If present in both cases, values in the json record will
864
- # overwrite values in tags. For example:
865
- # DOCKER_CONTAINER_PARAMS_WITH_METADATA_OVERWRITTEN has different
866
- # 'container_id' and 'container_name' values from DOCKER_CONTAINER_TAG,
867
- # and we need to verify these two fields get overwritten as expected.
868
- docker_container_log_entry_with_metadata(
869
- log_entry(0), DOCKER_CONTAINER_ID2, DOCKER_CONTAINER_NAME2,
870
- DOCKER_CONTAINER_STREAM_STDERR
871
- ) => {
872
- # When the 'source' field from the json record has value 'stderr',
873
- # 'severity' should be 'ERROR'.
874
- 'params' => DOCKER_CONTAINER_PARAMS_WITH_METADATA_OVERWRITTEN,
875
- 'severity' => 'ERROR'
876
- }
877
- }.each do |log_entry, expected|
878
- @logs_sent = []
879
- setup_logging_stubs do
880
- d = create_driver(APPLICATION_DEFAULT_CONFIG, DOCKER_CONTAINER_TAG)
881
- d.emit(log_entry)
882
- d.run
883
- end
884
- verify_log_entries(1, expected['params']) do |entry|
885
- assert_equal DOCKER_CONTAINER_SECONDS_EPOCH,
886
- entry['timestamp']['seconds'], entry
887
- assert_equal DOCKER_CONTAINER_NANOS, entry['timestamp']['nanos'],
888
- entry
889
- assert_equal_with_default entry['severity'], expected['severity'],
890
- 'DEFAULT', entry
891
- end
892
- end
893
- end
894
-
895
- # Test logs from applications running in Docker containers.
896
- def test_docker_container_application_logs
897
- setup_gce_metadata_stubs
898
- setup_docker_remote_api_stubs
899
- setup_logging_stubs do
900
- # Metadata Agent is not enabled. Will call Docker Remote API for
901
- # container info.
902
- d = create_driver(APPLICATION_DEFAULT_CONFIG,
903
- DOCKER_CONTAINER_TAG_WITH_APPLICATION)
904
- d.emit('message' => log_entry(0))
905
- d.run
906
- end
907
- verify_log_entries(1, DOCKER_CONTAINER_WITH_APPLICATION_PARAMS)
908
- end
909
-
910
787
  def test_cloudfunctions_log
911
788
  setup_gce_metadata_stubs
912
789
  setup_cloudfunctions_metadata_stubs
@@ -982,47 +859,40 @@ module BaseTest
982
859
  verify_log_entries(1, DATAPROC_PARAMS, 'jsonPayload')
983
860
  end
984
861
 
985
- def test_http_request_from_record
986
- setup_gce_metadata_stubs
987
- setup_logging_stubs do
988
- d = create_driver
989
- d.emit('httpRequest' => HTTP_REQUEST_MESSAGE)
990
- d.run
991
- end
992
- verify_log_entries(1, COMPUTE_PARAMS, 'httpRequest') do |entry|
993
- assert_equal HTTP_REQUEST_MESSAGE, entry['httpRequest'], entry
994
- assert_nil get_fields(entry['jsonPayload'])['httpRequest'], entry
995
- end
862
+ def test_log_entry_http_request_field_from_record
863
+ verify_subfields_from_record(DEFAULT_HTTP_REQUEST_KEY)
996
864
  end
997
865
 
998
- def test_http_request_partial_from_record
999
- setup_gce_metadata_stubs
1000
- setup_logging_stubs do
1001
- d = create_driver
1002
- d.emit('httpRequest' => HTTP_REQUEST_MESSAGE.merge(
1003
- 'otherKey' => 'value'))
1004
- d.run
1005
- end
1006
- verify_log_entries(1, COMPUTE_PARAMS, 'httpRequest') do |entry|
1007
- assert_equal HTTP_REQUEST_MESSAGE, entry['httpRequest'], entry
1008
- fields = get_fields(entry['jsonPayload'])
1009
- request = get_fields(get_struct(fields['httpRequest']))
1010
- assert_equal 'value', get_string(request['otherKey']), entry
1011
- end
866
+ def test_log_entry_source_location_field_from_record
867
+ verify_subfields_from_record(DEFAULT_SOURCE_LOCATION_KEY)
1012
868
  end
1013
869
 
1014
- def test_http_request_when_not_hash
1015
- setup_gce_metadata_stubs
1016
- setup_logging_stubs do
1017
- d = create_driver
1018
- d.emit('httpRequest' => 'a_string')
1019
- d.run
1020
- end
1021
- verify_log_entries(1, COMPUTE_PARAMS, 'jsonPayload') do |entry|
1022
- fields = get_fields(entry['jsonPayload'])
1023
- assert_equal 'a_string', get_string(fields['httpRequest']), entry
1024
- assert_nil entry['httpRequest'], entry
1025
- end
870
+ def test_log_entry_operation_field_from_record
871
+ verify_subfields_from_record(DEFAULT_OPERATION_KEY)
872
+ end
873
+
874
+ def test_log_entry_http_request_field_partial_from_record
875
+ verify_subfields_partial_from_record(DEFAULT_HTTP_REQUEST_KEY)
876
+ end
877
+
878
+ def test_log_entry_source_location_field_partial_from_record
879
+ verify_subfields_partial_from_record(DEFAULT_SOURCE_LOCATION_KEY)
880
+ end
881
+
882
+ def test_log_entry_operation_field_partial_from_record
883
+ verify_subfields_partial_from_record(DEFAULT_OPERATION_KEY)
884
+ end
885
+
886
+ def test_log_entry_http_request_field_when_not_hash
887
+ verify_subfields_when_not_hash(DEFAULT_HTTP_REQUEST_KEY)
888
+ end
889
+
890
+ def test_log_entry_source_location_field_when_not_hash
891
+ verify_subfields_when_not_hash(DEFAULT_SOURCE_LOCATION_KEY)
892
+ end
893
+
894
+ def test_log_entry_operation_field_when_not_hash
895
+ verify_subfields_when_not_hash(DEFAULT_OPERATION_KEY)
1026
896
  end
1027
897
 
1028
898
  def test_http_request_from_record_with_referer_nil_or_absent
@@ -1082,7 +952,48 @@ module BaseTest
1082
952
  end
1083
953
  end
1084
954
 
1085
- def test_trace_field_assignment
955
+ def test_labels_from_record
956
+ setup_gce_metadata_stubs
957
+ setup_logging_stubs do
958
+ d = create_driver
959
+ d.emit(DEFAULT_LABELS_KEY => CUSTOM_LABELS_MESSAGE)
960
+ d.run
961
+ end
962
+ labels = COMPUTE_PARAMS[:labels].merge(CUSTOM_LABELS_MESSAGE)
963
+ params = COMPUTE_PARAMS.merge(labels: labels)
964
+ verify_log_entries(1, params, 'labels') do |entry|
965
+ assert_nil get_fields(entry['jsonPayload'])[DEFAULT_LABELS_KEY], entry
966
+ end
967
+ end
968
+
969
+ def test_labels_from_record_conflict
970
+ setup_gce_metadata_stubs
971
+ setup_logging_stubs do
972
+ d = create_driver
973
+ d.emit(DEFAULT_LABELS_KEY => { CONFLICTING_LABEL_KEY => 'a_string' })
974
+ d.run
975
+ end
976
+ verify_log_entries(1, COMPUTE_PARAMS, 'jsonPayload') do |entry|
977
+ fields = get_fields(entry['jsonPayload'])
978
+ labels = get_fields(get_struct(fields[DEFAULT_LABELS_KEY]))
979
+ assert_equal('a_string', get_string(labels[CONFLICTING_LABEL_KEY]), entry)
980
+ end
981
+ end
982
+
983
+ def test_labels_from_record_when_not_hash
984
+ setup_gce_metadata_stubs
985
+ setup_logging_stubs do
986
+ d = create_driver
987
+ d.emit(DEFAULT_LABELS_KEY => 'a_string')
988
+ d.run
989
+ end
990
+ verify_log_entries(1, COMPUTE_PARAMS, 'jsonPayload') do |entry|
991
+ fields = get_fields(entry['jsonPayload'])
992
+ assert_equal 'a_string', get_string(fields[DEFAULT_LABELS_KEY]), entry
993
+ end
994
+ end
995
+
996
+ def test_log_entry_trace_field
1086
997
  setup_gce_metadata_stubs
1087
998
  message = log_entry(0)
1088
999
  trace = 'projects/project-1/traces/1234567890abcdef1234567890abcdef'
@@ -1091,24 +1002,28 @@ module BaseTest
1091
1002
  # It leaves trace entry field nil if no trace value sent.
1092
1003
  driver_config: APPLICATION_DEFAULT_CONFIG,
1093
1004
  emitted_log: { 'msg' => message },
1005
+ expected_fields: { 'msg' => message },
1094
1006
  expected_trace_value: nil
1095
1007
  },
1096
1008
  {
1097
1009
  # By default, it sets trace via Google-specific key.
1098
1010
  driver_config: APPLICATION_DEFAULT_CONFIG,
1099
1011
  emitted_log: { 'msg' => message, DEFAULT_TRACE_KEY => trace },
1012
+ expected_fields: { 'msg' => message },
1100
1013
  expected_trace_value: trace
1101
1014
  },
1102
1015
  {
1103
1016
  # It allows setting the trace via a custom configured key.
1104
1017
  driver_config: CONFIG_CUSTOM_TRACE_KEY_SPECIFIED,
1105
1018
  emitted_log: { 'msg' => message, 'custom_trace_key' => trace },
1019
+ expected_fields: { 'msg' => message },
1106
1020
  expected_trace_value: trace
1107
1021
  },
1108
1022
  {
1109
1023
  # It no longer sets trace by the default key if custom key specified.
1110
1024
  driver_config: CONFIG_CUSTOM_TRACE_KEY_SPECIFIED,
1111
1025
  emitted_log: { 'msg' => message, DEFAULT_TRACE_KEY => trace },
1026
+ expected_fields: { 'msg' => message, DEFAULT_TRACE_KEY => trace },
1112
1027
  expected_trace_value: nil
1113
1028
  }
1114
1029
  ].each do |input|
@@ -1120,129 +1035,16 @@ module BaseTest
1120
1035
  end
1121
1036
  verify_log_entries(1, COMPUTE_PARAMS, 'jsonPayload') do |entry|
1122
1037
  assert_equal input[:expected_trace_value], entry['trace'], input
1123
- end
1124
- end
1125
- end
1126
1038
 
1127
- def test_trace_removal_from_json_payload
1128
- setup_gce_metadata_stubs
1129
- message = log_entry(0)
1130
- trace = 'projects/project-1/traces/1234567890abcdef1234567890abcdef'
1131
- [
1132
- {
1133
- # By default, it removes trace value from jsonPayload.
1134
- driver_config: APPLICATION_DEFAULT_CONFIG,
1135
- emitted_log: { 'msg' => message, DEFAULT_TRACE_KEY => trace },
1136
- expected_json_payload: { 'msg' => message }
1137
- },
1138
- {
1139
- # It keeps the trace value in jsonPayload if keep_trace_key set to true.
1140
- driver_config: CONFIG_KEEP_TRACE_KEY_TRUE,
1141
- emitted_log: { 'msg' => message, DEFAULT_TRACE_KEY => trace },
1142
- expected_json_payload: { 'msg' => message, DEFAULT_TRACE_KEY => trace }
1143
- }
1144
- ].each do |input|
1145
- setup_logging_stubs do
1146
- @logs_sent = []
1147
- d = create_driver(input[:driver_config])
1148
- d.emit(input[:emitted_log])
1149
- d.run
1150
- end
1151
- verify_log_entries(1, COMPUTE_PARAMS, 'jsonPayload') do |entry|
1152
1039
  fields = get_fields(entry['jsonPayload'])
1153
- assert_equal input[:expected_json_payload].size, fields.size, input
1040
+ assert_equal input[:expected_fields].size, fields.size, input
1154
1041
  fields.each do |key, value|
1155
- assert_equal(input[:expected_json_payload][key],
1156
- get_string(value), input)
1042
+ assert_equal input[:expected_fields][key], get_string(value), input
1157
1043
  end
1158
1044
  end
1159
1045
  end
1160
1046
  end
1161
1047
 
1162
- # Metadata Agent related tests.
1163
- def test_configure_enable_metadata_agent_default_and_false
1164
- setup_gce_metadata_stubs
1165
- [create_driver, create_driver(DISABLE_METADATA_AGENT_CONFIG)].each do |d|
1166
- assert_false d.instance.instance_variable_get(:@enable_metadata_agent)
1167
- end
1168
- end
1169
-
1170
- def test_configure_enable_metadata_agent_true
1171
- setup_gce_metadata_stubs
1172
- setup_metadata_agent_stubs(IMPLICIT_MONITORED_RESOURCE_UNIQUE_KEY)
1173
- d = create_driver(ENABLE_METADATA_AGENT_CONFIG)
1174
- assert_true d.instance.instance_variable_get(:@enable_metadata_agent)
1175
- end
1176
-
1177
- # Test an implicit monitored resource can be retrieved from Metadata Agent
1178
- # with an empty string as the locally-unique id.
1179
- def test_retrieve_implicit_monitored_resource
1180
- # Minimum set up for gce metadata stubs. Stubs for 'vm_id' and 'location'
1181
- # info are deliberately not set up.
1182
- setup_gce_metadata_stubs_minimum
1183
- setup_metadata_agent_stubs(IMPLICIT_MONITORED_RESOURCE_UNIQUE_KEY)
1184
- setup_logging_stubs do
1185
- d = create_driver(ENABLE_METADATA_AGENT_CONFIG)
1186
- d.emit('message' => log_entry(0))
1187
- d.run
1188
- end
1189
- verify_log_entries(1, COMPUTE_PARAMS)
1190
- end
1191
-
1192
- # Test a docker container monitored resource can be retrieved from Metadata
1193
- # Agent with "container.<container_id>" as the locally-unique id.
1194
- def test_retrieve_docker_container_monitored_resource
1195
- setup_gce_metadata_stubs_minimum
1196
- setup_metadata_agent_stubs(IMPLICIT_MONITORED_RESOURCE_UNIQUE_KEY)
1197
- setup_metadata_agent_stubs(DOCKER_CONSTANTS[:resource_type])
1198
- setup_logging_stubs do
1199
- # Tag format here: "container.<container_id>.<container_name>"
1200
- d = create_driver(ENABLE_METADATA_AGENT_CONFIG, DOCKER_CONTAINER_TAG)
1201
- d.emit('message' => log_entry(0))
1202
- d.run
1203
- end
1204
- # gce_metadata_stubs has ZONE1, while metadata agent stub has ZONE2. Here we
1205
- # need to verify ZONE2 overwrites ZONE1 as expected.
1206
- verify_log_entries(1, DOCKER_CONTAINER_PARAMS_WITH_ZONE2)
1207
- end
1208
-
1209
- # Test a docker container monitored resource can be retrieved from Metadata
1210
- # Agent with "container.<container_name>" as the locally-unique id when the
1211
- # log entry comes from an application running in the docker container.
1212
- def test_retrieve_docker_container_monitored_resource_with_application
1213
- setup_gce_metadata_stubs_minimum
1214
- setup_metadata_agent_stubs(IMPLICIT_MONITORED_RESOURCE_UNIQUE_KEY)
1215
- setup_metadata_agent_stubs(
1216
- "#{DOCKER_CONSTANTS[:resource_type]}_application")
1217
- setup_logging_stubs do
1218
- # Tag format here: "application-container.<container_name>.
1219
- # <additional_tag>"
1220
- d = create_driver(ENABLE_METADATA_AGENT_CONFIG,
1221
- DOCKER_CONTAINER_TAG_WITH_APPLICATION)
1222
- d.emit('message' => log_entry(0))
1223
- d.run
1224
- end
1225
- verify_log_entries(1, DOCKER_CONTAINER_WITH_APPLICATION_PARAMS)
1226
- end
1227
-
1228
- # Test a GKE container monitored resource can be retrieved from Metadata
1229
- # Agent with "gke_containerName.<namespace_id>.<pod_name>.<container_name>" as
1230
- # the locally-unique id when the log entry comes from an application running
1231
- # in Kubenetes.
1232
- def test_retrieve_gke_application_container_monitored_resource
1233
- setup_gce_metadata_stubs_minimum
1234
- setup_container_metadata_stubs
1235
- setup_metadata_agent_stubs(IMPLICIT_MONITORED_RESOURCE_UNIQUE_KEY)
1236
- setup_metadata_agent_stubs(
1237
- "#{CONTAINER_CONSTANTS[:resource_type]}_application")
1238
- setup_logging_stubs do
1239
- d = create_driver(ENABLE_METADATA_AGENT_CONFIG)
1240
- d.emit(gke_application_container_log_entry(log_entry(0)))
1241
- d.run
1242
- end
1243
- verify_log_entries(1, CONTAINER_FROM_APPLICATION_PARAMS)
1244
- end
1245
-
1246
1048
  private
1247
1049
 
1248
1050
  def stub_metadata_request(metadata_path, response_body)
@@ -1279,26 +1081,6 @@ module BaseTest
1279
1081
  'Content-Type' => 'application/json' })
1280
1082
  end
1281
1083
 
1282
- # The minimum stubs needed for infomation that Metadata Agent can not provide.
1283
- def setup_gce_metadata_stubs_minimum
1284
- # Stub the root, used for platform detection by the plugin and 'googleauth'.
1285
- stub_request(:get, 'http://169.254.169.254')
1286
- .to_return(status: 200, headers: { 'Metadata-Flavor' => 'Google' })
1287
-
1288
- # Create stubs for all the GCE metadata lookups the agent needs to make.
1289
- stub_metadata_request('project/project-id', PROJECT_ID)
1290
- stub_metadata_request('instance/attributes/',
1291
- "attribute1\nattribute2\nattribute3")
1292
-
1293
- # Used by 'googleauth' to fetch the default service account credentials.
1294
- stub_request(:get, 'http://169.254.169.254/computeMetadata/v1/' \
1295
- 'instance/service-accounts/default/token')
1296
- .to_return(body: %({"access_token": "#{FAKE_AUTH_TOKEN}"}),
1297
- status: 200,
1298
- headers: { 'Content-Length' => FAKE_AUTH_TOKEN.length,
1299
- 'Content-Type' => 'application/json' })
1300
- end
1301
-
1302
1084
  def setup_ec2_metadata_stubs
1303
1085
  # Stub the root, used for platform detection.
1304
1086
  stub_request(:get, 'http://169.254.169.254')
@@ -1349,11 +1131,6 @@ module BaseTest
1349
1131
  'KUBE_BEARER_TOKEN: AoQiMuwkNP2BMT0S')
1350
1132
  end
1351
1133
 
1352
- def setup_docker_remote_api_stubs
1353
- stub_request(:get, "http://unix/containers/#{DOCKER_CONTAINER_NAME}/json")
1354
- .to_return(status: 200, body: "{\"Id\":\"#{DOCKER_CONTAINER_ID}\"}")
1355
- end
1356
-
1357
1134
  def setup_cloudfunctions_metadata_stubs
1358
1135
  stub_metadata_request(
1359
1136
  'instance/attributes/',
@@ -1383,20 +1160,11 @@ module BaseTest
1383
1160
  Prometheus::Client.registry.instance_variable_set('@metrics', {})
1384
1161
  end
1385
1162
 
1386
- def setup_metadata_agent_stubs(resource_type)
1387
- unique_id = MONITORED_RESOURCE_STUBS[resource_type]['unique_id']
1388
- resource = MONITORED_RESOURCE_STUBS[resource_type]['monitored_resource']
1389
- stub_request(:get, 'http://local-metadata-agent.stackdriver.com:8000' \
1390
- "/monitoredResource/#{unique_id}")
1391
- .to_return(status: 200, body: resource)
1392
- end
1393
-
1394
1163
  def container_tag_with_container_name(container_name)
1395
1164
  "kubernetes.#{CONTAINER_POD_NAME}_#{CONTAINER_NAMESPACE_NAME}_" \
1396
1165
  "#{container_name}"
1397
1166
  end
1398
1167
 
1399
- # GKE Container
1400
1168
  def container_log_entry_with_metadata(
1401
1169
  log, container_name = CONTAINER_CONTAINER_NAME)
1402
1170
  {
@@ -1424,37 +1192,6 @@ module BaseTest
1424
1192
  }
1425
1193
  end
1426
1194
 
1427
- def gke_application_container_log_entry(log)
1428
- {
1429
- log: log,
1430
- LOCALLY_UNIQUE_ID_LABEL_NAME => 'gke_containerName' \
1431
- ".#{CONTAINER_NAMESPACE_ID}" \
1432
- ".#{CONTAINER_POD_NAME}" \
1433
- ".#{CONTAINER_CONTAINER_NAME}"
1434
- }
1435
- end
1436
-
1437
- # Docker Container
1438
- def docker_container_log_entry_with_metadata(
1439
- log, container_id = DOCKER_CONTAINER_ID,
1440
- container_name = DOCKER_CONTAINER_NAME,
1441
- stream = DOCKER_CONTAINER_STREAM_STDOUT)
1442
- {
1443
- log: log,
1444
- container_id: container_id,
1445
- container_name: container_name,
1446
- time: DOCKER_CONTAINER_TIMESTAMP,
1447
- source: stream
1448
- }
1449
- end
1450
-
1451
- def docker_container_log_entry(log)
1452
- {
1453
- log: log,
1454
- time: CONTAINER_TIMESTAMP
1455
- }
1456
- end
1457
-
1458
1195
  def cloudfunctions_log_entry(i)
1459
1196
  {
1460
1197
  stream: 'stdout',
@@ -1545,14 +1282,14 @@ module BaseTest
1545
1282
  assert i == n, "Number of entries #{i} does not match expected number #{n}"
1546
1283
  end
1547
1284
 
1548
- def verify_container_logs(log_entry_method, expected_params)
1285
+ def verify_container_logs(log_entry_factory, expected_params)
1549
1286
  setup_gce_metadata_stubs
1550
1287
  setup_container_metadata_stubs
1551
1288
  [1, 2, 3, 5, 11, 50].each do |n|
1552
1289
  @logs_sent = []
1553
1290
  setup_logging_stubs do
1554
1291
  d = create_driver(APPLICATION_DEFAULT_CONFIG, CONTAINER_TAG)
1555
- n.times { |i| d.emit(log_entry_method.call(log_entry(i))) }
1292
+ n.times { |i| d.emit(log_entry_factory.call(log_entry(i))) }
1556
1293
  d.run
1557
1294
  end
1558
1295
  verify_log_entries(n, expected_params) do |entry|
@@ -1564,6 +1301,55 @@ module BaseTest
1564
1301
  end
1565
1302
  end
1566
1303
 
1304
+ def verify_subfields_from_record(payload_key)
1305
+ destination_key, payload_value = LOG_ENTRY_SUBFIELDS_PARAMS[payload_key]
1306
+ @logs_sent = []
1307
+ setup_gce_metadata_stubs
1308
+ setup_logging_stubs do
1309
+ d = create_driver
1310
+ d.emit(payload_key => payload_value)
1311
+ d.run
1312
+ end
1313
+ verify_log_entries(1, COMPUTE_PARAMS, destination_key) do |entry|
1314
+ assert_equal payload_value, entry[destination_key], entry
1315
+ fields = get_fields(entry['jsonPayload'])
1316
+ assert_nil fields[payload_key], entry
1317
+ end
1318
+ end
1319
+
1320
+ def verify_subfields_partial_from_record(payload_key)
1321
+ destination_key, payload_value = LOG_ENTRY_SUBFIELDS_PARAMS[payload_key]
1322
+ @logs_sent = []
1323
+ setup_gce_metadata_stubs
1324
+ setup_logging_stubs do
1325
+ d = create_driver
1326
+ d.emit(payload_key => payload_value.merge('otherKey' => 'value'))
1327
+ d.run
1328
+ end
1329
+ verify_log_entries(1, COMPUTE_PARAMS, destination_key) do |entry|
1330
+ assert_equal payload_value, entry[destination_key], entry
1331
+ fields = get_fields(entry['jsonPayload'])
1332
+ request = get_fields(get_struct(fields[payload_key]))
1333
+ assert_equal 'value', get_string(request['otherKey']), entry
1334
+ end
1335
+ end
1336
+
1337
+ def verify_subfields_when_not_hash(payload_key)
1338
+ destination_key = LOG_ENTRY_SUBFIELDS_PARAMS[payload_key][0]
1339
+ @logs_sent = []
1340
+ setup_gce_metadata_stubs
1341
+ setup_logging_stubs do
1342
+ d = create_driver
1343
+ d.emit(payload_key => 'a_string')
1344
+ d.run
1345
+ end
1346
+ verify_log_entries(1, COMPUTE_PARAMS, 'jsonPayload') do |entry|
1347
+ field = get_fields(entry['jsonPayload'])[payload_key]
1348
+ assert_equal 'a_string', get_string(field), entry
1349
+ assert_nil entry[destination_key], entry
1350
+ end
1351
+ end
1352
+
1567
1353
  # Replace the 'referer' field with nil.
1568
1354
  def http_request_message_with_nil_referer
1569
1355
  HTTP_REQUEST_MESSAGE.merge('referer' => nil)