fluent-plugin-google-cloud 0.4.1 → 0.4.2

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.
@@ -1,16 +1,16 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fluent-plugin-google-cloud (0.3.1)
4
+ fluent-plugin-google-cloud (0.4.1)
5
5
  fluentd (>= 0.10)
6
6
  google-api-client (>= 0.8)
7
7
  googleauth (~> 0.4)
8
- json (~> 1.8.3)
8
+ json (~> 1.8.2)
9
9
 
10
10
  GEM
11
11
  remote: https://rubygems.org/
12
12
  specs:
13
- activesupport (4.2.1)
13
+ activesupport (4.2.3)
14
14
  i18n (~> 0.7)
15
15
  json (~> 1.7, >= 1.7.7)
16
16
  minitest (~> 5.1)
@@ -27,7 +27,7 @@ GEM
27
27
  extlib (0.9.16)
28
28
  faraday (0.9.1)
29
29
  multipart-post (>= 1.2, < 3)
30
- fluentd (0.12.11)
30
+ fluentd (0.12.12)
31
31
  cool.io (>= 1.2.2, < 2.0.0)
32
32
  http_parser.rb (>= 0.5.1, < 0.7.0)
33
33
  json (>= 1.4.3)
@@ -58,7 +58,7 @@ GEM
58
58
  http_parser.rb (0.6.0)
59
59
  i18n (0.7.0)
60
60
  json (1.8.3)
61
- jwt (1.5.0)
61
+ jwt (1.5.1)
62
62
  launchy (2.4.3)
63
63
  addressable (~> 2.3)
64
64
  little-plugger (1.1.3)
@@ -90,7 +90,7 @@ GEM
90
90
  thread_safe (0.3.5)
91
91
  tzinfo (1.2.2)
92
92
  thread_safe (~> 0.1)
93
- tzinfo-data (1.2015.4)
93
+ tzinfo-data (1.2015.5)
94
94
  tzinfo (>= 1.0.0)
95
95
  webmock (1.21.0)
96
96
  addressable (>= 2.3.6)
@@ -106,3 +106,6 @@ DEPENDENCIES
106
106
  rake (>= 10.3.2)
107
107
  test-unit (~> 3.0.2)
108
108
  webmock (>= 1.17.0)
109
+
110
+ BUNDLED WITH
111
+ 1.10.5
@@ -4,7 +4,7 @@ Gem::Specification.new do |gem|
4
4
  gem.summary = %q{Fluentd plugin to stream logs to the Google Cloud Platform's logging API}
5
5
  gem.homepage = 'https://github.com/GoogleCloudPlatform/fluent-plugin-google-cloud'
6
6
  gem.license = 'Apache 2.0'
7
- gem.version = '0.4.1'
7
+ gem.version = '0.4.2'
8
8
  gem.authors = ['Todd Derr', 'Alex Robinson']
9
9
  gem.email = ['salty@google.com']
10
10
 
@@ -54,6 +54,26 @@ module Fluent
54
54
  config_param :zone, :string, :default => nil
55
55
  config_param :vm_id, :string, :default => nil
56
56
 
57
+ # label_map (specified as a JSON object) is an unordered set of fluent
58
+ # field names whose values are sent as labels rather than as part of the
59
+ # struct payload.
60
+ #
61
+ # Each entry in the map is a {"field_name": "label_name"} pair. When
62
+ # the "field_name" (as parsed by the input plugin) is encountered, a label
63
+ # with the corresponding "label_name" is added to the log entry. The
64
+ # value of the field is used as the value of the label.
65
+ #
66
+ # The map gives the user additional flexibility in specifying label
67
+ # names, including the ability to use characters which would not be
68
+ # legal as part of fluent field names.
69
+ #
70
+ # Example:
71
+ # label_map {
72
+ # "field_name_1": "sent_label_name_1",
73
+ # "field_name_2": "some.prefix/sent_label_name_2"
74
+ # }
75
+ config_param :label_map, :hash, :default => nil
76
+
57
77
  # TODO: Add a log_name config option rather than just using the tag?
58
78
 
59
79
  # Expose attr_readers to make testing of metadata more direct than only
@@ -222,8 +242,9 @@ module Fluent
222
242
  'entries' => [],
223
243
  }
224
244
  arr.each do |time, record|
225
- next unless record.is_a? Hash
245
+ next unless record.is_a?(Hash)
226
246
  if (record.has_key?('timestamp') &&
247
+ record['timestamp'].is_a?(Hash) &&
227
248
  record['timestamp'].has_key?('seconds') &&
228
249
  record['timestamp'].has_key?('nanos'))
229
250
  ts_secs = record['timestamp']['seconds']
@@ -270,6 +291,22 @@ module Fluent
270
291
  entry['metadata']['severity'] = 'DEFAULT'
271
292
  end
272
293
 
294
+ # If a field is present in the label_map, send its value as a label
295
+ # (mapping the field name to label name as specified in the config)
296
+ # and do not send that field as part of the payload.
297
+ if !label_map.nil?
298
+ labels = {}
299
+ @label_map.each do |field, label|
300
+ if record.has_key?(field)
301
+ labels[label] = record[field]
302
+ record.delete(field)
303
+ end
304
+ end
305
+ if !labels.empty?
306
+ entry['metadata']['labels'] = labels
307
+ end
308
+ end
309
+
273
310
  # use textPayload if the only remainaing key is 'message',
