fluent-plugin-google-cloud 0.6.7 → 0.6.8.pre.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.
@@ -503,7 +503,7 @@ module BaseTest
503
503
  end
504
504
  params = CONTAINER_FROM_METADATA_PARAMS.merge(
505
505
  labels: CONTAINER_FROM_METADATA_PARAMS[:labels].merge(
506
- "#{CONTAINER_CONSTANTS[:service]}/container_name" =>
506
+ "#{GKE_CONSTANTS[:service]}/container_name" =>
507
507
  URI.decode(encoded_name)),
508
508
  log_name: encoded_name)
509
509
  verify_log_entries(0, params, 'textPayload')
@@ -830,7 +830,7 @@ module BaseTest
830
830
  d.run
831
831
  end
832
832
  expected_params = CONTAINER_FROM_TAG_PARAMS.merge(
833
- labels: { "#{CONTAINER_CONSTANTS[:service]}/stream" => 'stderr' }
833
+ labels: { "#{GKE_CONSTANTS[:service]}/stream" => 'stderr' }
834
834
  ) { |_, oldval, newval| oldval.merge(newval) }
835
835
  verify_log_entries(1, expected_params) do |entry, i|
836
836
  verify_default_log_entry_text(entry['textPayload'], i, entry)
@@ -1106,6 +1106,197 @@ module BaseTest
1106
1106
  end
1107
1107
  end
1108
1108
 
