fluent-plugin-google-cloud 0.6.25.1 → 0.7.0.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.
@@ -98,14 +98,6 @@ module Constants
98
98
  MANAGED_VM_BACKEND_NAME = 'default'.freeze
99
99
  MANAGED_VM_BACKEND_VERSION = 'guestbook2.0'.freeze
100
100
 
101
- # LogEntry fields for extraction.
102
- TRACE = 'projects/proj1/traces/1234567890abcdef1234567890abcdef'.freeze
103
- TRACE2 = 'projects/proj1/traces/1234567890abcdef1234567890fedcba'.freeze
104
- SPAN_ID = '000000000000004a'.freeze
105
- SPAN_ID2 = '000000000000007e'.freeze
106
- INSERT_ID = 'fah7yr7iw64tg857y'.freeze
107
- INSERT_ID2 = 'fah7yr7iw64tgaeuf'.freeze
108
-
109
101
  # Docker Container labels.
110
102
  DOCKER_CONTAINER_ID =
111
103
  '0d0f03ff8d3c42688692536d1af77a28cd135c0a5c531f25a31'.freeze
@@ -143,11 +135,20 @@ module Constants
143
135
  ".#{K8S_CONTAINER_NAME}".freeze
144
136
 
145
137
  # Container Engine / Kubernetes specific labels.
138
+ CONTAINER_CLUSTER_NAME = 'cluster-1'.freeze
146
139
  CONTAINER_NAMESPACE_ID = '898268c8-4a36-11e5-9d81-42010af0194c'.freeze
140
+ CONTAINER_NAMESPACE_NAME = 'kube-system'.freeze
147
141
  CONTAINER_POD_ID = 'cad3c3c4-4b9c-11e5-9d81-42010af0194c'.freeze
142
+ CONTAINER_POD_NAME = 'redis-master-c0l82.foo.bar'.freeze
143
+ CONTAINER_CONTAINER_NAME = 'redis'.freeze
148
144
  CONTAINER_LABEL_KEY = 'component'.freeze
149
145
  CONTAINER_LABEL_VALUE = 'redis-component'.freeze
146
+ CONTAINER_STREAM = 'stdout'.freeze
150
147
  CONTAINER_SEVERITY = 'INFO'.freeze
148
+ # Timestamp for 1234567890 seconds and 987654321 nanoseconds since epoch.
149
+ CONTAINER_TIMESTAMP = '2009-02-13T23:31:30.987654321Z'.freeze
150
+ CONTAINER_SECONDS_EPOCH = 1_234_567_890
151
+ CONTAINER_NANOS = 987_654_321
151
152
  CONTAINER_LOCAL_RESOURCE_ID_PREFIX = 'gke_container'.freeze
152
153
 
153
154
  # Cloud Functions specific labels.
@@ -399,27 +400,28 @@ module Constants
399
400
 
400
401
  # GKE Container.
401
402
  CONTAINER_TAG =
402
- "kubernetes.#{K8S_POD_NAME}_#{K8S_NAMESPACE_NAME}_" \
403
- "#{K8S_CONTAINER_NAME}".freeze
403
+ "kubernetes.#{CONTAINER_POD_NAME}_#{CONTAINER_NAMESPACE_NAME}_" \
404
+ "#{CONTAINER_CONTAINER_NAME}".freeze
404
405
 
405
406
  CONTAINER_FROM_METADATA_PARAMS = {
406
407
  resource: {
407
408
  type: GKE_CONSTANTS[:resource_type],
408
409
  labels: {
409
- 'cluster_name' => K8S_CLUSTER_NAME,
410
+ 'cluster_name' => CONTAINER_CLUSTER_NAME,
410
411
  'namespace_id' => CONTAINER_NAMESPACE_ID,
411
412
  'instance_id' => VM_ID,
412
413
  'pod_id' => CONTAINER_POD_ID,
413
- 'container_name' => K8S_CONTAINER_NAME,
414
+ 'container_name' => CONTAINER_CONTAINER_NAME,
414
415
  'zone' => ZONE
415
416
  }
416
417
  },
417
- log_name: K8S_CONTAINER_NAME,
418
+ log_name: CONTAINER_CONTAINER_NAME,
418
419
  project_id: PROJECT_ID,
419
420
  labels: {
420
- "#{GKE_CONSTANTS[:service]}/namespace_name" => K8S_NAMESPACE_NAME,
421
- "#{GKE_CONSTANTS[:service]}/pod_name" => K8S_POD_NAME,
422
- "#{GKE_CONSTANTS[:service]}/stream" => K8S_STREAM,
421
+ "#{GKE_CONSTANTS[:service]}/namespace_name" =>
422
+ CONTAINER_NAMESPACE_NAME,
423
+ "#{GKE_CONSTANTS[:service]}/pod_name" => CONTAINER_POD_NAME,
424
+ "#{GKE_CONSTANTS[:service]}/stream" => CONTAINER_STREAM,
423
425
  "label/#{CONTAINER_LABEL_KEY}" => CONTAINER_LABEL_VALUE,
424
426
  "#{COMPUTE_CONSTANTS[:service]}/resource_name" => HOSTNAME
425
427
  }
@@ -431,20 +433,21 @@ module Constants
431
433
  resource: {
432
434
  type: GKE_CONSTANTS[:resource_type],
433
435
  labels: {
434
- 'cluster_name' => K8S_CLUSTER_NAME,
435
- 'namespace_id' => K8S_NAMESPACE_NAME,
436
+ 'cluster_name' => CONTAINER_CLUSTER_NAME,
437
+ 'namespace_id' => CONTAINER_NAMESPACE_NAME,
436
438
  'instance_id' => VM_ID,
437
- 'pod_id' => K8S_POD_NAME,
438
- 'container_name' => K8S_CONTAINER_NAME,
439
+ 'pod_id' => CONTAINER_POD_NAME,
440
+ 'container_name' => CONTAINER_CONTAINER_NAME,
439
441
  'zone' => ZONE
440
442
  }
441
443
  },
442
- log_name: K8S_CONTAINER_NAME,
444
+ log_name: CONTAINER_CONTAINER_NAME,
443
445
  project_id: PROJECT_ID,
444
446
  labels: {
445
- "#{GKE_CONSTANTS[:service]}/namespace_name" => K8S_NAMESPACE_NAME,
446
- "#{GKE_CONSTANTS[:service]}/pod_name" => K8S_POD_NAME,
447
- "#{GKE_CONSTANTS[:service]}/stream" => K8S_STREAM,
447
+ "#{GKE_CONSTANTS[:service]}/namespace_name" =>
448
+ CONTAINER_NAMESPACE_NAME,
449
+ "#{GKE_CONSTANTS[:service]}/pod_name" => CONTAINER_POD_NAME,
450
+ "#{GKE_CONSTANTS[:service]}/stream" => CONTAINER_STREAM,
448
451
  "#{COMPUTE_CONSTANTS[:service]}/resource_name" => HOSTNAME
449
452
  }
450
453
  }.freeze
@@ -453,11 +456,11 @@ module Constants
453
456
  resource: {
454
457
  type: GKE_CONSTANTS[:resource_type],
455
458
  labels: {
456
- 'cluster_name' => K8S_CLUSTER_NAME,
459
+ 'cluster_name' => CONTAINER_CLUSTER_NAME,
457
460
  'namespace_id' => CONTAINER_NAMESPACE_ID,
458
461
  'instance_id' => VM_ID,
459
462
  'pod_id' => CONTAINER_POD_ID,
460
- 'container_name' => K8S_CONTAINER_NAME,
463
+ 'container_name' => CONTAINER_CONTAINER_NAME,
461
464
  'zone' => ZONE
462
465
  }
463
466
  },
@@ -480,6 +483,7 @@ module Constants
480
483
  'location' => K8S_LOCATION
481
484
  }
482
485
  },
486
+ log_name: 'test',
483
487
  project_id: PROJECT_ID,
484
488
  labels: {}
485
489
  }.freeze
@@ -498,10 +502,6 @@ module Constants
498
502
  )
499
503
  )
500
504
  ).freeze
501
- # Used in k8s fallback tests.
502
- K8S_CONTAINER_PARAMS_FROM_FALLBACK = COMPUTE_PARAMS_NO_LOG_NAME.merge(
503
- log_name: CONTAINER_TAG
504
- ).freeze
505
505
 
506
506
  # K8s Node.
507
507
  K8S_NODE_PARAMS = {
@@ -777,12 +777,12 @@ module Constants
777
777
  }.to_json,
778
778
  # GKE container logs.
779
779
  "#{CONTAINER_LOCAL_RESOURCE_ID_PREFIX}.#{CONTAINER_NAMESPACE_ID}" \
780
- ".#{K8S_POD_NAME}.#{K8S_CONTAINER_NAME}" =>
780
+ ".#{CONTAINER_POD_NAME}.#{CONTAINER_CONTAINER_NAME}" =>
781
781
  {
782
782
  'type' => GKE_CONSTANTS[:resource_type],
783
783
  'labels' => {
784
- 'cluster_name' => K8S_CLUSTER_NAME,
785
- 'container_name' => K8S_CONTAINER_NAME,
784
+ 'cluster_name' => CONTAINER_CLUSTER_NAME,
785
+ 'container_name' => CONTAINER_CONTAINER_NAME,
786
786
  'instance_id' => VM_ID,
787
787
  'namespace_id' => CONTAINER_NAMESPACE_ID,
788
788
  'pod_id' => CONTAINER_POD_ID,
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-google-cloud
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.25.1
4
+ version: 0.7.0.pre.1
5
5
  platform: ruby
6
6
  authors:
7
- - Stackdriver Agents Team
7
+ - Ling Huang
8
+ - Igor Peshansky
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2018-09-13 00:00:00.000000000 Z
12
+ date: 2018-08-24 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: fluentd
@@ -16,14 +17,14 @@ dependencies:
16
17
  requirements:
17
18
  - - "~>"
18
19
  - !ruby/object:Gem::Version
19
- version: '0.10'
20
+ version: 1.2.5
20
21
  type: :runtime
21
22
  prerelease: false
22
23
  version_requirements: !ruby/object:Gem::Requirement
23
24
  requirements:
24
25
  - - "~>"
25
26
  - !ruby/object:Gem::Version
26
- version: '0.10'
27
+ version: 1.2.5
27
28
  - !ruby/object:Gem::Dependency
28
29
  name: googleapis-common-protos
29
30
  requirement: !ruby/object:Gem::Requirement
@@ -106,14 +107,14 @@ dependencies:
106
107
  requirements:
107
108
  - - "~>"
108
109
  - !ruby/object:Gem::Version
109
- version: '2.1'
110
+ version: '1.8'
110
111
  type: :runtime
111
112
  prerelease: false
112
113
  version_requirements: !ruby/object:Gem::Requirement
113
114
  requirements:
114
115
  - - "~>"
115
116
  - !ruby/object:Gem::Version
116
- version: '2.1'
117
+ version: '1.8'
117
118
  - !ruby/object:Gem::Dependency
118
119
  name: google-protobuf
119
120
  requirement: !ruby/object:Gem::Requirement
@@ -219,9 +220,9 @@ dependencies:
219
220
  - !ruby/object:Gem::Version
220
221
  version: 0.7.1
221
222
  description: |2
222
- Fluentd plugins for the Stackdriver Logging API, which will make logs
223
- viewable in the Stackdriver Logs Viewer and can optionally store them
224
- in Google Cloud Storage and/or BigQuery.
223
+ Fluentd output plugin for the Stackdriver Logging API, which will make
224
+ logs viewable in the Developer Console's log viewer and can optionally
225
+ store them in Google Cloud Storage and/or BigQuery.
225
226
  This is an official Google Ruby gem.
226
227
  email:
227
228
  - stackdriver-agents@google.com
@@ -235,7 +236,6 @@ files:
235
236
  - README.rdoc
236
237
  - Rakefile
237
238
  - fluent-plugin-google-cloud.gemspec
238
- - lib/fluent/plugin/filter_add_insert_ids.rb
239
239
  - lib/fluent/plugin/monitoring.rb
240
240
  - lib/fluent/plugin/out_google_cloud.rb
241
241
  - test/helper.rb
@@ -247,7 +247,6 @@ files:
247
247
  - test/plugin/data/invalid_credentials.json
248
248
  - test/plugin/data/new-style-credentials.json
249
249
  - test/plugin/test_driver.rb
250
- - test/plugin/test_filter_add_insert_ids.rb
251
250
  - test/plugin/test_out_google_cloud.rb
252
251
  - test/plugin/test_out_google_cloud_grpc.rb
253
252
  homepage: https://github.com/GoogleCloudPlatform/fluent-plugin-google-cloud
@@ -265,15 +264,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
265
264
  version: '2.2'
266
265
  required_rubygems_version: !ruby/object:Gem::Requirement
267
266
  requirements:
268
- - - ">="
267
+ - - ">"
269
268
  - !ruby/object:Gem::Version
270
- version: '0'
269
+ version: 1.3.1
271
270
  requirements: []
272
271
  rubyforge_project:
273
272
  rubygems_version: 2.6.14
274
273
  signing_key:
275
274
  specification_version: 4
276
- summary: fluentd plugins for the Stackdriver Logging API
275
+ summary: fluentd output plugin for the Stackdriver Logging API
277
276
  test_files:
278
277
  - test/helper.rb
279
278
  - test/plugin/base_test.rb
@@ -284,6 +283,5 @@ test_files:
284
283
  - test/plugin/data/invalid_credentials.json
285
284
  - test/plugin/data/new-style-credentials.json
286
285
  - test/plugin/test_driver.rb
287
- - test/plugin/test_filter_add_insert_ids.rb
288
286
  - test/plugin/test_out_google_cloud.rb
289
287
  - test/plugin/test_out_google_cloud_grpc.rb
@@ -1,99 +0,0 @@
1
- # Copyright 2018 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
- module Fluent
16
- # Fluentd filter plugin for adding insertIds to guarantee log entry order
17
- # and uniqueness.
18
- # Sample log entries enriched by this plugin:
19
- # {
20
- # "timestamp": "2017-08-22 13:35:28",
21
- # "message": "1",
22
- # "logging.googleapis.com/insertId": "aye7eakuf23h41aef0"
23
- # }
24
- # {
25
- # "timestamp": "2017-08-22 13:35:28",
26
- # "message": "2",
27
- # "logging.googleapis.com/insertId": "aye7eakuf23h41aef1"
28
- # }
29
- # {
30
- # "timestamp": "2017-08-22 13:35:28",
31
- # "message": "3",
32
- # "logging.googleapis.com/insertId": "aye7eakuf23h41aef2"
33
- # }
34
- class AddInsertIdsFilter < Filter
35
- Fluent::Plugin.register_filter('add_insert_ids', self)
36
-
37
- # Constants for configuration.
38
- module ConfigConstants
39
- # The default field name of insertIds in the log entry.
40
- DEFAULT_INSERT_ID_KEY = 'logging.googleapis.com/insertId'.freeze
41
- # The character size of the insertIds. This matches the setup in the
42
- # Stackdriver Logging backend.
43
- INSERT_ID_SIZE = 17
44
- # The characters that are allowed in the insertIds. This matches the
45
- # allowed collection by the Stackdriver Logging Backend.
46
- ALLOWED_CHARS = (Array(0..9) + Array('a'..'z')).freeze
47
- end
48
-
49
- include self::ConfigConstants
50
-
51
- desc 'The field name for insertIds in the log record.'
52
- config_param :insert_id_key, :string, default: DEFAULT_INSERT_ID_KEY
53
-
54
- # Expose attr_readers for testing.
55
- attr_reader :insert_id_key
56
-
57
- def start
58
- super
59
- @log = $log # rubocop:disable Style/GlobalVars
60
-
61
- # Initialize the insertID.
62
- @log.info "Started the add_insert_ids plugin with #{@insert_id_key}" \
63
- ' as the insert ID key.'
64
- @insert_id = generate_initial_insert_id
65
- @log.info "Initialized the insert ID key to #{@insert_id}."
66
- end
67
-
68
- def configure(conf)
69
- super
70
- end
71
-
72
- def shutdown
73
- super
74
- end
75
-
76
- # rubocop:disable Style/UnusedMethodArgument
77
- def filter(tag, time, record)
78
- # Only generate and add an insertId field if the record is a hash and
79
- # the insert ID field is not already set (or set to an empty string).
80
- if record.is_a?(Hash) && record[@insert_id_key].to_s.empty?
81
- record[@insert_id_key] = increment_insert_id
82
- end
83
- record
84
- end
85
- # rubocop:enable Style/UnusedMethodArgument
86
-
87
- private
88
-
89
- # Generate a random string as the initial insertId.
90
- def generate_initial_insert_id
91
- Array.new(INSERT_ID_SIZE) { ALLOWED_CHARS.sample }.join
92
- end
93
-
94
- # Increment the insertId and return the new value.
95
- def increment_insert_id
96
- @insert_id = @insert_id.next
97
- end
98
- end
99
- end
@@ -1,135 +0,0 @@
1
- # Copyright 2018 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
- require_relative '../helper'
16
-
17
- require 'fluent/test/driver/filter'
18
- require 'fluent/plugin/filter_add_insert_ids'
19
-
20
- # Unit tests for filter_add_insert_ids plugin.
21
- class FilterAddInsertIdsTest < Test::Unit::TestCase
22
- include Fluent::AddInsertIdsFilter::ConfigConstants
23
-
24
- CUSTOM_INSERT_ID_KEY = 'custom_insert_id_key'.freeze
25
- INSERT_ID = 'aeyr82r92h249gh9h'.freeze
26
- TEST_MESSAGE = 'test message for add_insert_ids plugin.'.freeze
27
- APPLICATION_DEFAULT_CONFIG = ''.freeze
28
- INSERT_ID_KEY_CONFIG = %(
29
- insert_id_key #{CUSTOM_INSERT_ID_KEY}
30
- ).freeze
31
-
32
- def setup
33
- Fluent::Test.setup
34
- end
35
-
36
- def test_configure_insert_id_key
37
- {
38
- APPLICATION_DEFAULT_CONFIG => DEFAULT_INSERT_ID_KEY,
39
- INSERT_ID_KEY_CONFIG => CUSTOM_INSERT_ID_KEY
40
- }.each do |config, insert_id_key|
41
- d = create_driver(config)
42
- assert_equal insert_id_key, d.instance.insert_id_key
43
- end
44
- end
45
-
46
- def test_add_insert_ids
47
- total_entry_count = 1000
48
- d = create_driver
49
- d.run do
50
- total_entry_count.times do |index|
51
- d.emit(log_entry(index))
52
- end
53
- end
54
- filtered_events = d.filtered_as_array
55
-
56
- assert_equal total_entry_count, filtered_events.size,
57
- "#{total_entry_count} log entries after filtering is" \
58
- " expected. Only #{filtered_events.size} are detected."
59
- # The expected insertId will be assigned as we scan the first log entry.
60
- expected_insert_id = nil
61
- unique_insert_ids = Set.new
62
- filtered_events.each_with_index do |event, index|
63
- assert_equal 3, event.size, "Index #{index} failed. Log event should" \
64
- ' include 3 elements: tag, time and record.'
65
- record = event[2]
66
- assert_true record.is_a?(Hash), "Index #{index} failed. Log record" \
67
- " #{record} should be a hash."
68
- assert_equal index, record['id'], "Index #{index} failed. Log entries" \
69
- ' should come in order.'
70
- assert_equal TEST_MESSAGE, record['message'], "Index #{index} failed."
71
-
72
- # Get the first insertID.
73
- expected_insert_id = record[DEFAULT_INSERT_ID_KEY] if index == 0
74
- insert_id = record[DEFAULT_INSERT_ID_KEY]
75
- assert_equal expected_insert_id, insert_id, "Index #{index} failed."
76
- expected_insert_id = expected_insert_id.next
77
- assert_true insert_id < expected_insert_id,
78
- "Index #{index} failed. #{insert_id}" \
79
- " < #{expected_insert_id} is false."
80
- unique_insert_ids << insert_id
81
- end
82
- assert_equal total_entry_count, unique_insert_ids.size,
83
- "Expected #{total_entry_count} unique insertIds." \
84
- " Only #{unique_insert_ids.size} found."
85
- end
86
-
87
- def test_insert_ids_not_added_if_present
88
- log_entry_with_empty_insert_id = log_entry(0).merge(
89
- DEFAULT_INSERT_ID_KEY => '')
90
- {
91
- log_entry(0).merge(DEFAULT_INSERT_ID_KEY => INSERT_ID) => true,
92
- # Still generate insertId if it's an empty string
93
- log_entry_with_empty_insert_id => false
94
- }.each do |test_data|
95
- input_log_entry, retain_original_insert_id = test_data
96
- # Make a copy because the log entry gets modified by the filter plugin.
97
- log_entry = input_log_entry.dup
98
- d = create_driver
99
- d.run do
100
- d.emit(log_entry)
101
- end
102
- filtered_events = d.filtered_as_array
103
-
104
- assert_equal 1, filtered_events.size, 'Exact 1 log entry after' \
105
- " filtering is expected. Test data: #{test_data}."
106
- event = filtered_events[0]
107
- assert_equal 3, event.size, 'Log event should include 3 elements: tag,' \
108
- " time and record. Test data: #{test_data}."
109
- record = event[2]
110
- assert_true record.is_a?(Hash), "Log record #{record} should be a hash." \
111
- " Test data: #{test_data}."
112
- assert_equal 0, record['id'], "Test data: #{test_data}."
113
- assert_equal TEST_MESSAGE, record['message'], "Test data: #{test_data}."
114
- insert_id = record[DEFAULT_INSERT_ID_KEY]
115
- assert_false insert_id.to_s.empty?, 'Insert ID should not be empty.' \
116
- " Test data: #{test_data}."
117
- assert_equal retain_original_insert_id,
118
- input_log_entry[DEFAULT_INSERT_ID_KEY] == insert_id,
119
- "Input value is #{input_log_entry[DEFAULT_INSERT_ID_KEY]}." \
120
- " Output value is #{insert_id}. Test data: #{test_data}."
121
- end
122
- end
123
-
124
- def create_driver(conf = APPLICATION_DEFAULT_CONFIG)
125
- Fluent::Test::FilterTestDriver.new(
126
- Fluent::AddInsertIdsFilter).configure(conf, true)
127
- end
128
-
129
- def log_entry(index)
130
- {
131
- 'id' => index,
132
- 'message' => TEST_MESSAGE
133
- }
134
- end
135
- end