274
311
  # otherwise use a struct.
275
312
  if (record.size == 1 && record.has_key?('message'))
@@ -461,7 +498,7 @@ module Fluent
461
498
  def init_api_client
462
499
  @client = Google::APIClient.new(
463
500
  :application_name => 'Fluentd Google Cloud Logging plugin',
464
- :application_version => '0.4.1',
501
+ :application_version => '0.4.2',
465
502
  :retries => 1)
466
503
 
467
504
  if @auth_method == 'private_key'
@@ -165,7 +165,7 @@ class GoogleCloudOutputTest < Test::Unit::TestCase
165
165
 
166
166
  def create_driver(conf=APPLICATION_DEFAULT_CONFIG)
167
167
  Fluent::Test::BufferedOutputTestDriver.new(
168
- Fluent::GoogleCloudOutput).configure(conf)
168
+ Fluent::GoogleCloudOutput).configure(conf, use_v1_config: true)
169
169
  end
170
170
 
171
171
  def test_configure_service_account_application_default
@@ -459,6 +459,20 @@ class GoogleCloudOutputTest < Test::Unit::TestCase
459
459
  end
460
460
  end
461
461
 
462
+ def test_malformed_timestamp
463
+ setup_gce_metadata_stubs
464
+ setup_logging_stubs
465
+ d = create_driver()
466
+ # if timestamp is not a hash it is passed through to the struct payload.
467
+ d.emit({'message' => log_entry(0), 'timestamp' => 'not-a-hash'})
468
+ d.run
469
+ verify_index = 0
470
+ verify_log_entries(1, COMPUTE_PARAMS, 'structPayload') do |entry|
471
+ assert_equal 2, entry['structPayload'].size, entry
472
+ assert_equal "not-a-hash", entry['structPayload']['timestamp'], entry
473
+ end
474
+ end
475
+
462
476
  def test_severities
463
477
  setup_gce_metadata_stubs
464
478
  setup_logging_stubs
@@ -481,6 +495,59 @@ class GoogleCloudOutputTest < Test::Unit::TestCase
481
495
  end
482
496
  end
483
497
 
498
+ def test_label_map_without_field_present
499
+ setup_gce_metadata_stubs
500
+ setup_logging_stubs
501
+ config = %[label_map { "label_field": "sent_label" }]
502
+ d = create_driver(config)
503
+ d.emit({'message' => log_entry(0)})
504
+ d.run
505
+ # No additional labels should be present
506
+ verify_log_entries(1, COMPUTE_PARAMS)
507
+ end
508
+
509
+ def test_label_map_with_field_present
510
+ setup_gce_metadata_stubs
511
+ setup_logging_stubs
512
+ config = %[label_map { "label_field": "sent_label" }]
513
+ d = create_driver(config)
514
+ d.emit({'message' => log_entry(0), 'label_field' => 'label_value'})
515
+ d.run
516
+ # make a deep copy of COMPUTE_PARAMS and add the parsed label.
517
+ params = Marshal.load(Marshal.dump(COMPUTE_PARAMS))
518
+ params['labels']['sent_label'] = 'label_value'
519
+ verify_log_entries(1, params)
520
+ end
521
+
522
+ def test_label_map_with_multiple_fields
523
+ setup_gce_metadata_stubs
524
+ setup_logging_stubs
525
+ config = %[
526
+ label_map {
527
+ "label1": "sent_label_1",
528
+ "label_number_two": "foo.googleapis.com/bar",
529
+ "label3": "label3"
530
+ }]
531
+ d = create_driver(config)
532
+ # not_a_label passes through to the struct payload
533
+ d.emit({'message' => log_entry(0),
534
+ 'label1' => 'value1',
535
+ 'label_number_two' => 'value2',
536
+ 'not_a_label' => 'value4',
537
+ 'label3' => 'value3'})
538
+ d.run
539
+ # make a deep copy of COMPUTE_PARAMS and add the parsed labels.
540
+ params = Marshal.load(Marshal.dump(COMPUTE_PARAMS))
541
+ params['labels']['sent_label_1'] = 'value1'
542
+ params['labels']['foo.googleapis.com/bar'] = 'value2'
543
+ params['labels']['label3'] = 'value3'
544
+ verify_log_entries(1, params, 'structPayload') do |entry|
545
+ assert_equal 2, entry['structPayload'].size, entry
546
+ assert_equal "test log entry 0", entry['structPayload']['message'], entry
547
+ assert_equal 'value4', entry['structPayload']['not_a_label'], entry
548
+ end
549
+ end
550
+
484
551
  def test_multiple_logs
485
552
  setup_gce_metadata_stubs
486
553
  setup_logging_stubs
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.1
4
+ version: 0.4.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2015-06-11 00:00:00.000000000 Z
13
+ date: 2015-07-08 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: fluentd
@@ -194,3 +194,4 @@ test_files:
194
194
  - test/plugin/data/credentials.json
195
195
  - test/plugin/data/invalid_credentials.json
196
196
  - test/plugin/test_out_google_cloud.rb
197
+ has_rdoc: