fluent-plugin-google-cloud 0.6.18.pre.1 → 0.6.18.pre.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/fluent-plugin-google-cloud.gemspec +1 -1
- data/lib/fluent/plugin/out_google_cloud.rb +55 -94
- data/test/plugin/base_test.rb +42 -37
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 22363c75dc8601301e8ce3e6a759b7f83eb02c45
|
4
|
+
data.tar.gz: db92ec8ea70313b48bbf654aea9a5cc88998b8f2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: faca80ef319660243f9ffb4607e19a60b1400f12eb4efce959b80de5e77e8c519530403869fc1725f9cd53afb54fe230739f57d02f2bcf950d7f83855c642084
|
7
|
+
data.tar.gz: 77e7f853e24625b14eb18a55a7459d35a2135873b200d58ae537beefef937bb352552d76adbdc21ae92a8dd9a0e18f3cccb6d2a52b0a60d5a14d5d9d5ae3996f
|
data/Gemfile.lock
CHANGED
@@ -10,7 +10,7 @@ eos
|
|
10
10
|
gem.homepage =
|
11
11
|
'https://github.com/GoogleCloudPlatform/fluent-plugin-google-cloud'
|
12
12
|
gem.license = 'Apache-2.0'
|
13
|
-
gem.version = '0.6.18.pre.
|
13
|
+
gem.version = '0.6.18.pre.2'
|
14
14
|
gem.authors = ['Todd Derr', 'Alex Robinson']
|
15
15
|
gem.email = ['salty@google.com']
|
16
16
|
gem.required_ruby_version = Gem::Requirement.new('>= 2.0')
|
@@ -226,7 +226,7 @@ module Fluent
|
|
226
226
|
Fluent::Plugin.register_output('google_cloud', self)
|
227
227
|
|
228
228
|
PLUGIN_NAME = 'Fluentd Google Cloud Logging plugin'.freeze
|
229
|
-
PLUGIN_VERSION = '0.6.18.pre.
|
229
|
+
PLUGIN_VERSION = '0.6.18.pre.2'.freeze
|
230
230
|
|
231
231
|
# Name of the the Google cloud logging write scope.
|
232
232
|
LOGGING_SCOPE = 'https://www.googleapis.com/auth/logging.write'.freeze
|
@@ -980,16 +980,6 @@ module Fluent
|
|
980
980
|
|
981
981
|
@compiled_http_latency_regexp =
|
982
982
|
/^\s*(?<seconds>\d+)(?<decimal>\.\d+)?\s*s\s*$/
|
983
|
-
|
984
|
-
# TODO(qingling128): Temporary fallback for metadata agent restarts.
|
985
|
-
@compiled_k8s_container_local_resource_id_regexp = /^
|
986
|
-
(?<resource_type>k8s_container)
|
987
|
-
\.(?<namespace_name>[0-9a-z-]+)
|
988
|
-
\.(?<pod_name>[0-9a-z-.]+)
|
989
|
-
\.(?<container_name>[0-9a-z-]+)$/x
|
990
|
-
@compiled_k8s_node_local_resource_id_regexp = /^
|
991
|
-
(?<resource_type>k8s_node)
|
992
|
-
\.(?<node_name>[0-9a-z-]+)$/x
|
993
983
|
end
|
994
984
|
|
995
985
|
# Set required variables like @project_id, @vm_id, @vm_name and @zone.
|
@@ -1257,10 +1247,8 @@ module Fluent
|
|
1257
1247
|
else
|
1258
1248
|
# TODO(qingling128): This entire else clause is temporary before we
|
1259
1249
|
# implement buffering and caching.
|
1260
|
-
@log.warn('
|
1261
|
-
" Agent with local_resource_id #{local_resource_id}."
|
1262
|
-
' Trying to construct resource locally if it is a k8s' \
|
1263
|
-
' resource.')
|
1250
|
+
@log.warn('Failed to retrieve monitored resource from Metadata' \
|
1251
|
+
" Agent with local_resource_id #{local_resource_id}.")
|
1264
1252
|
constructed_k8s_resource = construct_k8s_resource_locally(
|
1265
1253
|
local_resource_id)
|
1266
1254
|
resource = constructed_k8s_resource if constructed_k8s_resource
|
@@ -1314,12 +1302,15 @@ module Fluent
|
|
1314
1302
|
# Docker container.
|
1315
1303
|
# TODO(qingling128): Remove this logic once the resource is retrieved at a
|
1316
1304
|
# proper time (b/65175256).
|
1317
|
-
when DOCKER_CONSTANTS[:resource_type]
|
1318
|
-
|
1319
|
-
K8S_CONTAINER_CONSTANTS[:resource_type],
|
1320
|
-
K8S_NODE_CONSTANTS[:resource_type]
|
1305
|
+
when DOCKER_CONSTANTS[:resource_type]
|
1306
|
+
common_labels.delete("#{COMPUTE_CONSTANTS[:service]}/resource_name")
|
1321
1307
|
|
1308
|
+
# TODO(qingling128): Temporary fallback for metadata agent restarts.
|
1309
|
+
# K8s resources.
|
1310
|
+
when K8S_CONTAINER_CONSTANTS[:resource_type],
|
1311
|
+
K8S_NODE_CONSTANTS[:resource_type]
|
1322
1312
|
common_labels.delete("#{COMPUTE_CONSTANTS[:service]}/resource_name")
|
1313
|
+
|
1323
1314
|
end
|
1324
1315
|
|
1325
1316
|
# Cloud Dataflow and Cloud ML.
|
@@ -2177,85 +2168,55 @@ module Fluent
|
|
2177
2168
|
|
2178
2169
|
# Construct monitored resource locally for k8s resources.
|
2179
2170
|
def construct_k8s_resource_locally(local_resource_id)
|
2180
|
-
|
2181
|
-
|
2182
|
-
|
2183
|
-
|
2184
|
-
|
2185
|
-
|
2186
|
-
|
2187
|
-
|
2188
|
-
|
2189
|
-
when 'k8s_container'
|
2190
|
-
@log.debug('Detected local_resource_id in k8s_container format.' \
|
2191
|
-
"Constructing resource locally with #{local_resource_id}.")
|
2192
|
-
return construct_k8s_container_resource(matched_regexp_group)
|
2193
|
-
when 'k8s_node'
|
2194
|
-
@log.debug('Detected local_resource_id in k8s_node format.' \
|
2195
|
-
"Constructing resource locally with #{local_resource_id}.")
|
2196
|
-
return construct_k8s_node_resource(matched_regexp_group)
|
2197
|
-
end
|
2198
|
-
end
|
2171
|
+
return unless
|
2172
|
+
/^
|
2173
|
+
(?<resource_type>k8s_container)
|
2174
|
+
\.(?<namespace_name>[0-9a-z-]+)
|
2175
|
+
\.(?<pod_name>[.0-9a-z-]+)
|
2176
|
+
\.(?<container_name>[0-9a-z-]+)$/x =~ local_resource_id ||
|
2177
|
+
/^
|
2178
|
+
(?<resource_type>k8s_node)
|
2179
|
+
\.(?<node_name>[0-9a-z-]+)$/x =~ local_resource_id
|
2199
2180
|
|
2200
|
-
|
2201
|
-
|
2202
|
-
|
2203
|
-
|
2204
|
-
|
2205
|
-
|
2206
|
-
|
2207
|
-
|
2208
|
-
|
2209
|
-
|
2210
|
-
|
2181
|
+
begin
|
2182
|
+
@k8s_cluster_name ||= fetch_gce_metadata(
|
2183
|
+
'instance/attributes/cluster-name')
|
2184
|
+
@k8s_location ||= fetch_gce_metadata(
|
2185
|
+
'instance/attributes/cluster-location')
|
2186
|
+
rescue StandardError => e
|
2187
|
+
@log.error 'Failed to retrieve k8s cluster name and location.', \
|
2188
|
+
error: e
|
2189
|
+
end
|
2190
|
+
case resource_type
|
2191
|
+
when K8S_CONTAINER_CONSTANTS[:resource_type]
|
2192
|
+
labels = {
|
2193
|
+
'namespace_name' => namespace_name,
|
2194
|
+
'pod_name' => pod_name,
|
2195
|
+
'container_name' => container_name,
|
2196
|
+
'cluster_name' => @k8s_cluster_name,
|
2197
|
+
'location' => @k8s_location
|
2211
2198
|
}
|
2212
|
-
|
2213
|
-
|
2214
|
-
|
2215
|
-
|
2216
|
-
|
2217
|
-
|
2218
|
-
' Falling back to writing logs against instance resource.',
|
2219
|
-
error: e
|
2220
|
-
# Fall back to legacy gke resource or default instance resource.
|
2221
|
-
return
|
2222
|
-
end
|
2223
|
-
|
2224
|
-
# Construct the k8s_node monitored resource locally. In case of any
|
2225
|
-
# exception, return nil.
|
2226
|
-
def construct_k8s_node_resource(matched_regexp_group)
|
2227
|
-
constructed_resource = Google::Apis::LoggingV2::MonitoredResource.new(
|
2228
|
-
type: 'k8s_node',
|
2229
|
-
labels: {
|
2230
|
-
'node_name' => matched_regexp_group['node_name'],
|
2231
|
-
'cluster_name' => retrieve_k8s_cluster_name,
|
2232
|
-
'location' => retrieve_k8s_location
|
2199
|
+
fallback_resource = GKE_CONSTANTS[:resource_type]
|
2200
|
+
when K8S_NODE_CONSTANTS[:resource_type]
|
2201
|
+
labels = {
|
2202
|
+
'node_name' => node_name,
|
2203
|
+
'cluster_name' => @k8s_cluster_name,
|
2204
|
+
'location' => @k8s_location
|
2233
2205
|
}
|
2234
|
-
|
2235
|
-
|
2236
|
-
|
2206
|
+
fallback_resource = COMPUTE_CONSTANTS[:resource_type]
|
2207
|
+
end
|
2208
|
+
unless @k8s_cluster_name && @k8s_location
|
2209
|
+
@log.error "Failed to construct #{resource_type} resource locally." \
|
2210
|
+
' Falling back to writing logs against' \
|
2211
|
+
" #{fallback_resource} resource.", error: e
|
2212
|
+
return
|
2213
|
+
end
|
2214
|
+
constructed_resource = Google::Apis::LoggingV2::MonitoredResource.new(
|
2215
|
+
type: resource_type,
|
2216
|
+
labels: labels)
|
2217
|
+
@log.debug("Constructed #{resource_type} resource locally:\n" \
|
2218
|
+
"#{constructed_resource.inspect}")
|
2237
2219
|
constructed_resource
|
2238
|
-
rescue StandardError => e
|
2239
|
-
@log.error 'Failed to construct "k8s_node" resource locally. Falling' \
|
2240
|
-
' back to writing logs against instance resource.', error: e
|
2241
|
-
# Fall back to default instance resource.
|
2242
|
-
return
|
2243
|
-
end
|
2244
|
-
|
2245
|
-
# Only retrieve cluster name once since it's not changing for this
|
2246
|
-
# agent instance's life time.
|
2247
|
-
# Throw an error if failed to retrieve the cluster name.
|
2248
|
-
def retrieve_k8s_cluster_name
|
2249
|
-
@k8s_cluster_name ||= fetch_gce_metadata(
|
2250
|
-
'instance/attributes/cluster-name')
|
2251
|
-
end
|
2252
|
-
|
2253
|
-
# Only retrieve location once since it is the location of K8s Master which
|
2254
|
-
# is not changing for this agent instance's life time.
|
2255
|
-
# Throw an error if neither endpoint is available.
|
2256
|
-
def retrieve_k8s_location
|
2257
|
-
@k8s_location ||= fetch_gce_metadata(
|
2258
|
-
'instance/attributes/cluster-location')
|
2259
2220
|
end
|
2260
2221
|
|
2261
2222
|
def ensure_array(value)
|
data/test/plugin/base_test.rb
CHANGED
@@ -1311,113 +1311,115 @@ module BaseTest
|
|
1311
1311
|
# When enable_metadata_agent is false.
|
1312
1312
|
{
|
1313
1313
|
enable_metadata_agent: false,
|
1314
|
-
|
1315
|
-
|
1314
|
+
setup_metadata_agent_stub: false,
|
1315
|
+
setup_k8s_stub: false,
|
1316
1316
|
log_entry: k8s_container_log_entry(log_entry(0)),
|
1317
1317
|
expected_params: COMPUTE_PARAMS
|
1318
1318
|
},
|
1319
1319
|
{
|
1320
1320
|
enable_metadata_agent: false,
|
1321
|
-
|
1322
|
-
|
1321
|
+
setup_metadata_agent_stub: true,
|
1322
|
+
setup_k8s_stub: false,
|
1323
1323
|
log_entry: k8s_container_log_entry(log_entry(0)),
|
1324
1324
|
expected_params: COMPUTE_PARAMS
|
1325
1325
|
},
|
1326
1326
|
{
|
1327
1327
|
enable_metadata_agent: false,
|
1328
|
-
|
1329
|
-
|
1328
|
+
setup_metadata_agent_stub: true,
|
1329
|
+
setup_k8s_stub: true,
|
1330
1330
|
log_entry: k8s_container_log_entry(log_entry(0)),
|
1331
1331
|
expected_params: COMPUTE_PARAMS
|
1332
1332
|
},
|
1333
1333
|
{
|
1334
1334
|
enable_metadata_agent: false,
|
1335
|
-
|
1336
|
-
|
1335
|
+
setup_metadata_agent_stub: false,
|
1336
|
+
setup_k8s_stub: true,
|
1337
1337
|
log_entry: k8s_container_log_entry(log_entry(0)),
|
1338
1338
|
expected_params: COMPUTE_PARAMS
|
1339
1339
|
},
|
1340
1340
|
# When enable_metadata_agent is true.
|
1341
1341
|
{
|
1342
1342
|
enable_metadata_agent: true,
|
1343
|
-
|
1344
|
-
|
1343
|
+
setup_metadata_agent_stub: false,
|
1344
|
+
setup_k8s_stub: false,
|
1345
1345
|
log_entry: k8s_container_log_entry(log_entry(0)),
|
1346
1346
|
expected_params: COMPUTE_PARAMS
|
1347
1347
|
},
|
1348
1348
|
{
|
1349
1349
|
enable_metadata_agent: true,
|
1350
|
-
|
1351
|
-
|
1350
|
+
setup_metadata_agent_stub: false,
|
1351
|
+
setup_k8s_stub: true,
|
1352
1352
|
log_entry: k8s_container_log_entry(log_entry(0)),
|
1353
1353
|
expected_params: K8S_CONTAINER_PARAMS_FROM_LOCAL
|
1354
1354
|
},
|
1355
1355
|
{
|
1356
1356
|
enable_metadata_agent: true,
|
1357
|
-
|
1358
|
-
|
1357
|
+
setup_metadata_agent_stub: true,
|
1358
|
+
setup_k8s_stub: false,
|
1359
1359
|
log_entry: k8s_container_log_entry(log_entry(0)),
|
1360
1360
|
expected_params: K8S_CONTAINER_PARAMS
|
1361
1361
|
},
|
1362
1362
|
{
|
1363
1363
|
enable_metadata_agent: true,
|
1364
|
-
|
1365
|
-
|
1364
|
+
setup_metadata_agent_stub: true,
|
1365
|
+
setup_k8s_stub: true,
|
1366
1366
|
log_entry: k8s_container_log_entry(log_entry(0)),
|
1367
1367
|
expected_params: K8S_CONTAINER_PARAMS
|
1368
1368
|
},
|
1369
1369
|
# When local_resource_id is not present or does not match k8s regexes.
|
1370
1370
|
{
|
1371
1371
|
enable_metadata_agent: true,
|
1372
|
-
|
1373
|
-
|
1372
|
+
setup_metadata_agent_stub: true,
|
1373
|
+
setup_k8s_stub: true,
|
1374
1374
|
log_entry: k8s_container_log_entry(
|
1375
1375
|
log_entry(0)).reject { |k, _| k == LOCAL_RESOURCE_ID_KEY },
|
1376
1376
|
expected_params: COMPUTE_PARAMS
|
1377
1377
|
},
|
1378
1378
|
{
|
1379
1379
|
enable_metadata_agent: true,
|
1380
|
-
|
1381
|
-
|
1380
|
+
setup_metadata_agent_stub: true,
|
1381
|
+
setup_k8s_stub: true,
|
1382
1382
|
log_entry: k8s_container_log_entry(
|
1383
1383
|
log_entry(0),
|
1384
1384
|
local_resource_id: RANDOM_LOCAL_RESOURCE_ID),
|
1385
|
+
# When 'kube-env' is present, "compute.googleapis.com/resource_name" is
|
1386
|
+
# not added.
|
1385
1387
|
expected_params: COMPUTE_PARAMS
|
1386
1388
|
},
|
1387
1389
|
# Specific cases for k8s_node.
|
1388
1390
|
{
|
1389
1391
|
enable_metadata_agent: false,
|
1390
|
-
|
1391
|
-
|
1392
|
+
setup_metadata_agent_stub: true,
|
1393
|
+
setup_k8s_stub: true,
|
1392
1394
|
log_entry: k8s_node_log_entry(log_entry(0)),
|
1393
1395
|
expected_params: COMPUTE_PARAMS
|
1394
1396
|
},
|
1395
1397
|
{
|
1396
1398
|
enable_metadata_agent: true,
|
1397
|
-
|
1398
|
-
|
1399
|
+
setup_metadata_agent_stub: true,
|
1400
|
+
setup_k8s_stub: true,
|
1399
1401
|
log_entry: k8s_node_log_entry(log_entry(0)),
|
1400
1402
|
expected_params: K8S_NODE_PARAMS
|
1401
1403
|
},
|
1402
1404
|
{
|
1403
1405
|
enable_metadata_agent: true,
|
1404
|
-
|
1405
|
-
|
1406
|
+
setup_metadata_agent_stub: true,
|
1407
|
+
setup_k8s_stub: true,
|
1406
1408
|
log_entry: k8s_node_log_entry(log_entry(0)),
|
1407
1409
|
expected_params: K8S_NODE_PARAMS
|
1408
1410
|
}
|
1409
1411
|
].each do |test_params|
|
1410
1412
|
new_stub_context do
|
1411
1413
|
setup_gce_metadata_stubs
|
1412
|
-
if test_params[:
|
1414
|
+
if test_params[:setup_metadata_agent_stub]
|
1413
1415
|
setup_metadata_agent_stubs
|
1414
1416
|
else
|
1415
1417
|
setup_no_metadata_agent_stubs
|
1416
1418
|
end
|
1417
|
-
if test_params[:
|
1418
|
-
|
1419
|
+
if test_params[:setup_k8s_stub]
|
1420
|
+
setup_k8s_metadata_stubs
|
1419
1421
|
else
|
1420
|
-
|
1422
|
+
setup_no_k8s_metadata_stubs
|
1421
1423
|
end
|
1422
1424
|
setup_logging_stubs do
|
1423
1425
|
config = if test_params[:enable_metadata_agent]
|
@@ -1603,7 +1605,7 @@ module BaseTest
|
|
1603
1605
|
'KUBE_BEARER_TOKEN: AoQiMuwkNP2BMT0S')
|
1604
1606
|
end
|
1605
1607
|
|
1606
|
-
def
|
1608
|
+
def setup_k8s_metadata_stubs
|
1607
1609
|
stub_metadata_request(
|
1608
1610
|
'instance/attributes/',
|
1609
1611
|
"attribute1\ncluster-name\ncluster-location\nlast_attribute")
|
@@ -1611,12 +1613,14 @@ module BaseTest
|
|
1611
1613
|
stub_metadata_request('instance/attributes/cluster-name', K8S_CLUSTER_NAME)
|
1612
1614
|
end
|
1613
1615
|
|
1614
|
-
def
|
1615
|
-
|
1616
|
-
|
1617
|
-
|
1618
|
-
|
1619
|
-
|
1616
|
+
def setup_no_k8s_metadata_stubs
|
1617
|
+
['cluster-location', 'cluster-name'].each do |metadata_name|
|
1618
|
+
stub_request(:get, %r{.*instance/attributes/#{metadata_name}.*})
|
1619
|
+
.to_return(status: 404,
|
1620
|
+
body: 'The requested URL /computeMetadata/v1/instance/' \
|
1621
|
+
"attributes/#{metadata_name} was not found on this" \
|
1622
|
+
' server.')
|
1623
|
+
end
|
1620
1624
|
end
|
1621
1625
|
|
1622
1626
|
def setup_cloudfunctions_metadata_stubs
|
@@ -1750,6 +1754,7 @@ module BaseTest
|
|
1750
1754
|
}
|
1751
1755
|
end
|
1752
1756
|
|
1757
|
+
# TODO(qingling128): Temporary fallback for metadata agent restarts.
|
1753
1758
|
# k8s resources.
|
1754
1759
|
|
1755
1760
|
def k8s_container_log_entry(log,
|