1109
+ # Metadata Agent related tests.
1110
+
1111
+ # Test enable_metadata_agent not set or set to false.
1112
+ def test_configure_enable_metadata_agent_default_and_false
1113
+ setup_gce_metadata_stubs
1114
+ [create_driver, create_driver(DISABLE_METADATA_AGENT_CONFIG)].each do |d|
1115
+ assert_false d.instance.instance_variable_get(:@enable_metadata_agent)
1116
+ end
1117
+ end
1118
+
1119
+ # Test enable_metadata_agent set to true.
1120
+ def test_configure_enable_metadata_agent_true
1121
+ new_stub_context do
1122
+ setup_gce_metadata_stubs
1123
+ setup_metadata_agent_stubs
1124
+ d = create_driver(ENABLE_METADATA_AGENT_CONFIG)
1125
+ assert_true d.instance.instance_variable_get(:@enable_metadata_agent)
1126
+ assert_requested_metadata_agent_stub(IMPLICIT_LOCAL_RESOURCE_ID)
1127
+ end
1128
+ end
1129
+
1130
+ # Test that an implicit monitored resource can be retrieved from Metadata
1131
+ # Agent with an empty string as the local_resource_id.
1132
+ def test_retrieve_implicit_monitored_resource
1133
+ # GCE metadata stubs has VM_ID and ZONE, while the Metadata Agent stub has
1134
+ # METADATA_VM_ID and METADATA_ZONE.
1135
+ new_stub_context do
1136
+ setup_gce_metadata_stubs
1137
+ setup_metadata_agent_stubs
1138
+ setup_logging_stubs do
1139
+ d = create_driver(ENABLE_METADATA_AGENT_CONFIG)
1140
+ d.emit('message' => log_entry(0))
1141
+ d.run
1142
+ end
1143
+ verify_log_entries(1, COMPUTE_PARAMS_WITH_METADATA_VM_ID_AND_ZONE)
1144
+ assert_requested_metadata_agent_stub(IMPLICIT_LOCAL_RESOURCE_ID)
1145
+ end
1146
+ end
1147
+
1148
+ # Docker Container.
1149
+
1150
+ # Test textPayload logs from Docker container stdout / stderr.
1151
+ def test_docker_container_stdout_stderr_logs_text_payload
1152
+ [1, 2, 3, 5, 11, 50].each do |n|
1153
+ new_stub_context do
1154
+ setup_gce_metadata_stubs
1155
+ setup_metadata_agent_stubs
1156
+ setup_logging_stubs do
1157
+ d = create_driver(DOCKER_CONTAINER_CONFIG)
1158
+ n.times do |i|
1159
+ d.emit(docker_container_stdout_stderr_log_entry(log_entry(i)))
1160
+ end
1161
+ d.run
1162
+ end
1163
+ verify_log_entries(n, DOCKER_CONTAINER_PARAMS)
1164
+ assert_requested_metadata_agent_stub(IMPLICIT_LOCAL_RESOURCE_ID)
1165
+ assert_requested_metadata_agent_stub("container.#{DOCKER_CONTAINER_ID}")
1166
+ end
1167
+ end
1168
+ end
1169
+
1170
+ # Test jsonPayload logs from Docker container stdout / stderr.
1171
+ def test_docker_container_stdout_stderr_logs_json_payload
1172
+ [1, 2, 3, 5, 11, 50].each do |n|
1173
+ new_stub_context do
1174
+ setup_gce_metadata_stubs
1175
+ setup_metadata_agent_stubs
1176
+ setup_logging_stubs do
1177
+ d = create_driver(DOCKER_CONTAINER_CONFIG)
1178
+ n.times do
1179
+ d.emit(docker_container_stdout_stderr_log_entry(
1180
+ '{"msg": "test log entry ' \
1181
+ "#{n}" \
1182
+ '", "tag2": "test", "data": ' \
1183
+ '5000, "severity": "WARNING"}'))
1184
+ end
1185
+ d.run
1186
+ end
1187
+ verify_log_entries(n, DOCKER_CONTAINER_PARAMS, 'jsonPayload') do |entry|
1188
+ fields = get_fields(entry['jsonPayload'])
1189
+ assert_equal 3, fields.size, entry
1190
+ assert_equal "test log entry #{n}", get_string(fields['msg']), entry
1191
+ assert_equal 'test', get_string(fields['tag2']), entry
1192
+ assert_equal 5000, get_number(fields['data']), entry
1193
+ end
1194
+ assert_requested_metadata_agent_stub(IMPLICIT_LOCAL_RESOURCE_ID)
1195
+ assert_requested_metadata_agent_stub("container.#{DOCKER_CONTAINER_ID}")
1196
+ end
1197
+ end
1198
+ end
1199
+
1200
+ # Test logs from applications running in Docker containers. These logs have
1201
+ # the label "logging.googleapis.com/local_resource_id" set in the format of
1202
+ # "containerName.<container_name>".
1203
+ def test_docker_container_application_logs
1204
+ new_stub_context do
1205
+ setup_gce_metadata_stubs
1206
+ setup_metadata_agent_stubs
1207
+ setup_logging_stubs do
1208
+ # Metadata Agent is not enabled. Will call Docker Remote API for
1209
+ # container info.
1210
+ d = create_driver(ENABLE_METADATA_AGENT_CONFIG)
1211
+ d.emit(docker_container_application_log_entry(log_entry(0)))
1212
+ d.run
1213
+ end
1214
+ verify_log_entries(1, DOCKER_CONTAINER_PARAMS_NO_STREAM)
1215
+ assert_requested_metadata_agent_stub(IMPLICIT_LOCAL_RESOURCE_ID)
1216
+ assert_requested_metadata_agent_stub(
1217
+ "containerName.#{DOCKER_CONTAINER_NAME}")
1218
+ end
1219
+ end
1220
+
1221
+ # Test that the 'time' field from the json record is extracted and set to
1222
+ # entry.timestamp for Docker container logs.
1223
+ def test_time_field_extraction_for_docker_container_logs
1224
+ new_stub_context do
1225
+ setup_gce_metadata_stubs
1226
+ setup_metadata_agent_stubs
1227
+ setup_logging_stubs do
1228
+ d = create_driver(ENABLE_METADATA_AGENT_CONFIG)
1229
+ d.emit(docker_container_application_log_entry(log_entry(0)))
1230
+ d.run
1231
+ end
1232
+ verify_log_entries(1, DOCKER_CONTAINER_PARAMS_NO_STREAM) do |entry, i|
1233
+ verify_default_log_entry_text(entry['textPayload'], i, entry)
1234
+ # Timestamp in 'time' field from log entry should be set properly.
1235
+ assert_equal DOCKER_CONTAINER_SECONDS_EPOCH,
1236
+ entry['timestamp']['seconds'], entry
1237
+ assert_equal DOCKER_CONTAINER_NANOS,
1238
+ entry['timestamp']['nanos'], entry
1239
+ end
1240
+ assert_requested_metadata_agent_stub(IMPLICIT_LOCAL_RESOURCE_ID)
1241
+ assert_requested_metadata_agent_stub(
1242
+ "containerName.#{DOCKER_CONTAINER_NAME}")
1243
+ end
1244
+ end
1245
+
1246
+ # Test that the 'source' field is properly extracted from the record json and
1247
+ # set as a common label 'stream'.
1248
+ def test_source_for_docker_container_logs
1249
+ {
1250
+ docker_container_stdout_stderr_log_entry(
1251
+ log_entry(0), DOCKER_CONTAINER_STREAM_STDOUT) =>
1252
+ DOCKER_CONTAINER_PARAMS,
1253
+ docker_container_stdout_stderr_log_entry(
1254
+ log_entry(0), DOCKER_CONTAINER_STREAM_STDERR) =>
1255
+ DOCKER_CONTAINER_PARAMS_STREAM_STDERR,
1256
+ docker_container_application_log_entry(log_entry(0)) =>
1257
+ DOCKER_CONTAINER_PARAMS_NO_STREAM,
1258
+ docker_container_application_log_entry(log_entry(0)) \
1259
+ .merge('severity' => 'warning') =>
1260
+ DOCKER_CONTAINER_PARAMS_NO_STREAM
1261
+ }.each do |log_entry, expected_params|
1262
+ new_stub_context do
1263
+ setup_gce_metadata_stubs
1264
+ setup_metadata_agent_stubs
1265
+ setup_logging_stubs do
1266
+ d = create_driver(DOCKER_CONTAINER_CONFIG)
1267
+ d.emit(log_entry)
1268
+ d.run
1269
+ end
1270
+ verify_log_entries(1, expected_params)
1271
+ end
1272
+ end
1273
+ end
1274
+
1275
+ # Test GKE container logs. These logs have the label
1276
+ # "logging.googleapis.com/local_resource_id" set in the format of
1277
+ # "gke_containerName.<namespace_id>.<pod_name>.<container_name>".
1278
+ def test_gke_container_logs
1279
+ [1, 2, 3, 5, 11, 50].each do |n|
1280
+ new_stub_context do
1281
+ setup_gce_metadata_stubs
1282
+ setup_container_metadata_stubs
1283
+ setup_metadata_agent_stubs
1284
+ setup_logging_stubs do
1285
+ d = create_driver(ENABLE_METADATA_AGENT_CONFIG)
1286
+ n.times do |i|
1287
+ d.emit(gke_container_log_entry(log_entry(i)))
1288
+ end
1289
+ d.run
1290
+ end
1291
+ verify_log_entries(n, CONTAINER_FROM_APPLICATION_PARAMS)
1292
+ assert_requested_metadata_agent_stub(IMPLICIT_LOCAL_RESOURCE_ID)
1293
+ assert_requested_metadata_agent_stub(
1294
+ "gke_containerName.#{CONTAINER_NAMESPACE_ID}.#{CONTAINER_POD_NAME}." \
1295
+ "#{CONTAINER_CONTAINER_NAME}")
1296
+ end
1297
+ end
1298
+ end
1299
+
1109
1300
  private
1110
1301
 
1111
1302
  def stub_metadata_request(metadata_path, response_body)
@@ -1221,6 +1412,33 @@ module BaseTest
1221
1412
  Prometheus::Client.registry.instance_variable_set('@metrics', {})
1222
1413
  end
1223
1414
 
1415
+ # Metadata Agent.
1416
+
1417
+ def metadata_request_url(local_resource_id)
1418
+ "#{DEFAULT_METADATA_AGENT_URL}/monitoredResource/#{local_resource_id}"
1419
+ end
1420
+
1421
+ # Provide a stub context that initializes @logs_sent, executes the block and
1422
+ # resets WebMock at the end.
1423
+ def new_stub_context
1424
+ @logs_sent = []
1425
+ yield
1426
+ WebMock.reset!
1427
+ end
1428
+
1429
+ def setup_metadata_agent_stubs
1430
+ MONITORED_RESOURCE_STUBS.each do |local_resource_id, resource|
1431
+ stub_request(:get, metadata_request_url(local_resource_id))
1432
+ .to_return(status: 200, body: resource)
1433
+ end
1434
+ end
1435
+
1436
+ def assert_requested_metadata_agent_stub(local_resource_id)
1437
+ assert_requested :get, metadata_request_url(local_resource_id)
1438
+ end
1439
+
1440
+ # GKE Container.
1441
+
1224
1442
  def container_tag_with_container_name(container_name)
