fluent-plugin-google-cloud 0.6.2 → 0.6.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +9 -9
- data/fluent-plugin-google-cloud-0.6.2.gem +0 -0
- data/fluent-plugin-google-cloud.gemspec +2 -2
- data/lib/fluent/plugin/out_google_cloud.rb +4 -3
- data/test/plugin/base_test.rb +3 -405
- data/test/plugin/constants.rb +424 -0
- data/test/plugin/test_out_google_cloud.rb +2 -0
- metadata +12 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a0d7c7c98a69f3fa2f2c40ad70020260bf55e8be
|
4
|
+
data.tar.gz: 539deff09173b3b13fe9c226eaee60f8bd3695c7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9bd48380bc63a1863ddc846beaf10d47053b3c17013e5d4044bc6474383d5958cd331ed9195092b8ffbf27e9b18c8f61e98f7e3eaff23ec2ed8b3fbfdb30ac11
|
7
|
+
data.tar.gz: 7c0e134bbfa2c2b78b33727be8739c2e548f169f7b7c76a451bedea257babc82bf062c89e0020daf9426d8b47a1cf72542670e24ef73cc94782e8d9ecec86263
|
data/Gemfile.lock
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
fluent-plugin-google-cloud (0.6.
|
4
|
+
fluent-plugin-google-cloud (0.6.3)
|
5
5
|
fluentd (~> 0.10)
|
6
6
|
google-api-client (~> 0.9.0)
|
7
7
|
google-cloud-logging (~> 0.23.2)
|
8
8
|
googleapis-common-protos (~> 1.3)
|
9
9
|
googleauth (~> 0.4)
|
10
|
-
grpc (~> 1.0)
|
10
|
+
grpc (~> 1.0, < 1.3)
|
11
11
|
json (~> 1.8)
|
12
12
|
|
13
13
|
GEM
|
@@ -18,13 +18,13 @@ GEM
|
|
18
18
|
ast (2.3.0)
|
19
19
|
astrolabe (1.3.1)
|
20
20
|
parser (~> 2.2)
|
21
|
-
cool.io (1.
|
21
|
+
cool.io (1.5.0)
|
22
22
|
crack (0.4.3)
|
23
23
|
safe_yaml (~> 1.0.0)
|
24
24
|
faraday (0.12.1)
|
25
25
|
multipart-post (>= 1.2, < 3)
|
26
|
-
fluentd (0.14.
|
27
|
-
cool.io (
|
26
|
+
fluentd (0.14.17)
|
27
|
+
cool.io (>= 1.4.5, < 2.0.0)
|
28
28
|
http_parser.rb (>= 0.5.1, < 0.7.0)
|
29
29
|
msgpack (>= 0.7.0, < 2.0.0)
|
30
30
|
serverengine (>= 2.0.4, < 3.0.0)
|
@@ -57,7 +57,7 @@ GEM
|
|
57
57
|
googleauth (~> 0.5.1)
|
58
58
|
grpc (~> 1.0)
|
59
59
|
rly (~> 0.2.3)
|
60
|
-
google-protobuf (3.3.0)
|
60
|
+
google-protobuf (3.3.0-universal-darwin)
|
61
61
|
googleapis-common-protos (1.3.5)
|
62
62
|
google-protobuf (~> 3.2)
|
63
63
|
grpc (~> 1.0)
|
@@ -69,7 +69,7 @@ GEM
|
|
69
69
|
multi_json (~> 1.11)
|
70
70
|
os (~> 0.9)
|
71
71
|
signet (~> 0.7)
|
72
|
-
grpc (1.2.5)
|
72
|
+
grpc (1.2.5-universal-darwin)
|
73
73
|
google-protobuf (~> 3.1)
|
74
74
|
googleauth (~> 0.5.1)
|
75
75
|
hashdiff (0.3.4)
|
@@ -125,7 +125,7 @@ GEM
|
|
125
125
|
multi_json (~> 1.10)
|
126
126
|
stackdriver-core (0.21.0)
|
127
127
|
strptime (0.1.9)
|
128
|
-
test-unit (3.2.
|
128
|
+
test-unit (3.2.4)
|
129
129
|
power_assert
|
130
130
|
thread_safe (0.3.6)
|
131
131
|
tins (1.6.0)
|
@@ -152,4 +152,4 @@ DEPENDENCIES
|
|
152
152
|
webmock (~> 1.17)
|
153
153
|
|
154
154
|
BUNDLED WITH
|
155
|
-
1.
|
155
|
+
1.15.0
|
Binary file
|
@@ -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.
|
13
|
+
gem.version = '0.6.3'
|
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')
|
@@ -24,7 +24,7 @@ eos
|
|
24
24
|
gem.add_runtime_dependency 'google-api-client', '~> 0.9.0'
|
25
25
|
gem.add_runtime_dependency 'google-cloud-logging', '~> 0.23.2'
|
26
26
|
gem.add_runtime_dependency 'googleauth', '~> 0.4'
|
27
|
-
gem.add_runtime_dependency 'grpc', '~> 1.0'
|
27
|
+
gem.add_runtime_dependency 'grpc', '~> 1.0', '< 1.3'
|
28
28
|
gem.add_runtime_dependency 'json', '~> 1.8'
|
29
29
|
|
30
30
|
gem.add_development_dependency 'mocha', '~> 1.1'
|
@@ -73,7 +73,7 @@ module Fluent
|
|
73
73
|
Fluent::Plugin.register_output('google_cloud', self)
|
74
74
|
|
75
75
|
PLUGIN_NAME = 'Fluentd Google Cloud Logging plugin'
|
76
|
-
PLUGIN_VERSION = '0.6.
|
76
|
+
PLUGIN_VERSION = '0.6.3'
|
77
77
|
|
78
78
|
# Name of the the Google cloud logging write scope.
|
79
79
|
LOGGING_SCOPE = 'https://www.googleapis.com/auth/logging.write'
|
@@ -450,8 +450,9 @@ module Fluent
|
|
450
450
|
# Do this here to avoid having to repeat it for each record.
|
451
451
|
match_data = @compiled_kubernetes_tag_regexp.match(tag)
|
452
452
|
if match_data
|
453
|
-
group_resource.labels['container_name'] =
|
454
|
-
|
453
|
+
group_resource.labels['container_name'] = match_data['container_name']
|
454
|
+
group_resource.labels['namespace_id'] = match_data['namespace_name']
|
455
|
+
group_resource.labels['pod_id'] = match_data['pod_name']
|
455
456
|
%w(namespace_name pod_name).each do |field|
|
456
457
|
group_common_labels["#{CONTAINER_CONSTANTS[:service]}/#{field}"] =
|
457
458
|
match_data[field]
|
data/test/plugin/base_test.rb
CHANGED
@@ -17,9 +17,11 @@ require 'helper'
|
|
17
17
|
require 'mocha/test_unit'
|
18
18
|
require 'webmock/test_unit'
|
19
19
|
|
20
|
+
require_relative 'constants'
|
21
|
+
|
20
22
|
# Unit tests for Google Cloud Logging plugin
|
21
23
|
module BaseTest
|
22
|
-
include
|
24
|
+
include Constants
|
23
25
|
|
24
26
|
def setup
|
25
27
|
Fluent::Test.setup
|
@@ -39,410 +41,6 @@ module BaseTest
|
|
39
41
|
@logs_sent = []
|
40
42
|
end
|
41
43
|
|
42
|
-
# generic attributes
|
43
|
-
HOSTNAME = Socket.gethostname
|
44
|
-
|
45
|
-
WRITE_LOG_ENTRIES_URI = 'https://logging.googleapis.com/v2beta1/entries:write'
|
46
|
-
|
47
|
-
# attributes used for the GCE metadata service
|
48
|
-
PROJECT_ID = 'test-project-id'
|
49
|
-
ZONE = 'us-central1-b'
|
50
|
-
FULLY_QUALIFIED_ZONE = 'projects/' + PROJECT_ID + '/zones/' + ZONE
|
51
|
-
VM_ID = '9876543210'
|
52
|
-
|
53
|
-
# attributes used for custom (overridden) configs
|
54
|
-
CUSTOM_PROJECT_ID = 'test-custom-project-id'
|
55
|
-
CUSTOM_ZONE = 'us-custom-central1-b'
|
56
|
-
CUSTOM_FULLY_QUALIFIED_ZONE = 'projects/' + PROJECT_ID + '/zones/' + ZONE
|
57
|
-
CUSTOM_VM_ID = 'C9876543210'
|
58
|
-
CUSTOM_HOSTNAME = 'custom.hostname.org'
|
59
|
-
|
60
|
-
# attributes used for the EC2 metadata service
|
61
|
-
EC2_PROJECT_ID = 'test-ec2-project-id'
|
62
|
-
EC2_ZONE = 'us-west-2b'
|
63
|
-
EC2_PREFIXED_ZONE = 'aws:' + EC2_ZONE
|
64
|
-
EC2_VM_ID = 'i-81c16767'
|
65
|
-
EC2_ACCOUNT_ID = '123456789012'
|
66
|
-
|
67
|
-
# The formatting here matches the format used on the VM.
|
68
|
-
EC2_IDENTITY_DOCUMENT = %({
|
69
|
-
"accountId" : "#{EC2_ACCOUNT_ID}",
|
70
|
-
"availabilityZone" : "#{EC2_ZONE}",
|
71
|
-
"instanceId" : "#{EC2_VM_ID}"
|
72
|
-
})
|
73
|
-
|
74
|
-
# Managed VMs specific labels
|
75
|
-
MANAGED_VM_BACKEND_NAME = 'default'
|
76
|
-
MANAGED_VM_BACKEND_VERSION = 'guestbook2.0'
|
77
|
-
|
78
|
-
# Container Engine / Kubernetes specific labels
|
79
|
-
CONTAINER_CLUSTER_NAME = 'cluster-1'
|
80
|
-
CONTAINER_NAMESPACE_ID = '898268c8-4a36-11e5-9d81-42010af0194c'
|
81
|
-
CONTAINER_NAMESPACE_NAME = 'kube-system'
|
82
|
-
CONTAINER_POD_ID = 'cad3c3c4-4b9c-11e5-9d81-42010af0194c'
|
83
|
-
CONTAINER_POD_NAME = 'redis-master-c0l82.foo.bar'
|
84
|
-
CONTAINER_CONTAINER_NAME = 'redis'
|
85
|
-
CONTAINER_LABEL_KEY = 'component'
|
86
|
-
CONTAINER_LABEL_VALUE = 'redis-component'
|
87
|
-
CONTAINER_STREAM = 'stdout'
|
88
|
-
CONTAINER_SEVERITY = 'INFO'
|
89
|
-
# Timestamp for 1234567890 seconds and 987654321 nanoseconds since epoch
|
90
|
-
CONTAINER_TIMESTAMP = '2009-02-13T23:31:30.987654321Z'
|
91
|
-
CONTAINER_SECONDS_EPOCH = 1_234_567_890
|
92
|
-
CONTAINER_NANOS = 987_654_321
|
93
|
-
|
94
|
-
# Cloud Functions specific labels
|
95
|
-
CLOUDFUNCTIONS_FUNCTION_NAME = '$My_Function.Name-@1'
|
96
|
-
CLOUDFUNCTIONS_REGION = 'us-central1'
|
97
|
-
CLOUDFUNCTIONS_EXECUTION_ID = '123-0'
|
98
|
-
CLOUDFUNCTIONS_CLUSTER_NAME = 'cluster-1'
|
99
|
-
CLOUDFUNCTIONS_NAMESPACE_NAME = 'default'
|
100
|
-
CLOUDFUNCTIONS_POD_NAME = 'd.dc.myu.uc.functionp.pc.name-a.a1.987-c0l82'
|
101
|
-
CLOUDFUNCTIONS_CONTAINER_NAME = 'worker'
|
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
|
-
|
118
|
-
# Parameters used for authentication
|
119
|
-
AUTH_GRANT_TYPE = 'urn:ietf:params:oauth:grant-type:jwt-bearer'
|
120
|
-
FAKE_AUTH_TOKEN = 'abc123'
|
121
|
-
|
122
|
-
# Information about test credentials files.
|
123
|
-
# path: Path to the credentials file.
|
124
|
-
# project_id: ID of the project, which must correspond to the file contents.
|
125
|
-
IAM_CREDENTIALS = {
|
126
|
-
path: 'test/plugin/data/iam-credentials.json',
|
127
|
-
project_id: 'fluent-test-project'
|
128
|
-
}
|
129
|
-
LEGACY_CREDENTIALS = {
|
130
|
-
path: 'test/plugin/data/credentials.json',
|
131
|
-
project_id: '847859579879'
|
132
|
-
}
|
133
|
-
INVALID_CREDENTIALS = {
|
134
|
-
path: 'test/plugin/data/invalid_credentials.json',
|
135
|
-
project_id: ''
|
136
|
-
}
|
137
|
-
|
138
|
-
# Configuration files for various test scenarios
|
139
|
-
APPLICATION_DEFAULT_CONFIG = %(
|
140
|
-
)
|
141
|
-
|
142
|
-
# rubocop:disable Metrics/LineLength
|
143
|
-
PRIVATE_KEY_CONFIG = %(
|
144
|
-
auth_method private_key
|
145
|
-
private_key_email 271661262351-ft99kc9kjro9rrihq3k2n3s2inbplu0q@developer.gserviceaccount.com
|
146
|
-
private_key_path test/plugin/data/c31e573fd7f62ed495c9ca3821a5a85cb036dee1-privatekey.p12
|
147
|
-
)
|
148
|
-
# rubocop:enable Metrics/LineLength
|
149
|
-
|
150
|
-
REQUIRE_VALID_TAGS_CONFIG = %(
|
151
|
-
require_valid_tags true
|
152
|
-
)
|
153
|
-
|
154
|
-
NO_METADATA_SERVICE_CONFIG = %(
|
155
|
-
use_metadata_service false
|
156
|
-
)
|
157
|
-
|
158
|
-
NO_DETECT_SUBSERVICE_CONFIG = %(
|
159
|
-
detect_subservice false
|
160
|
-
)
|
161
|
-
|
162
|
-
CUSTOM_METADATA_CONFIG = %(
|
163
|
-
project_id #{CUSTOM_PROJECT_ID}
|
164
|
-
zone #{CUSTOM_ZONE}
|
165
|
-
vm_id #{CUSTOM_VM_ID}
|
166
|
-
vm_name #{CUSTOM_HOSTNAME}
|
167
|
-
)
|
168
|
-
|
169
|
-
CONFIG_MISSING_METADATA_PROJECT_ID = %(
|
170
|
-
zone #{CUSTOM_ZONE}
|
171
|
-
vm_id #{CUSTOM_VM_ID}
|
172
|
-
)
|
173
|
-
CONFIG_MISSING_METADATA_ZONE = %(
|
174
|
-
project_id #{CUSTOM_PROJECT_ID}
|
175
|
-
vm_id #{CUSTOM_VM_ID}
|
176
|
-
)
|
177
|
-
CONFIG_MISSING_METADATA_VM_ID = %(
|
178
|
-
project_id #{CUSTOM_PROJECT_ID}
|
179
|
-
zone #{CUSTOM_ZONE}
|
180
|
-
)
|
181
|
-
CONFIG_MISSING_METADATA_ALL = %(
|
182
|
-
)
|
183
|
-
|
184
|
-
CONFIG_EC2_PROJECT_ID = %(
|
185
|
-
project_id #{EC2_PROJECT_ID}
|
186
|
-
)
|
187
|
-
|
188
|
-
CONFIG_EC2_PROJECT_ID_AND_CUSTOM_VM_ID = %(
|
189
|
-
project_id #{EC2_PROJECT_ID}
|
190
|
-
vm_id #{CUSTOM_VM_ID}
|
191
|
-
)
|
192
|
-
|
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
|
-
)
|
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
|
214
|
-
COMPUTE_PARAMS = {
|
215
|
-
resource: {
|
216
|
-
type: COMPUTE_CONSTANTS[:resource_type],
|
217
|
-
labels: {
|
218
|
-
'instance_id' => VM_ID,
|
219
|
-
'zone' => ZONE
|
220
|
-
}
|
221
|
-
},
|
222
|
-
log_name: 'test',
|
223
|
-
project_id: PROJECT_ID,
|
224
|
-
labels: {
|
225
|
-
"#{COMPUTE_CONSTANTS[:service]}/resource_name" => HOSTNAME
|
226
|
-
}
|
227
|
-
}
|
228
|
-
|
229
|
-
VMENGINE_PARAMS = {
|
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",
|
238
|
-
project_id: PROJECT_ID,
|
239
|
-
labels: {
|
240
|
-
"#{COMPUTE_CONSTANTS[:service]}/resource_id" => VM_ID,
|
241
|
-
"#{COMPUTE_CONSTANTS[:service]}/resource_name" => HOSTNAME,
|
242
|
-
"#{COMPUTE_CONSTANTS[:service]}/zone" => ZONE
|
243
|
-
}
|
244
|
-
}
|
245
|
-
|
246
|
-
CONTAINER_TAG = "kubernetes.#{CONTAINER_POD_NAME}_" \
|
247
|
-
"#{CONTAINER_NAMESPACE_NAME}_#{CONTAINER_CONTAINER_NAME}"
|
248
|
-
|
249
|
-
CONTAINER_FROM_METADATA_PARAMS = {
|
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
|
-
},
|
261
|
-
log_name: CONTAINER_CONTAINER_NAME,
|
262
|
-
project_id: PROJECT_ID,
|
263
|
-
labels: {
|
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,
|
268
|
-
"label/#{CONTAINER_LABEL_KEY}" => CONTAINER_LABEL_VALUE,
|
269
|
-
"#{COMPUTE_CONSTANTS[:service]}/resource_name" => HOSTNAME
|
270
|
-
}
|
271
|
-
}
|
272
|
-
|
273
|
-
# Almost the same as from metadata, but missing namespace_id and pod_id.
|
274
|
-
CONTAINER_FROM_TAG_PARAMS = {
|
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
|
-
},
|
284
|
-
log_name: CONTAINER_CONTAINER_NAME,
|
285
|
-
project_id: PROJECT_ID,
|
286
|
-
labels: {
|
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
|
292
|
-
}
|
293
|
-
}
|
294
|
-
|
295
|
-
CLOUDFUNCTIONS_TAG = "kubernetes.#{CLOUDFUNCTIONS_POD_NAME}_" \
|
296
|
-
"#{CLOUDFUNCTIONS_NAMESPACE_NAME}_" \
|
297
|
-
"#{CLOUDFUNCTIONS_CONTAINER_NAME}"
|
298
|
-
|
299
|
-
CLOUDFUNCTIONS_PARAMS = {
|
300
|
-
resource: {
|
301
|
-
type: CLOUDFUNCTIONS_CONSTANTS[:resource_type],
|
302
|
-
labels: {
|
303
|
-
'function_name' => CLOUDFUNCTIONS_FUNCTION_NAME,
|
304
|
-
'region' => CLOUDFUNCTIONS_REGION
|
305
|
-
}
|
306
|
-
},
|
307
|
-
log_name: 'cloud-functions',
|
308
|
-
project_id: PROJECT_ID,
|
309
|
-
labels: {
|
310
|
-
'execution_id' => CLOUDFUNCTIONS_EXECUTION_ID,
|
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
|
317
|
-
}
|
318
|
-
}
|
319
|
-
|
320
|
-
CLOUDFUNCTIONS_TEXT_NOT_MATCHED_PARAMS = {
|
321
|
-
resource: {
|
322
|
-
type: CLOUDFUNCTIONS_CONSTANTS[:resource_type],
|
323
|
-
labels: {
|
324
|
-
'function_name' => CLOUDFUNCTIONS_FUNCTION_NAME,
|
325
|
-
'region' => CLOUDFUNCTIONS_REGION
|
326
|
-
}
|
327
|
-
},
|
328
|
-
log_name: 'cloud-functions',
|
329
|
-
project_id: PROJECT_ID,
|
330
|
-
labels: {
|
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
|
375
|
-
}
|
376
|
-
}
|
377
|
-
|
378
|
-
CUSTOM_PARAMS = {
|
379
|
-
resource: {
|
380
|
-
type: COMPUTE_CONSTANTS[:resource_type],
|
381
|
-
labels: {
|
382
|
-
'instance_id' => CUSTOM_VM_ID,
|
383
|
-
'zone' => CUSTOM_ZONE
|
384
|
-
}
|
385
|
-
},
|
386
|
-
log_name: 'test',
|
387
|
-
project_id: CUSTOM_PROJECT_ID,
|
388
|
-
labels: {
|
389
|
-
"#{COMPUTE_CONSTANTS[:service]}/resource_name" => CUSTOM_HOSTNAME
|
390
|
-
}
|
391
|
-
}
|
392
|
-
|
393
|
-
EC2_PARAMS = {
|
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
|
-
},
|
402
|
-
log_name: 'test',
|
403
|
-
project_id: EC2_PROJECT_ID,
|
404
|
-
labels: {
|
405
|
-
"#{EC2_CONSTANTS[:service]}/resource_name" => HOSTNAME
|
406
|
-
}
|
407
|
-
}
|
408
|
-
|
409
|
-
HTTP_REQUEST_MESSAGE = {
|
410
|
-
'requestMethod' => 'POST',
|
411
|
-
'requestUrl' => 'http://example/',
|
412
|
-
'requestSize' => 210,
|
413
|
-
'status' => 200,
|
414
|
-
'responseSize' => 65,
|
415
|
-
'userAgent' => 'USER AGENT 1.0',
|
416
|
-
'remoteIp' => '55.55.55.55',
|
417
|
-
'referer' => 'http://referer/',
|
418
|
-
'cacheHit' => true,
|
419
|
-
'cacheValidatedWithOriginServer' => true
|
420
|
-
}
|
421
|
-
|
422
|
-
# Tags and their sanitized and encoded version.
|
423
|
-
VALID_TAGS = {
|
424
|
-
'test' => 'test',
|
425
|
-
'germanß' => 'german%C3%9F',
|
426
|
-
'chinese中' => 'chinese%E4%B8%AD',
|
427
|
-
'specialCharacter/_-.' => 'specialCharacter%2F_-.',
|
428
|
-
'abc@&^$*' => 'abc%40%26%5E%24%2A',
|
429
|
-
'@&^$*' => '%40%26%5E%24%2A'
|
430
|
-
}
|
431
|
-
INVALID_TAGS = {
|
432
|
-
# Non-string tags.
|
433
|
-
123 => '123',
|
434
|
-
1.23 => '1.23',
|
435
|
-
[1, 2, 3] => '%5B1%2C%202%2C%203%5D',
|
436
|
-
{ key: 'value' } => '%7B%22key%22%3D%3E%22value%22%7D',
|
437
|
-
# Non-utf8 string tags.
|
438
|
-
"nonutf8#{[0x92].pack('C*')}" => 'nonutf8%20',
|
439
|
-
"abc#{[0x92].pack('C*')}" => 'abc%20',
|
440
|
-
"#{[0x92].pack('C*')}" => '%20',
|
441
|
-
# Empty string tag.
|
442
|
-
'' => '_'
|
443
|
-
}
|
444
|
-
ALL_TAGS = VALID_TAGS.merge(INVALID_TAGS)
|
445
|
-
|
446
44
|
# Shared tests.
|
447
45
|
|
448
46
|
def test_configure_service_account_application_default
|
@@ -0,0 +1,424 @@
|
|
1
|
+
# Copyright 2017 Google Inc. All rights reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
# Constants used by unit tests for Google Cloud Logging plugin.
|
16
|
+
module Constants
|
17
|
+
include Fluent::GoogleCloudOutput::Constants
|
18
|
+
|
19
|
+
# Generic attributes.
|
20
|
+
HOSTNAME = Socket.gethostname
|
21
|
+
|
22
|
+
# TODO(qingling128) Separate constants into different submodules.
|
23
|
+
# Attributes used for the GCE metadata service.
|
24
|
+
PROJECT_ID = 'test-project-id'
|
25
|
+
ZONE = 'us-central1-b'
|
26
|
+
FULLY_QUALIFIED_ZONE = 'projects/' + PROJECT_ID + '/zones/' + ZONE
|
27
|
+
VM_ID = '9876543210'
|
28
|
+
|
29
|
+
# Attributes used for custom (overridden) configs.
|
30
|
+
CUSTOM_PROJECT_ID = 'test-custom-project-id'
|
31
|
+
CUSTOM_ZONE = 'us-custom-central1-b'
|
32
|
+
CUSTOM_FULLY_QUALIFIED_ZONE = 'projects/' + PROJECT_ID + '/zones/' + ZONE
|
33
|
+
CUSTOM_VM_ID = 'C9876543210'
|
34
|
+
CUSTOM_HOSTNAME = 'custom.hostname.org'
|
35
|
+
|
36
|
+
# Attributes used for the EC2 metadata service.
|
37
|
+
EC2_PROJECT_ID = 'test-ec2-project-id'
|
38
|
+
EC2_ZONE = 'us-west-2b'
|
39
|
+
EC2_PREFIXED_ZONE = 'aws:' + EC2_ZONE
|
40
|
+
EC2_VM_ID = 'i-81c16767'
|
41
|
+
EC2_ACCOUNT_ID = '123456789012'
|
42
|
+
|
43
|
+
# The formatting here matches the format used on the VM.
|
44
|
+
EC2_IDENTITY_DOCUMENT = %({
|
45
|
+
"accountId" : "#{EC2_ACCOUNT_ID}",
|
46
|
+
"availabilityZone" : "#{EC2_ZONE}",
|
47
|
+
"instanceId" : "#{EC2_VM_ID}"
|
48
|
+
})
|
49
|
+
|
50
|
+
# Managed VMs specific labels.
|
51
|
+
MANAGED_VM_BACKEND_NAME = 'default'
|
52
|
+
MANAGED_VM_BACKEND_VERSION = 'guestbook2.0'
|
53
|
+
|
54
|
+
# Container Engine / Kubernetes specific labels.
|
55
|
+
CONTAINER_CLUSTER_NAME = 'cluster-1'
|
56
|
+
CONTAINER_NAMESPACE_ID = '898268c8-4a36-11e5-9d81-42010af0194c'
|
57
|
+
CONTAINER_NAMESPACE_NAME = 'kube-system'
|
58
|
+
CONTAINER_POD_ID = 'cad3c3c4-4b9c-11e5-9d81-42010af0194c'
|
59
|
+
CONTAINER_POD_NAME = 'redis-master-c0l82.foo.bar'
|
60
|
+
CONTAINER_CONTAINER_NAME = 'redis'
|
61
|
+
CONTAINER_LABEL_KEY = 'component'
|
62
|
+
CONTAINER_LABEL_VALUE = 'redis-component'
|
63
|
+
CONTAINER_STREAM = 'stdout'
|
64
|
+
CONTAINER_SEVERITY = 'INFO'
|
65
|
+
# Timestamp for 1234567890 seconds and 987654321 nanoseconds since epoch.
|
66
|
+
CONTAINER_TIMESTAMP = '2009-02-13T23:31:30.987654321Z'
|
67
|
+
CONTAINER_SECONDS_EPOCH = 1_234_567_890
|
68
|
+
CONTAINER_NANOS = 987_654_321
|
69
|
+
|
70
|
+
# Cloud Functions specific labels.
|
71
|
+
CLOUDFUNCTIONS_FUNCTION_NAME = '$My_Function.Name-@1'
|
72
|
+
CLOUDFUNCTIONS_REGION = 'us-central1'
|
73
|
+
CLOUDFUNCTIONS_EXECUTION_ID = '123-0'
|
74
|
+
CLOUDFUNCTIONS_CLUSTER_NAME = 'cluster-1'
|
75
|
+
CLOUDFUNCTIONS_NAMESPACE_NAME = 'default'
|
76
|
+
CLOUDFUNCTIONS_POD_NAME = 'd.dc.myu.uc.functionp.pc.name-a.a1.987-c0l82'
|
77
|
+
CLOUDFUNCTIONS_CONTAINER_NAME = 'worker'
|
78
|
+
|
79
|
+
# Dataflow specific labels.
|
80
|
+
DATAFLOW_REGION = 'us-central1'
|
81
|
+
DATAFLOW_JOB_NAME = 'job_name_1'
|
82
|
+
DATAFLOW_JOB_ID = 'job_id_1'
|
83
|
+
DATAFLOW_STEP_ID = 'step_1'
|
84
|
+
DATAFLOW_TAG = 'dataflow.googleapis.com/worker'
|
85
|
+
|
86
|
+
# ML specific labels.
|
87
|
+
ML_REGION = 'us-central1'
|
88
|
+
ML_JOB_ID = 'job_name_1'
|
89
|
+
ML_TASK_NAME = 'task_name_1'
|
90
|
+
ML_TRIAL_ID = 'trial_id_1'
|
91
|
+
ML_LOG_AREA = 'log_area_1'
|
92
|
+
ML_TAG = 'master-replica-0'
|
93
|
+
|
94
|
+
# Parameters used for authentication.
|
95
|
+
AUTH_GRANT_TYPE = 'urn:ietf:params:oauth:grant-type:jwt-bearer'
|
96
|
+
FAKE_AUTH_TOKEN = 'abc123'
|
97
|
+
|
98
|
+
# Information about test credentials files.
|
99
|
+
# path: Path to the credentials file.
|
100
|
+
# project_id: ID of the project, which must correspond to the file contents.
|
101
|
+
IAM_CREDENTIALS = {
|
102
|
+
path: 'test/plugin/data/iam-credentials.json',
|
103
|
+
project_id: 'fluent-test-project'
|
104
|
+
}
|
105
|
+
LEGACY_CREDENTIALS = {
|
106
|
+
path: 'test/plugin/data/credentials.json',
|
107
|
+
project_id: '847859579879'
|
108
|
+
}
|
109
|
+
INVALID_CREDENTIALS = {
|
110
|
+
path: 'test/plugin/data/invalid_credentials.json',
|
111
|
+
project_id: ''
|
112
|
+
}
|
113
|
+
|
114
|
+
# Configuration files for various test scenarios.
|
115
|
+
APPLICATION_DEFAULT_CONFIG = %(
|
116
|
+
)
|
117
|
+
|
118
|
+
# rubocop:disable Metrics/LineLength
|
119
|
+
PRIVATE_KEY_CONFIG = %(
|
120
|
+
auth_method private_key
|
121
|
+
private_key_email 271661262351-ft99kc9kjro9rrihq3k2n3s2inbplu0q@developer.gserviceaccount.com
|
122
|
+
private_key_path test/plugin/data/c31e573fd7f62ed495c9ca3821a5a85cb036dee1-privatekey.p12
|
123
|
+
)
|
124
|
+
# rubocop:enable Metrics/LineLength
|
125
|
+
|
126
|
+
REQUIRE_VALID_TAGS_CONFIG = %(
|
127
|
+
require_valid_tags true
|
128
|
+
)
|
129
|
+
|
130
|
+
NO_METADATA_SERVICE_CONFIG = %(
|
131
|
+
use_metadata_service false
|
132
|
+
)
|
133
|
+
|
134
|
+
NO_DETECT_SUBSERVICE_CONFIG = %(
|
135
|
+
detect_subservice false
|
136
|
+
)
|
137
|
+
|
138
|
+
CUSTOM_METADATA_CONFIG = %(
|
139
|
+
project_id #{CUSTOM_PROJECT_ID}
|
140
|
+
zone #{CUSTOM_ZONE}
|
141
|
+
vm_id #{CUSTOM_VM_ID}
|
142
|
+
vm_name #{CUSTOM_HOSTNAME}
|
143
|
+
)
|
144
|
+
|
145
|
+
CONFIG_MISSING_METADATA_PROJECT_ID = %(
|
146
|
+
zone #{CUSTOM_ZONE}
|
147
|
+
vm_id #{CUSTOM_VM_ID}
|
148
|
+
)
|
149
|
+
CONFIG_MISSING_METADATA_ZONE = %(
|
150
|
+
project_id #{CUSTOM_PROJECT_ID}
|
151
|
+
vm_id #{CUSTOM_VM_ID}
|
152
|
+
)
|
153
|
+
CONFIG_MISSING_METADATA_VM_ID = %(
|
154
|
+
project_id #{CUSTOM_PROJECT_ID}
|
155
|
+
zone #{CUSTOM_ZONE}
|
156
|
+
)
|
157
|
+
CONFIG_MISSING_METADATA_ALL = %(
|
158
|
+
)
|
159
|
+
|
160
|
+
CONFIG_EC2_PROJECT_ID = %(
|
161
|
+
project_id #{EC2_PROJECT_ID}
|
162
|
+
)
|
163
|
+
|
164
|
+
CONFIG_EC2_PROJECT_ID_AND_CUSTOM_VM_ID = %(
|
165
|
+
project_id #{EC2_PROJECT_ID}
|
166
|
+
vm_id #{CUSTOM_VM_ID}
|
167
|
+
)
|
168
|
+
|
169
|
+
CONFIG_DATAFLOW = %(
|
170
|
+
subservice_name "#{DATAFLOW_CONSTANTS[:service]}"
|
171
|
+
labels {
|
172
|
+
"#{DATAFLOW_CONSTANTS[:service]}/region" : "#{DATAFLOW_REGION}",
|
173
|
+
"#{DATAFLOW_CONSTANTS[:service]}/job_name" : "#{DATAFLOW_JOB_NAME}",
|
174
|
+
"#{DATAFLOW_CONSTANTS[:service]}/job_id" : "#{DATAFLOW_JOB_ID}"
|
175
|
+
}
|
176
|
+
label_map { "step": "#{DATAFLOW_CONSTANTS[:service]}/step_id" }
|
177
|
+
)
|
178
|
+
|
179
|
+
CONFIG_ML = %(
|
180
|
+
subservice_name "#{ML_CONSTANTS[:service]}"
|
181
|
+
labels {
|
182
|
+
"#{ML_CONSTANTS[:service]}/job_id" : "#{ML_JOB_ID}",
|
183
|
+
"#{ML_CONSTANTS[:service]}/task_name" : "#{ML_TASK_NAME}",
|
184
|
+
"#{ML_CONSTANTS[:service]}/trial_id" : "#{ML_TRIAL_ID}"
|
185
|
+
}
|
186
|
+
label_map { "name": "#{ML_CONSTANTS[:service]}/job_id/log_area" }
|
187
|
+
)
|
188
|
+
|
189
|
+
# Service configurations for various services.
|
190
|
+
COMPUTE_PARAMS = {
|
191
|
+
resource: {
|
192
|
+
type: COMPUTE_CONSTANTS[:resource_type],
|
193
|
+
labels: {
|
194
|
+
'instance_id' => VM_ID,
|
195
|
+
'zone' => ZONE
|
196
|
+
}
|
197
|
+
},
|
198
|
+
log_name: 'test',
|
199
|
+
project_id: PROJECT_ID,
|
200
|
+
labels: {
|
201
|
+
"#{COMPUTE_CONSTANTS[:service]}/resource_name" => HOSTNAME
|
202
|
+
}
|
203
|
+
}
|
204
|
+
|
205
|
+
VMENGINE_PARAMS = {
|
206
|
+
resource: {
|
207
|
+
type: APPENGINE_CONSTANTS[:resource_type],
|
208
|
+
labels: {
|
209
|
+
'module_id' => MANAGED_VM_BACKEND_NAME,
|
210
|
+
'version_id' => MANAGED_VM_BACKEND_VERSION
|
211
|
+
}
|
212
|
+
},
|
213
|
+
log_name: "#{APPENGINE_CONSTANTS[:service]}%2Ftest",
|
214
|
+
project_id: PROJECT_ID,
|
215
|
+
labels: {
|
216
|
+
"#{COMPUTE_CONSTANTS[:service]}/resource_id" => VM_ID,
|
217
|
+
"#{COMPUTE_CONSTANTS[:service]}/resource_name" => HOSTNAME,
|
218
|
+
"#{COMPUTE_CONSTANTS[:service]}/zone" => ZONE
|
219
|
+
}
|
220
|
+
}
|
221
|
+
|
222
|
+
CONTAINER_TAG = "kubernetes.#{CONTAINER_POD_NAME}_" \
|
223
|
+
"#{CONTAINER_NAMESPACE_NAME}_#{CONTAINER_CONTAINER_NAME}"
|
224
|
+
|
225
|
+
CONTAINER_FROM_METADATA_PARAMS = {
|
226
|
+
resource: {
|
227
|
+
type: CONTAINER_CONSTANTS[:resource_type],
|
228
|
+
labels: {
|
229
|
+
'cluster_name' => CONTAINER_CLUSTER_NAME,
|
230
|
+
'namespace_id' => CONTAINER_NAMESPACE_ID,
|
231
|
+
'instance_id' => VM_ID,
|
232
|
+
'pod_id' => CONTAINER_POD_ID,
|
233
|
+
'container_name' => CONTAINER_CONTAINER_NAME,
|
234
|
+
'zone' => ZONE
|
235
|
+
}
|
236
|
+
},
|
237
|
+
log_name: CONTAINER_CONTAINER_NAME,
|
238
|
+
project_id: PROJECT_ID,
|
239
|
+
labels: {
|
240
|
+
"#{CONTAINER_CONSTANTS[:service]}/namespace_name" =>
|
241
|
+
CONTAINER_NAMESPACE_NAME,
|
242
|
+
"#{CONTAINER_CONSTANTS[:service]}/pod_name" => CONTAINER_POD_NAME,
|
243
|
+
"#{CONTAINER_CONSTANTS[:service]}/stream" => CONTAINER_STREAM,
|
244
|
+
"label/#{CONTAINER_LABEL_KEY}" => CONTAINER_LABEL_VALUE,
|
245
|
+
"#{COMPUTE_CONSTANTS[:service]}/resource_name" => HOSTNAME
|
246
|
+
}
|
247
|
+
}
|
248
|
+
|
249
|
+
# Almost the same as from metadata, but namespace_id and pod_id come from
|
250
|
+
# namespace and pod names.
|
251
|
+
CONTAINER_FROM_TAG_PARAMS = {
|
252
|
+
resource: {
|
253
|
+
type: CONTAINER_CONSTANTS[:resource_type],
|
254
|
+
labels: {
|
255
|
+
'cluster_name' => CONTAINER_CLUSTER_NAME,
|
256
|
+
'namespace_id' => CONTAINER_NAMESPACE_NAME,
|
257
|
+
'instance_id' => VM_ID,
|
258
|
+
'pod_id' => CONTAINER_POD_NAME,
|
259
|
+
'container_name' => CONTAINER_CONTAINER_NAME,
|
260
|
+
'zone' => ZONE
|
261
|
+
}
|
262
|
+
},
|
263
|
+
log_name: CONTAINER_CONTAINER_NAME,
|
264
|
+
project_id: PROJECT_ID,
|
265
|
+
labels: {
|
266
|
+
"#{CONTAINER_CONSTANTS[:service]}/namespace_name" =>
|
267
|
+
CONTAINER_NAMESPACE_NAME,
|
268
|
+
"#{CONTAINER_CONSTANTS[:service]}/pod_name" => CONTAINER_POD_NAME,
|
269
|
+
"#{CONTAINER_CONSTANTS[:service]}/stream" => CONTAINER_STREAM,
|
270
|
+
"#{COMPUTE_CONSTANTS[:service]}/resource_name" => HOSTNAME
|
271
|
+
}
|
272
|
+
}
|
273
|
+
|
274
|
+
CLOUDFUNCTIONS_TAG = "kubernetes.#{CLOUDFUNCTIONS_POD_NAME}_" \
|
275
|
+
"#{CLOUDFUNCTIONS_NAMESPACE_NAME}_" \
|
276
|
+
"#{CLOUDFUNCTIONS_CONTAINER_NAME}"
|
277
|
+
|
278
|
+
CLOUDFUNCTIONS_PARAMS = {
|
279
|
+
resource: {
|
280
|
+
type: CLOUDFUNCTIONS_CONSTANTS[:resource_type],
|
281
|
+
labels: {
|
282
|
+
'function_name' => CLOUDFUNCTIONS_FUNCTION_NAME,
|
283
|
+
'region' => CLOUDFUNCTIONS_REGION
|
284
|
+
}
|
285
|
+
},
|
286
|
+
log_name: 'cloud-functions',
|
287
|
+
project_id: PROJECT_ID,
|
288
|
+
labels: {
|
289
|
+
'execution_id' => CLOUDFUNCTIONS_EXECUTION_ID,
|
290
|
+
"#{CONTAINER_CONSTANTS[:service]}/instance_id" => VM_ID,
|
291
|
+
"#{CONTAINER_CONSTANTS[:service]}/cluster_name" =>
|
292
|
+
CLOUDFUNCTIONS_CLUSTER_NAME,
|
293
|
+
"#{COMPUTE_CONSTANTS[:service]}/resource_id" => VM_ID,
|
294
|
+
"#{COMPUTE_CONSTANTS[:service]}/resource_name" => HOSTNAME,
|
295
|
+
"#{COMPUTE_CONSTANTS[:service]}/zone" => ZONE
|
296
|
+
}
|
297
|
+
}
|
298
|
+
|
299
|
+
CLOUDFUNCTIONS_TEXT_NOT_MATCHED_PARAMS = {
|
300
|
+
resource: {
|
301
|
+
type: CLOUDFUNCTIONS_CONSTANTS[:resource_type],
|
302
|
+
labels: {
|
303
|
+
'function_name' => CLOUDFUNCTIONS_FUNCTION_NAME,
|
304
|
+
'region' => CLOUDFUNCTIONS_REGION
|
305
|
+
}
|
306
|
+
},
|
307
|
+
log_name: 'cloud-functions',
|
308
|
+
project_id: PROJECT_ID,
|
309
|
+
labels: {
|
310
|
+
"#{CONTAINER_CONSTANTS[:service]}/instance_id" => VM_ID,
|
311
|
+
"#{CONTAINER_CONSTANTS[:service]}/cluster_name" =>
|
312
|
+
CLOUDFUNCTIONS_CLUSTER_NAME,
|
313
|
+
"#{COMPUTE_CONSTANTS[:service]}/resource_id" => VM_ID,
|
314
|
+
"#{COMPUTE_CONSTANTS[:service]}/resource_name" => HOSTNAME,
|
315
|
+
"#{COMPUTE_CONSTANTS[:service]}/zone" => ZONE
|
316
|
+
}
|
317
|
+
}
|
318
|
+
|
319
|
+
DATAFLOW_PARAMS = {
|
320
|
+
resource: {
|
321
|
+
type: DATAFLOW_CONSTANTS[:resource_type],
|
322
|
+
labels: {
|
323
|
+
'job_name' => DATAFLOW_JOB_NAME,
|
324
|
+
'job_id' => DATAFLOW_JOB_ID,
|
325
|
+
'step_id' => DATAFLOW_STEP_ID,
|
326
|
+
'region' => DATAFLOW_REGION
|
327
|
+
}
|
328
|
+
},
|
329
|
+
log_name: DATAFLOW_TAG,
|
330
|
+
project_id: PROJECT_ID,
|
331
|
+
labels: {
|
332
|
+
"#{COMPUTE_CONSTANTS[:service]}/resource_id" => VM_ID,
|
333
|
+
"#{COMPUTE_CONSTANTS[:service]}/resource_name" => HOSTNAME,
|
334
|
+
"#{COMPUTE_CONSTANTS[:service]}/zone" => ZONE
|
335
|
+
}
|
336
|
+
}
|
337
|
+
|
338
|
+
ML_PARAMS = {
|
339
|
+
resource: {
|
340
|
+
type: ML_CONSTANTS[:resource_type],
|
341
|
+
labels: {
|
342
|
+
'job_id' => ML_JOB_ID,
|
343
|
+
'task_name' => ML_TASK_NAME
|
344
|
+
}
|
345
|
+
},
|
346
|
+
log_name: ML_TAG,
|
347
|
+
project_id: PROJECT_ID,
|
348
|
+
labels: {
|
349
|
+
"#{ML_CONSTANTS[:service]}/trial_id" => ML_TRIAL_ID,
|
350
|
+
"#{ML_CONSTANTS[:service]}/job_id/log_area" => ML_LOG_AREA,
|
351
|
+
"#{COMPUTE_CONSTANTS[:service]}/resource_id" => VM_ID,
|
352
|
+
"#{COMPUTE_CONSTANTS[:service]}/resource_name" => HOSTNAME,
|
353
|
+
"#{COMPUTE_CONSTANTS[:service]}/zone" => ZONE
|
354
|
+
}
|
355
|
+
}
|
356
|
+
|
357
|
+
CUSTOM_PARAMS = {
|
358
|
+
resource: {
|
359
|
+
type: COMPUTE_CONSTANTS[:resource_type],
|
360
|
+
labels: {
|
361
|
+
'instance_id' => CUSTOM_VM_ID,
|
362
|
+
'zone' => CUSTOM_ZONE
|
363
|
+
}
|
364
|
+
},
|
365
|
+
log_name: 'test',
|
366
|
+
project_id: CUSTOM_PROJECT_ID,
|
367
|
+
labels: {
|
368
|
+
"#{COMPUTE_CONSTANTS[:service]}/resource_name" => CUSTOM_HOSTNAME
|
369
|
+
}
|
370
|
+
}
|
371
|
+
|
372
|
+
EC2_PARAMS = {
|
373
|
+
resource: {
|
374
|
+
type: EC2_CONSTANTS[:resource_type],
|
375
|
+
labels: {
|
376
|
+
'instance_id' => EC2_VM_ID,
|
377
|
+
'region' => EC2_PREFIXED_ZONE,
|
378
|
+
'aws_account' => EC2_ACCOUNT_ID
|
379
|
+
}
|
380
|
+
},
|
381
|
+
log_name: 'test',
|
382
|
+
project_id: EC2_PROJECT_ID,
|
383
|
+
labels: {
|
384
|
+
"#{EC2_CONSTANTS[:service]}/resource_name" => HOSTNAME
|
385
|
+
}
|
386
|
+
}
|
387
|
+
|
388
|
+
HTTP_REQUEST_MESSAGE = {
|
389
|
+
'requestMethod' => 'POST',
|
390
|
+
'requestUrl' => 'http://example/',
|
391
|
+
'requestSize' => 210,
|
392
|
+
'status' => 200,
|
393
|
+
'responseSize' => 65,
|
394
|
+
'userAgent' => 'USER AGENT 1.0',
|
395
|
+
'remoteIp' => '55.55.55.55',
|
396
|
+
'referer' => 'http://referer/',
|
397
|
+
'cacheHit' => true,
|
398
|
+
'cacheValidatedWithOriginServer' => true
|
399
|
+
}
|
400
|
+
|
401
|
+
# Tags and their sanitized and encoded version.
|
402
|
+
VALID_TAGS = {
|
403
|
+
'test' => 'test',
|
404
|
+
'germanß' => 'german%C3%9F',
|
405
|
+
'chinese中' => 'chinese%E4%B8%AD',
|
406
|
+
'specialCharacter/_-.' => 'specialCharacter%2F_-.',
|
407
|
+
'abc@&^$*' => 'abc%40%26%5E%24%2A',
|
408
|
+
'@&^$*' => '%40%26%5E%24%2A'
|
409
|
+
}
|
410
|
+
INVALID_TAGS = {
|
411
|
+
# Non-string tags.
|
412
|
+
123 => '123',
|
413
|
+
1.23 => '1.23',
|
414
|
+
[1, 2, 3] => '%5B1%2C%202%2C%203%5D',
|
415
|
+
{ key: 'value' } => '%7B%22key%22%3D%3E%22value%22%7D',
|
416
|
+
# Non-utf8 string tags.
|
417
|
+
"nonutf8#{[0x92].pack('C*')}" => 'nonutf8%20',
|
418
|
+
"abc#{[0x92].pack('C*')}" => 'abc%20',
|
419
|
+
"#{[0x92].pack('C*')}" => '%20',
|
420
|
+
# Empty string tag.
|
421
|
+
'' => '_'
|
422
|
+
}
|
423
|
+
ALL_TAGS = VALID_TAGS.merge(INVALID_TAGS)
|
424
|
+
end
|
@@ -197,6 +197,8 @@ class GoogleCloudOutputTest < Test::Unit::TestCase
|
|
197
197
|
|
198
198
|
private
|
199
199
|
|
200
|
+
WRITE_LOG_ENTRIES_URI = 'https://logging.googleapis.com/v2beta1/entries:write'
|
201
|
+
|
200
202
|
def rename_key(hash, old_key, new_key)
|
201
203
|
hash.merge(new_key => hash[old_key]).reject { |k, _| k == old_key }
|
202
204
|
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.6.
|
4
|
+
version: 0.6.3
|
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: 2017-05-
|
12
|
+
date: 2017-05-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: fluentd
|
@@ -88,6 +88,9 @@ dependencies:
|
|
88
88
|
- - "~>"
|
89
89
|
- !ruby/object:Gem::Version
|
90
90
|
version: '1.0'
|
91
|
+
- - "<"
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '1.3'
|
91
94
|
type: :runtime
|
92
95
|
prerelease: false
|
93
96
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -95,6 +98,9 @@ dependencies:
|
|
95
98
|
- - "~>"
|
96
99
|
- !ruby/object:Gem::Version
|
97
100
|
version: '1.0'
|
101
|
+
- - "<"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '1.3'
|
98
104
|
- !ruby/object:Gem::Dependency
|
99
105
|
name: json
|
100
106
|
requirement: !ruby/object:Gem::Requirement
|
@@ -196,10 +202,12 @@ files:
|
|
196
202
|
- LICENSE
|
197
203
|
- README.rdoc
|
198
204
|
- Rakefile
|
205
|
+
- fluent-plugin-google-cloud-0.6.2.gem
|
199
206
|
- fluent-plugin-google-cloud.gemspec
|
200
207
|
- lib/fluent/plugin/out_google_cloud.rb
|
201
208
|
- test/helper.rb
|
202
209
|
- test/plugin/base_test.rb
|
210
|
+
- test/plugin/constants.rb
|
203
211
|
- test/plugin/data/c31e573fd7f62ed495c9ca3821a5a85cb036dee1-privatekey.p12
|
204
212
|
- test/plugin/data/credentials.json
|
205
213
|
- test/plugin/data/iam-credentials.json
|
@@ -226,13 +234,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
226
234
|
version: '0'
|
227
235
|
requirements: []
|
228
236
|
rubyforge_project:
|
229
|
-
rubygems_version: 2.
|
237
|
+
rubygems_version: 2.6.12
|
230
238
|
signing_key:
|
231
239
|
specification_version: 4
|
232
240
|
summary: fluentd output plugin for the Stackdriver Logging API
|
233
241
|
test_files:
|
234
242
|
- test/helper.rb
|
235
243
|
- test/plugin/base_test.rb
|
244
|
+
- test/plugin/constants.rb
|
236
245
|
- test/plugin/data/c31e573fd7f62ed495c9ca3821a5a85cb036dee1-privatekey.p12
|
237
246
|
- test/plugin/data/credentials.json
|
238
247
|
- test/plugin/data/iam-credentials.json
|