fluent-plugin-google-cloud 0.4.5 → 0.4.6
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 +1 -4
- data/fluent-plugin-google-cloud.gemspec +1 -1
- data/lib/fluent/plugin/out_google_cloud.rb +84 -18
- data/test/plugin/test_out_google_cloud.rb +132 -9
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ef4989cf52201417aaa16cd77abc9680b55ddab7
|
4
|
+
data.tar.gz: 4c313c6fbe55b6c17c2eaec8b5c756c947135cab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f50bd833b6b65548f439a5493f802fe99b266479d077a68abc4fec52e1f04b6223967344eabed170eb1a846525a5ab16e0dbc3b60df6638eaafa1f172c1c76e1
|
7
|
+
data.tar.gz: 4744b04e0a82268535afc934cf2c3a8af71b409fe9ca45f2b4f88f6777e1e80d72e65860ac7a48288c58809120dab1715cbd46287609a4832eea4f68d0287cd8
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
fluent-plugin-google-cloud (0.4.
|
4
|
+
fluent-plugin-google-cloud (0.4.6)
|
5
5
|
fluentd (>= 0.10)
|
6
6
|
google-api-client (~> 0.8.6)
|
7
7
|
googleauth (~> 0.4)
|
@@ -121,6 +121,3 @@ DEPENDENCIES
|
|
121
121
|
rubocop (~> 0.33.0)
|
122
122
|
test-unit (~> 3.0.2)
|
123
123
|
webmock (>= 1.17.0)
|
124
|
-
|
125
|
-
BUNDLED WITH
|
126
|
-
1.10.6
|
@@ -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.4.
|
13
|
+
gem.version = '0.4.6'
|
14
14
|
gem.authors = ['Todd Derr', 'Alex Robinson']
|
15
15
|
gem.email = ['salty@google.com']
|
16
16
|
|
@@ -20,6 +20,7 @@ module Fluent
|
|
20
20
|
# Constants for service names.
|
21
21
|
APPENGINE_SERVICE = 'appengine.googleapis.com'
|
22
22
|
COMPUTE_SERVICE = 'compute.googleapis.com'
|
23
|
+
CONTAINER_SERVICE = 'container.googleapis.com'
|
23
24
|
DATAFLOW_SERVICE = 'dataflow.googleapis.com'
|
24
25
|
EC2_SERVICE = 'ec2.amazonaws.com'
|
25
26
|
|
@@ -42,7 +43,9 @@ module Fluent
|
|
42
43
|
# DEPRECATED: Parameters necessary to use the private_key auth_method.
|
43
44
|
config_param :private_key_email, :string, :default => nil
|
44
45
|
config_param :private_key_path, :string, :default => nil
|
45
|
-
config_param :private_key_passphrase, :string,
|
46
|
+
config_param :private_key_passphrase, :string,
|
47
|
+
:default => 'notasecret',
|
48
|
+
:secret => true
|
46
49
|
|
47
50
|
# Specify project/instance metadata.
|
48
51
|
#
|
@@ -103,6 +106,7 @@ module Fluent
|
|
103
106
|
require 'json'
|
104
107
|
require 'open-uri'
|
105
108
|
require 'socket'
|
109
|
+
require 'yaml'
|
106
110
|
|
107
111
|
# use the global logger
|
108
112
|
@log = $log # rubocop:disable Style/GlobalVars
|
@@ -128,8 +132,10 @@ module Fluent
|
|
128
132
|
end
|
129
133
|
end
|
130
134
|
|
131
|
-
# TODO: Send instance tags
|
135
|
+
# TODO: Send instance tags as labels as well?
|
132
136
|
@common_labels = {}
|
137
|
+
@tag_to_kubernetes_labels_regexp =
|
138
|
+
/\.(?<pod_name>[^\._]+)_(?<namespace_name>[^_]+)_(?<container_name>.+)$/
|
133
139
|
|
134
140
|
# set attributes from metadata (unless overriden by static config)
|
135
141
|
@vm_name = Socket.gethostname if @vm_name.nil?
|
@@ -200,14 +206,18 @@ module Fluent
|
|
200
206
|
@service_name = DATAFLOW_SERVICE
|
201
207
|
@dataflow_job_id = fetch_gce_metadata('instance/attributes/job_id')
|
202
208
|
common_labels["#{DATAFLOW_SERVICE}/job_id"] = @dataflow_job_id
|
209
|
+
elsif attributes.include?('kube-env')
|
210
|
+
# Kubernetes/Container Engine
|
211
|
+
@service_name = CONTAINER_SERVICE
|
212
|
+
common_labels["#{CONTAINER_SERVICE}/instance_id"] = @vm_id
|
213
|
+
@raw_kube_env = fetch_gce_metadata('instance/attributes/kube-env')
|
214
|
+
@kube_env = YAML.load(@raw_kube_env)
|
215
|
+
common_labels["#{CONTAINER_SERVICE}/cluster_name"] =
|
216
|
+
cluster_name_from_kube_env(@kube_env)
|
203
217
|
end
|
204
|
-
#
|
205
|
-
#
|
206
|
-
|
207
|
-
common_labels["#{COMPUTE_SERVICE}/resource_type"] = 'instance'
|
208
|
-
common_labels["#{COMPUTE_SERVICE}/resource_id"] = @vm_id
|
209
|
-
common_labels["#{COMPUTE_SERVICE}/resource_name"] = @vm_name
|
210
|
-
end
|
218
|
+
common_labels["#{COMPUTE_SERVICE}/resource_type"] = 'instance'
|
219
|
+
common_labels["#{COMPUTE_SERVICE}/resource_id"] = @vm_id
|
220
|
+
common_labels["#{COMPUTE_SERVICE}/resource_name"] = @vm_name
|
211
221
|
when Platform::EC2
|
212
222
|
@service_name = EC2_SERVICE
|
213
223
|
common_labels["#{EC2_SERVICE}/resource_type"] = 'instance'
|
@@ -252,6 +262,18 @@ module Fluent
|
|
252
262
|
'commonLabels' => @common_labels,
|
253
263
|
'entries' => []
|
254
264
|
}
|
265
|
+
if @service_name == CONTAINER_SERVICE
|
266
|
+
# Container logs in Kubernetes are tagged based on where they came
|
267
|
+
# from, so we can extract useful metadata from the tag.
|
268
|
+
# Do this here to avoid having to repeat it for each record.
|
269
|
+
match_data = @tag_to_kubernetes_labels_regexp.match(tag)
|
270
|
+
if match_data
|
271
|
+
labels = write_log_entries_request['commonLabels']
|
272
|
+
%w(namespace_name pod_name container_name).each do |field|
|
273
|
+
labels["#{CONTAINER_SERVICE}/#{field}"] = match_data[field]
|
274
|
+
end
|
275
|
+
end
|
276
|
+
end
|
255
277
|
arr.each do |time, record|
|
256
278
|
next unless record.is_a?(Hash)
|
257
279
|
if record.key?('timestamp') &&
|
@@ -292,7 +314,8 @@ module Fluent
|
|
292
314
|
'timestamp' => {
|
293
315
|
'seconds' => ts_secs,
|
294
316
|
'nanos' => ts_nanos
|
295
|
-
}
|
317
|
+
},
|
318
|
+
'labels' => {}
|
296
319
|
}
|
297
320
|
}
|
298
321
|
if record.key?('severity')
|
@@ -302,18 +325,20 @@ module Fluent
|
|
302
325
|
entry['metadata']['severity'] = 'DEFAULT'
|
303
326
|
end
|
304
327
|
|
328
|
+
# If the record has been annotated by the kubernetes_metadata_filter
|
329
|
+
# plugin, then use that metadata. Otherwise, rely on commonLabels
|
330
|
+
# populated at the grouped_entries level from the group's tag.
|
331
|
+
if @service_name == CONTAINER_SERVICE && record['kubernetes']
|
332
|
+
handle_container_metadata(record, entry)
|
333
|
+
end
|
334
|
+
|
305
335
|
# If a field is present in the label_map, send its value as a label
|
306
336
|
# (mapping the field name to label name as specified in the config)
|
307
337
|
# and do not send that field as part of the payload.
|
308
|
-
|
309
|
-
labels = {}
|
338
|
+
if @label_map
|
310
339
|
@label_map.each do |field, label|
|
311
|
-
|
312
|
-
# label values are required to be strings.
|
313
|
-
labels[label] = record[field].to_s
|
314
|
-
record.delete(field)
|
340
|
+
field_to_label(record, field, entry['metadata']['labels'], label)
|
315
341
|
end
|
316
|
-
entry['metadata']['labels'] = labels unless labels.empty?
|
317
342
|
end
|
318
343
|
|
319
344
|
# use textPayload if the only remainaing key is 'message',
|
@@ -323,6 +348,12 @@ module Fluent
|
|
323
348
|
else
|
324
349
|
entry['structPayload'] = record
|
325
350
|
end
|
351
|
+
|
352
|
+
# Remove the labels metadata if we didn't populate it with anything.
|
353
|
+
if entry['metadata']['labels'].empty?
|
354
|
+
entry['metadata'].delete('labels')
|
355
|
+
end
|
356
|
+
|
326
357
|
write_log_entries_request['entries'].push(entry)
|
327
358
|
end
|
328
359
|
# Don't send an empty request if we rejected all the entries.
|
@@ -441,6 +472,15 @@ module Fluent
|
|
441
472
|
end
|
442
473
|
end
|
443
474
|
|
475
|
+
def cluster_name_from_kube_env(kube_env)
|
476
|
+
return kube_env['CLUSTER_NAME'] if kube_env.key?('CLUSTER_NAME')
|
477
|
+
instance_prefix = kube_env['INSTANCE_PREFIX']
|
478
|
+
gke_name_match = /^gke-(.+)-[0-9a-f]{8}$/.match(instance_prefix)
|
479
|
+
return gke_name_match.captures[0] if gke_name_match &&
|
480
|
+
!gke_name_match.captures.empty?
|
481
|
+
instance_prefix
|
482
|
+
end
|
483
|
+
|
444
484
|
# Values permitted by the API for 'severity' (which is an enum).
|
445
485
|
VALID_SEVERITIES = Set.new(
|
446
486
|
%w(DEFAULT DEBUG INFO NOTICE WARNING ERROR CRITICAL ALERT EMERGENCY))
|
@@ -500,10 +540,36 @@ module Fluent
|
|
500
540
|
'DEFAULT'
|
501
541
|
end
|
502
542
|
|
543
|
+
# Requires that record has a 'kubernetes' field.
|
544
|
+
def handle_container_metadata(record, entry)
|
545
|
+
fields = %w(namespace_id namespace_name pod_id pod_name container_name)
|
546
|
+
fields.each do |field|
|
547
|
+
field_to_label(record['kubernetes'], field, entry['metadata']['labels'],
|
548
|
+
"#{CONTAINER_SERVICE}/#{field}")
|
549
|
+
end
|
550
|
+
# Prepend label/ to all user-defined labels' keys.
|
551
|
+
if record.key?('labels')
|
552
|
+
record['kubernetes']['labels'].each do |key, value|
|
553
|
+
entry['metadata']['labels']["label/#{key}"] = value
|
554
|
+
end
|
555
|
+
end
|
556
|
+
# We've explicitly consumed all the fields we care about -- don't litter
|
557
|
+
# the log entries with the remaining fields that the kubernetes metadata
|
558
|
+
# filter plugin includes (or an empty 'kubernetes' field).
|
559
|
+
record.delete('kubernetes')
|
560
|
+
record.delete('docker')
|
561
|
+
end
|
562
|
+
|
563
|
+
def field_to_label(record, field, labels, label)
|
564
|
+
return unless record.key?(field)
|
565
|
+
labels[label] = record[field].to_s
|
566
|
+
record.delete(field)
|
567
|
+
end
|
568
|
+
|
503
569
|
def init_api_client
|
504
570
|
@client = Google::APIClient.new(
|
505
571
|
application_name: 'Fluentd Google Cloud Logging plugin',
|
506
|
-
application_version: '0.4.
|
572
|
+
application_version: '0.4.6',
|
507
573
|
retries: 1)
|
508
574
|
|
509
575
|
if @auth_method == 'private_key'
|
@@ -60,6 +60,14 @@ class GoogleCloudOutputTest < Test::Unit::TestCase
|
|
60
60
|
MANAGED_VM_BACKEND_NAME = 'default'
|
61
61
|
MANAGED_VM_BACKEND_VERSION = 'guestbook2.0'
|
62
62
|
|
63
|
+
# Container Engine / Kubernetes specific labels
|
64
|
+
CONTAINER_CLUSTER_NAME = 'cluster-1'
|
65
|
+
CONTAINER_NAMESPACE_ID = '898268c8-4a36-11e5-9d81-42010af0194c'
|
66
|
+
CONTAINER_NAMESPACE_NAME = 'kube-system'
|
67
|
+
CONTAINER_POD_ID = 'cad3c3c4-4b9c-11e5-9d81-42010af0194c'
|
68
|
+
CONTAINER_POD_NAME = 'redis-master-c0l82'
|
69
|
+
CONTAINER_CONTAINER_NAME = 'redis'
|
70
|
+
|
63
71
|
# Parameters used for authentication
|
64
72
|
AUTH_GRANT_TYPE = 'urn:ietf:params:oauth:grant-type:jwt-bearer'
|
65
73
|
FAKE_AUTH_TOKEN = 'abc123'
|
@@ -122,6 +130,7 @@ class GoogleCloudOutputTest < Test::Unit::TestCase
|
|
122
130
|
# Service configurations for various services
|
123
131
|
COMPUTE_SERVICE_NAME = 'compute.googleapis.com'
|
124
132
|
APPENGINE_SERVICE_NAME = 'appengine.googleapis.com'
|
133
|
+
CONTAINER_SERVICE_NAME = 'container.googleapis.com'
|
125
134
|
EC2_SERVICE_NAME = 'ec2.amazonaws.com'
|
126
135
|
|
127
136
|
COMPUTE_PARAMS = {
|
@@ -150,6 +159,46 @@ class GoogleCloudOutputTest < Test::Unit::TestCase
|
|
150
159
|
}
|
151
160
|
}
|
152
161
|
|
162
|
+
CONTAINER_LOG_NAME = "kubernetes.#{CONTAINER_POD_NAME}_" \
|
163
|
+
"#{CONTAINER_NAMESPACE_NAME}_#{CONTAINER_CONTAINER_NAME}"
|
164
|
+
|
165
|
+
CONTAINER_FROM_METADATA_PARAMS = {
|
166
|
+
'service_name' => CONTAINER_SERVICE_NAME,
|
167
|
+
'log_name' => CONTAINER_LOG_NAME,
|
168
|
+
'project_id' => PROJECT_ID,
|
169
|
+
'zone' => ZONE,
|
170
|
+
'labels' => {
|
171
|
+
"#{CONTAINER_SERVICE_NAME}/instance_id" => VM_ID,
|
172
|
+
"#{CONTAINER_SERVICE_NAME}/cluster_name" => CONTAINER_CLUSTER_NAME,
|
173
|
+
"#{CONTAINER_SERVICE_NAME}/namespace_name" => CONTAINER_NAMESPACE_NAME,
|
174
|
+
"#{CONTAINER_SERVICE_NAME}/namespace_id" => CONTAINER_NAMESPACE_ID,
|
175
|
+
"#{CONTAINER_SERVICE_NAME}/pod_name" => CONTAINER_POD_NAME,
|
176
|
+
"#{CONTAINER_SERVICE_NAME}/pod_id" => CONTAINER_POD_ID,
|
177
|
+
"#{CONTAINER_SERVICE_NAME}/container_name" => CONTAINER_CONTAINER_NAME,
|
178
|
+
"#{COMPUTE_SERVICE_NAME}/resource_type" => 'instance',
|
179
|
+
"#{COMPUTE_SERVICE_NAME}/resource_id" => VM_ID,
|
180
|
+
"#{COMPUTE_SERVICE_NAME}/resource_name" => HOSTNAME
|
181
|
+
}
|
182
|
+
}
|
183
|
+
|
184
|
+
# Almost the same as from metadata, but missing namespace_id and pod_id.
|
185
|
+
CONTAINER_FROM_TAG_PARAMS = {
|
186
|
+
'service_name' => CONTAINER_SERVICE_NAME,
|
187
|
+
'log_name' => CONTAINER_LOG_NAME,
|
188
|
+
'project_id' => PROJECT_ID,
|
189
|
+
'zone' => ZONE,
|
190
|
+
'labels' => {
|
191
|
+
"#{CONTAINER_SERVICE_NAME}/instance_id" => VM_ID,
|
192
|
+
"#{CONTAINER_SERVICE_NAME}/cluster_name" => CONTAINER_CLUSTER_NAME,
|
193
|
+
"#{CONTAINER_SERVICE_NAME}/namespace_name" => CONTAINER_NAMESPACE_NAME,
|
194
|
+
"#{CONTAINER_SERVICE_NAME}/pod_name" => CONTAINER_POD_NAME,
|
195
|
+
"#{CONTAINER_SERVICE_NAME}/container_name" => CONTAINER_CONTAINER_NAME,
|
196
|
+
"#{COMPUTE_SERVICE_NAME}/resource_type" => 'instance',
|
197
|
+
"#{COMPUTE_SERVICE_NAME}/resource_id" => VM_ID,
|
198
|
+
"#{COMPUTE_SERVICE_NAME}/resource_name" => HOSTNAME
|
199
|
+
}
|
200
|
+
}
|
201
|
+
|
153
202
|
CUSTOM_PARAMS = {
|
154
203
|
'service_name' => COMPUTE_SERVICE_NAME,
|
155
204
|
'log_name' => 'test',
|
@@ -175,9 +224,9 @@ class GoogleCloudOutputTest < Test::Unit::TestCase
|
|
175
224
|
}
|
176
225
|
}
|
177
226
|
|
178
|
-
def create_driver(conf = APPLICATION_DEFAULT_CONFIG)
|
227
|
+
def create_driver(conf = APPLICATION_DEFAULT_CONFIG, tag = 'test')
|
179
228
|
Fluent::Test::BufferedOutputTestDriver.new(
|
180
|
-
Fluent::GoogleCloudOutput).configure(conf, use_v1_config: true)
|
229
|
+
Fluent::GoogleCloudOutput, tag).configure(conf, use_v1_config: true)
|
181
230
|
end
|
182
231
|
|
183
232
|
def test_configure_service_account_application_default
|
@@ -724,6 +773,58 @@ class GoogleCloudOutputTest < Test::Unit::TestCase
|
|
724
773
|
end
|
725
774
|
end
|
726
775
|
|
776
|
+
def test_one_container_log_metadata_from_plugin
|
777
|
+
setup_gce_metadata_stubs
|
778
|
+
setup_container_metadata_stubs
|
779
|
+
setup_logging_stubs
|
780
|
+
d = create_driver(APPLICATION_DEFAULT_CONFIG, CONTAINER_LOG_NAME)
|
781
|
+
d.emit(container_log_entry_with_metadata(0))
|
782
|
+
d.run
|
783
|
+
verify_log_entries(1, CONTAINER_FROM_METADATA_PARAMS)
|
784
|
+
end
|
785
|
+
|
786
|
+
def test_multiple_container_logs_metadata_from_plugin
|
787
|
+
setup_gce_metadata_stubs
|
788
|
+
setup_container_metadata_stubs
|
789
|
+
setup_logging_stubs
|
790
|
+
d = create_driver(APPLICATION_DEFAULT_CONFIG, CONTAINER_LOG_NAME)
|
791
|
+
[2, 3, 5, 11, 50].each do |n|
|
792
|
+
# The test driver doesn't clear its buffer of entries after running, so
|
793
|
+
# do it manually here.
|
794
|
+
d.instance_variable_get('@entries').clear
|
795
|
+
@logs_sent = []
|
796
|
+
n.times { |i| d.emit(container_log_entry_with_metadata(i)) }
|
797
|
+
d.run
|
798
|
+
verify_log_entries(n, CONTAINER_FROM_METADATA_PARAMS)
|
799
|
+
end
|
800
|
+
end
|
801
|
+
|
802
|
+
def test_one_container_log_metadata_from_tag
|
803
|
+
setup_gce_metadata_stubs
|
804
|
+
setup_container_metadata_stubs
|
805
|
+
setup_logging_stubs
|
806
|
+
d = create_driver(APPLICATION_DEFAULT_CONFIG, CONTAINER_LOG_NAME)
|
807
|
+
d.emit('message' => log_entry(0))
|
808
|
+
d.run
|
809
|
+
verify_log_entries(1, CONTAINER_FROM_TAG_PARAMS)
|
810
|
+
end
|
811
|
+
|
812
|
+
def test_multiple_container_logs_metadata_from_tag
|
813
|
+
setup_gce_metadata_stubs
|
814
|
+
setup_container_metadata_stubs
|
815
|
+
setup_logging_stubs
|
816
|
+
d = create_driver(APPLICATION_DEFAULT_CONFIG, CONTAINER_LOG_NAME)
|
817
|
+
[2, 3, 5, 11, 50].each do |n|
|
818
|
+
# The test driver doesn't clear its buffer of entries after running, so
|
819
|
+
# do it manually here.
|
820
|
+
d.instance_variable_get('@entries').clear
|
821
|
+
@logs_sent = []
|
822
|
+
n.times { |i| d.emit('message' => log_entry(i)) }
|
823
|
+
d.run
|
824
|
+
verify_log_entries(n, CONTAINER_FROM_TAG_PARAMS)
|
825
|
+
end
|
826
|
+
end
|
827
|
+
|
727
828
|
# Make parse_severity public so we can test it.
|
728
829
|
class Fluent::GoogleCloudOutput # rubocop:disable Style/ClassAndModuleChildren
|
729
830
|
public :parse_severity
|
@@ -856,14 +957,13 @@ class GoogleCloudOutputTest < Test::Unit::TestCase
|
|
856
957
|
end
|
857
958
|
|
858
959
|
def setup_logging_stubs
|
859
|
-
[COMPUTE_PARAMS, VMENGINE_PARAMS,
|
860
|
-
|
861
|
-
|
862
|
-
|
863
|
-
|
864
|
-
{ body: '' }
|
865
|
-
end
|
960
|
+
[COMPUTE_PARAMS, VMENGINE_PARAMS, CONTAINER_FROM_TAG_PARAMS,
|
961
|
+
CONTAINER_FROM_METADATA_PARAMS, CUSTOM_PARAMS, EC2_PARAMS].each do |params|
|
962
|
+
stub_request(:post, uri_for_log(params)).to_return do |request|
|
963
|
+
@logs_sent << JSON.parse(request.body)
|
964
|
+
{ body: '' }
|
866
965
|
end
|
966
|
+
end
|
867
967
|
end
|
868
968
|
|
869
969
|
def setup_auth_stubs
|
@@ -900,6 +1000,29 @@ class GoogleCloudOutputTest < Test::Unit::TestCase
|
|
900
1000
|
'guestbook2.0')
|
901
1001
|
end
|
902
1002
|
|
1003
|
+
def setup_container_metadata_stubs
|
1004
|
+
stub_metadata_request(
|
1005
|
+
'instance/attributes/',
|
1006
|
+
"attribute1\nkube-env\nlast_attribute")
|
1007
|
+
stub_metadata_request('instance/attributes/kube-env',
|
1008
|
+
"ENABLE_NODE_LOGGING: \"true\"\n"\
|
1009
|
+
"INSTANCE_PREFIX: gke-cluster-1-740fdafa\n"\
|
1010
|
+
'KUBE_BEARER_TOKEN: AoQiMuwkNP2BMT0S')
|
1011
|
+
end
|
1012
|
+
|
1013
|
+
def container_log_entry_with_metadata(i)
|
1014
|
+
{
|
1015
|
+
message: log_entry(i),
|
1016
|
+
kubernetes: {
|
1017
|
+
namespace_id: CONTAINER_NAMESPACE_ID,
|
1018
|
+
namespace_name: CONTAINER_NAMESPACE_NAME,
|
1019
|
+
pod_id: CONTAINER_POD_ID,
|
1020
|
+
pod_name: CONTAINER_POD_NAME,
|
1021
|
+
container_name: CONTAINER_CONTAINER_NAME
|
1022
|
+
}
|
1023
|
+
}
|
1024
|
+
end
|
1025
|
+
|
903
1026
|
def log_entry(i)
|
904
1027
|
'test log entry ' + i.to_s
|
905
1028
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-google-cloud
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Todd Derr
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-09-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: fluentd
|
@@ -181,7 +181,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
181
181
|
version: '0'
|
182
182
|
requirements: []
|
183
183
|
rubyforge_project:
|
184
|
-
rubygems_version: 2.4.
|
184
|
+
rubygems_version: 2.4.3
|
185
185
|
signing_key:
|
186
186
|
specification_version: 4
|
187
187
|
summary: fluentd output plugin for the Google Cloud Logging API
|