1225
1443
  "kubernetes.#{CONTAINER_POD_NAME}_#{CONTAINER_NAMESPACE_NAME}_" \
1226
1444
  "#{container_name}"
@@ -1253,6 +1471,40 @@ module BaseTest
1253
1471
  }
1254
1472
  end
1255
1473
 
1474
+ def gke_container_log_entry(log)
1475
+ {
1476
+ log: log,
1477
+ LOCAL_RESOURCE_ID_KEY =>
1478
+ "gke_containerName.#{CONTAINER_NAMESPACE_ID}" \
1479
+ ".#{CONTAINER_POD_NAME}.#{CONTAINER_CONTAINER_NAME}"
1480
+ }
1481
+ end
1482
+
1483
+ # Docker Container.
1484
+
1485
+ def docker_container_stdout_stderr_log_entry(
1486
+ log, stream = DOCKER_CONTAINER_STREAM_STDOUT)
1487
+ severity = if stream == DOCKER_CONTAINER_STREAM_STDOUT
1488
+ 'INFO'
1489
+ else
1490
+ 'ERROR'
1491
+ end
1492
+ {
1493
+ log: log,
1494
+ source: stream,
1495
+ severity: severity,
1496
+ LOCAL_RESOURCE_ID_KEY => "container.#{DOCKER_CONTAINER_ID}"
1497
+ }
1498
+ end
1499
+
1500
+ def docker_container_application_log_entry(log)
1501
+ {
1502
+ log: log,
1503
+ time: DOCKER_CONTAINER_TIMESTAMP,
1504
+ LOCAL_RESOURCE_ID_KEY => "containerName.#{DOCKER_CONTAINER_NAME}"
1505
+ }
1506
+ end
1507
+
1256
1508
  def cloudfunctions_log_entry(i)
1257
1509
  {
1258
1510
  stream: 'stdout',
@@ -14,7 +14,9 @@
14
14
 
15
15
  # Constants used by unit tests for Google Cloud Logging plugin.
16
16
  module Constants
17
- include Fluent::GoogleCloudOutput::Constants
17
+ include Fluent::GoogleCloudOutput::ServiceConstants
18
+ include Fluent::GoogleCloudOutput::ConfigConstants
19
+ include Fluent::GoogleCloudOutput::InternalConstants
18
20
 
19
21
  # Generic attributes.
20
22
  HOSTNAME = Socket.gethostname
@@ -26,6 +28,10 @@ module Constants
26
28
  FULLY_QUALIFIED_ZONE = 'projects/' + PROJECT_ID + '/zones/' + ZONE
27
29
  VM_ID = '9876543210'
28
30
 
31
+ # Attributes used for the Metadata Agent resources.
32
+ METADATA_ZONE = 'us-central1-c'
33
+ METADATA_VM_ID = '0123456789'
34
+
29
35
  # Attributes used for custom (overridden) configs.
30
36
  CUSTOM_PROJECT_ID = 'test-custom-project-id'
31
37
  CUSTOM_ZONE = 'us-custom-central1-b'
@@ -51,6 +57,16 @@ module Constants
51
57
  MANAGED_VM_BACKEND_NAME = 'default'
52
58
  MANAGED_VM_BACKEND_VERSION = 'guestbook2.0'
53
59
 
60
+ # Docker Container labels.
61
+ DOCKER_CONTAINER_ID = '0d0f03ff8d3c42688692536d1af77a28cd135c0a5c531f25a31'
62
+ DOCKER_CONTAINER_NAME = 'happy_hippo'
63
+ DOCKER_CONTAINER_STREAM_STDOUT = 'stdout'
64
+ DOCKER_CONTAINER_STREAM_STDERR = 'stderr'
65
+ # Timestamp for 1234567890 seconds and 987654321 nanoseconds since epoch.
66
+ DOCKER_CONTAINER_TIMESTAMP = '2009-02-13T23:31:30.987654321Z'
67
+ DOCKER_CONTAINER_SECONDS_EPOCH = 1_234_567_890
68
+ DOCKER_CONTAINER_NANOS = 987_654_321
69
+
54
70
  # Container Engine / Kubernetes specific labels.
55
71
  CONTAINER_CLUSTER_NAME = 'cluster-1'
56
72
  CONTAINER_NAMESPACE_ID = '898268c8-4a36-11e5-9d81-42010af0194c'
@@ -149,6 +165,20 @@ module Constants
149
165
  monitoring_type prometheus
150
166
  )
151
167
 
168
+ ENABLE_METADATA_AGENT_CONFIG = %(
169
+ enable_metadata_agent true
170
+ )
171
+
172
+ DISABLE_METADATA_AGENT_CONFIG = %(
173
+ enable_metadata_agent false
174
+ )
175
+
176
+ DOCKER_CONTAINER_CONFIG = %(
177
+ enable_metadata_agent true
178
+ label_map { "source": "#{DOCKER_CONSTANTS[:service]}/stream" }
179
+ detect_json true
180
+ )
181
+
152
182
  CUSTOM_METADATA_CONFIG = %(
153
183
  project_id #{CUSTOM_PROJECT_ID}
154
184
  zone #{CUSTOM_ZONE}
@@ -205,6 +235,8 @@ module Constants
205
235
  )
206
236
 
207
237
  # Service configurations for various services.
238
+
239
+ # GCE.
208
240
  COMPUTE_PARAMS = {
209
241
  resource: {
210
242
  type: COMPUTE_CONSTANTS[:resource_type],
@@ -219,7 +251,16 @@ module Constants
219
251
  "#{COMPUTE_CONSTANTS[:service]}/resource_name" => HOSTNAME
220
252
  }
221
253
  }
254
+ COMPUTE_PARAMS_WITH_METADATA_VM_ID_AND_ZONE = COMPUTE_PARAMS.merge(
255
+ resource: COMPUTE_PARAMS[:resource].merge(
256
+ labels: {
257
+ 'instance_id' => METADATA_VM_ID,
258
+ 'zone' => METADATA_ZONE
259
+ }
260
+ )
261
+ )
222
262
 
263
+ # GAE.
223
264
  VMENGINE_PARAMS = {
224
265
  resource: {
225
266
  type: APPENGINE_CONSTANTS[:resource_type],
@@ -237,12 +278,13 @@ module Constants
237
278
  }
238
279
  }
239
280
 
281
+ # GKE Container.
240
282
  CONTAINER_TAG = "kubernetes.#{CONTAINER_POD_NAME}_" \
241
283
  "#{CONTAINER_NAMESPACE_NAME}_#{CONTAINER_CONTAINER_NAME}"
242
284
 
243
285
  CONTAINER_FROM_METADATA_PARAMS = {
244
286
  resource: {
245
- type: CONTAINER_CONSTANTS[:resource_type],
287
+ type: GKE_CONSTANTS[:resource_type],
246
288
  labels: {
247
289
  'cluster_name' => CONTAINER_CLUSTER_NAME,
248
290
  'namespace_id' => CONTAINER_NAMESPACE_ID,
@@ -255,10 +297,10 @@ module Constants
255
297
  log_name: CONTAINER_CONTAINER_NAME,
256
298
  project_id: PROJECT_ID,
257
299
  labels: {
258
- "#{CONTAINER_CONSTANTS[:service]}/namespace_name" =>
300
+ "#{GKE_CONSTANTS[:service]}/namespace_name" =>
259
301
  CONTAINER_NAMESPACE_NAME,
260
- "#{CONTAINER_CONSTANTS[:service]}/pod_name" => CONTAINER_POD_NAME,
261
- "#{CONTAINER_CONSTANTS[:service]}/stream" => CONTAINER_STREAM,
302
+ "#{GKE_CONSTANTS[:service]}/pod_name" => CONTAINER_POD_NAME,
303
+ "#{GKE_CONSTANTS[:service]}/stream" => CONTAINER_STREAM,
262
304
  "label/#{CONTAINER_LABEL_KEY}" => CONTAINER_LABEL_VALUE,
263
305
  "#{COMPUTE_CONSTANTS[:service]}/resource_name" => HOSTNAME
264
306
  }
@@ -268,7 +310,7 @@ module Constants
268
310
  # namespace and pod names.
269
311
  CONTAINER_FROM_TAG_PARAMS = {
270
312
  resource: {
271
- type: CONTAINER_CONSTANTS[:resource_type],
313
+ type: GKE_CONSTANTS[:resource_type],
272
314
  labels: {
273
315
  'cluster_name' => CONTAINER_CLUSTER_NAME,
274
316
  'namespace_id' => CONTAINER_NAMESPACE_NAME,
@@ -281,14 +323,56 @@ module Constants
281
323
  log_name: CONTAINER_CONTAINER_NAME,
282
324
  project_id: PROJECT_ID,
283
325
  labels: {
284
- "#{CONTAINER_CONSTANTS[:service]}/namespace_name" =>
326
+ "#{GKE_CONSTANTS[:service]}/namespace_name" =>
285
327
  CONTAINER_NAMESPACE_NAME,
286
- "#{CONTAINER_CONSTANTS[:service]}/pod_name" => CONTAINER_POD_NAME,
287
- "#{CONTAINER_CONSTANTS[:service]}/stream" => CONTAINER_STREAM,
328
+ "#{GKE_CONSTANTS[:service]}/pod_name" => CONTAINER_POD_NAME,
329
+ "#{GKE_CONSTANTS[:service]}/stream" => CONTAINER_STREAM,
288
330
  "#{COMPUTE_CONSTANTS[:service]}/resource_name" => HOSTNAME
289
331
  }
290
332
  }
291
333
 
334
+ CONTAINER_FROM_APPLICATION_PARAMS = {
335
+ resource: {
336
+ type: GKE_CONSTANTS[:resource_type],
337
+ labels: {
338
+ 'cluster_name' => CONTAINER_CLUSTER_NAME,
339
+ 'namespace_id' => CONTAINER_NAMESPACE_ID,
340
+ 'instance_id' => VM_ID,
341
+ 'pod_id' => CONTAINER_POD_ID,
342
+ 'container_name' => CONTAINER_CONTAINER_NAME,
343
+ 'zone' => ZONE
344
+ }
345
+ },
346
+ log_name: 'redis',
347
+ project_id: PROJECT_ID,
348
+ labels: {
349
+ "#{COMPUTE_CONSTANTS[:service]}/resource_name" => HOSTNAME
350
+ }
351
+ }
352
+
353
+ # Docker Container.
354
+ DOCKER_CONTAINER_PARAMS = {
355
+ resource: {
356
+ type: DOCKER_CONSTANTS[:resource_type],
357
+ labels: {
358
+ 'container_id' => DOCKER_CONTAINER_ID,
359
+ 'location' => ZONE
360
+ }
361
+ },
362
+ log_name: 'test',
363
+ project_id: PROJECT_ID,
364
+ labels: {
365
+ "#{DOCKER_CONSTANTS[:service]}/stream" => DOCKER_CONTAINER_STREAM_STDOUT
366
+ }
367
+ }
368
+ DOCKER_CONTAINER_PARAMS_STREAM_STDERR = DOCKER_CONTAINER_PARAMS.merge(
369
+ labels: DOCKER_CONTAINER_PARAMS[:labels].merge(
370
+ "#{DOCKER_CONSTANTS[:service]}/stream" => DOCKER_CONTAINER_STREAM_STDERR
371
+ )
372
+ )
373
+ DOCKER_CONTAINER_PARAMS_NO_STREAM = DOCKER_CONTAINER_PARAMS.merge(labels: {})
374
+
375
+ # Cloud Functions.
292
376
  CLOUDFUNCTIONS_TAG = "kubernetes.#{CLOUDFUNCTIONS_POD_NAME}_" \
293
377
  "#{CLOUDFUNCTIONS_NAMESPACE_NAME}_" \
294
378
  "#{CLOUDFUNCTIONS_CONTAINER_NAME}"
@@ -305,8 +389,8 @@ module Constants
305
389
  project_id: PROJECT_ID,
306
390
  labels: {
307
391
  'execution_id' => CLOUDFUNCTIONS_EXECUTION_ID,
308
- "#{CONTAINER_CONSTANTS[:service]}/instance_id" => VM_ID,
309
- "#{CONTAINER_CONSTANTS[:service]}/cluster_name" =>
392
+ "#{GKE_CONSTANTS[:service]}/instance_id" => VM_ID,
393
+ "#{GKE_CONSTANTS[:service]}/cluster_name" =>
310
394
  CLOUDFUNCTIONS_CLUSTER_NAME,
311
395
  "#{COMPUTE_CONSTANTS[:service]}/resource_id" => VM_ID,
312
396
  "#{COMPUTE_CONSTANTS[:service]}/resource_name" => HOSTNAME,
@@ -325,8 +409,8 @@ module Constants
325
409
  log_name: 'cloud-functions',
326
410
  project_id: PROJECT_ID,
327
411
  labels: {
328
- "#{CONTAINER_CONSTANTS[:service]}/instance_id" => VM_ID,
329
- "#{CONTAINER_CONSTANTS[:service]}/cluster_name" =>
412
+ "#{GKE_CONSTANTS[:service]}/instance_id" => VM_ID,
413
+ "#{GKE_CONSTANTS[:service]}/cluster_name" =>
330
414
  CLOUDFUNCTIONS_CLUSTER_NAME,
331
415
  "#{COMPUTE_CONSTANTS[:service]}/resource_id" => VM_ID,
332
416
  "#{COMPUTE_CONSTANTS[:service]}/resource_name" => HOSTNAME,
@@ -334,6 +418,7 @@ module Constants
334
418
  }
335
419
  }
336
420
 
421
+ # Cloud Dataflow.
337
422
  DATAFLOW_PARAMS = {
338
423
  resource: {
339
424
  type: DATAFLOW_CONSTANTS[:resource_type],
@@ -353,6 +438,7 @@ module Constants
353
438
  }
354
439
  }
355
440
 
441
+ # Cloud Dataproc.
356
442
  DATAPROC_PARAMS = {
357
443
  resource: {
358
444
  type: DATAPROC_CONSTANTS[:resource_type],
@@ -371,6 +457,7 @@ module Constants
371
457
  }
372
458
  }
373
459
 
460
+ # Cloud ML.
374
461
  ML_PARAMS = {
375
462
  resource: {
376
463
  type: ML_CONSTANTS[:resource_type],
@@ -481,4 +568,50 @@ module Constants
481
568
  '' => '_'
482
569
  }
483
570
  ALL_TAGS = VALID_TAGS.merge(INVALID_TAGS)
571
+
572
+ # Stub value for Monitored resources from Metadata Agent.
573
+ # Map from the local_resource_id to the retrieved monitored resource.
574
+ MONITORED_RESOURCE_STUBS = {
575
+ # Implicit GCE instance.
576
+ IMPLICIT_LOCAL_RESOURCE_ID =>
577
+ {
578
+ 'type' => COMPUTE_CONSTANTS[:resource_type],
579
+ 'labels' => {
580
+ 'zone' => METADATA_ZONE,
581
+ 'instance_id' => METADATA_VM_ID
582
+ }
583
+ }.to_json,
584
+ # Docker container stderr / stdout logs.
585
+ "container.#{DOCKER_CONTAINER_ID}" =>
586
+ {
587
+ 'type' => DOCKER_CONSTANTS[:resource_type],
588
+ 'labels' => {
589
+ 'location' => ZONE,
590
+ 'container_id' => DOCKER_CONTAINER_ID
591
+ }
592
+ }.to_json,
593
+ # Docker container application logs.
594
+ "containerName.#{DOCKER_CONTAINER_NAME}" =>
595
+ {
596
+ 'type' => DOCKER_CONSTANTS[:resource_type],
597
+ 'labels' => {
598
+ 'location' => ZONE,
599
+ 'container_id' => DOCKER_CONTAINER_ID
600
+ }
601
+ }.to_json,
602
+ # GKE container logs.
603
+ "gke_containerName.#{CONTAINER_NAMESPACE_ID}.#{CONTAINER_POD_NAME}." \
604
+ "#{CONTAINER_CONTAINER_NAME}" =>
605
+ {
606
+ 'type' => GKE_CONSTANTS[:resource_type],
607
+ 'labels' => {
608
+ 'cluster_name' => CONTAINER_CLUSTER_NAME,
609
+ 'container_name' => CONTAINER_CONTAINER_NAME,
610
+ 'instance_id' => VM_ID,
611
+ 'namespace_id' => CONTAINER_NAMESPACE_ID,
612
+ 'pod_id' => CONTAINER_POD_ID,
613
+ 'zone' => ZONE
614
+ }
615
+ }.to_json
616
+ }
484
617
  end