fluent-plugin-kubernetes_metadata_filter 2.8.1 → 2.9.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 71fd60517a92c89e8c35bc91a3147487ff0637ae41378ecf82b047424cdb203f
4
- data.tar.gz: 310b9a7bbb7e5bd59d1aa3deedb699114f561295b4b3a97fdf54fadcf6d7ee08
3
+ metadata.gz: 1637f0d5dc3b0962bea8bb25f8cda869044b45fd33d27fee1ef7a58d2c403f4c
4
+ data.tar.gz: 0bf235def6a0eab1ff766617b704bd3b637403ad88d568c8d087352473a24dc0
5
5
  SHA512:
6
- metadata.gz: 76ccb8d8b2a2d26ca1e2823a93c38fef974e76526f402f11a10c8ea4697cbda765370eb202177490e9a4aadb10fef4f9980ba4e38cb39953c55ae3bf49ac3bf4
7
- data.tar.gz: 8ea9696e6df02bf264a7f0e68ab36732adae9a007379e6bbd841633b6ad6dd830d9241a30bdcd0744183151898fdcc71711be14656973a47d8afa7a1f273abb1
6
+ metadata.gz: 5f31264c9339108f83573e9566ec2f93630afa7c64d4f00a996431925e487a5c74575603183072c10803defac132ef066ef0ec021ad37446e358cef4cad0a05e
7
+ data.tar.gz: ca81025a46a85d4e87feededf0f9ef2c8047cd3a8b84b75a71baf16feabc364ca69ce4ed69f3f796dbd1542bc602799dac53f87bbb9e7df980a99e4872c7955f
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fluent-plugin-kubernetes_metadata_filter (2.8.1)
4
+ fluent-plugin-kubernetes_metadata_filter (2.9.0)
5
5
  fluentd (>= 0.14.0, < 1.15)
6
6
  kubeclient (>= 4.0.0, < 5.0.0)
7
7
  lru_redux
data/README.md CHANGED
@@ -45,8 +45,10 @@ This must used named capture groups for `container_name`, `pod_name` & `namespac
45
45
  * `cache_size` - size of the cache of Kubernetes metadata to reduce requests to the API server (default: `1000`)
46
46
  * `cache_ttl` - TTL in seconds of each cached element. Set to negative value to disable TTL eviction (default: `3600` - 1 hour)
47
47
  * `watch` - set up a watch on pods on the API server for updates to metadata (default: `true`)
48
- * `de_dot` - replace dots in labels and annotations with configured `de_dot_separator`, required for ElasticSearch 2.x compatibility (default: `true`)
48
+ * `de_dot` - replace dots in labels and annotations with configured `de_dot_separator`, required for Datadog and ElasticSearch 2.x compatibility (default: `true`)
49
49
  * `de_dot_separator` - separator to use if `de_dot` is enabled (default: `_`)
50
+ * `de_slash` - replace slashes in labels and annotations with configured `de_slash_separator`, required for Datadog compatibility (default: `false`)
51
+ * `de_slash_separator` - separator to use if `de_slash` is enabled (default: `__`)
50
52
  * *DEPRECATED* `use_journal` - If false, messages are expected to be formatted and tagged as if read by the fluentd in\_tail plugin with wildcard filename. If true, messages are expected to be formatted as if read from the systemd journal. The `MESSAGE` field has the full message. The `CONTAINER_NAME` field has the encoded k8s metadata (see below). The `CONTAINER_ID_FULL` field has the full container uuid. This requires docker to use the `--log-driver=journald` log driver. If unset (the default), the plugin will use the `CONTAINER_NAME` and `CONTAINER_ID_FULL` fields
51
53
  if available, otherwise, will use the tag in the `tag_to_kubernetes_name_regexp` format.
52
54
  * `container_name_to_kubernetes_regexp` - The regular expression used to extract the k8s metadata encoded in the journal `CONTAINER_NAME` field default: See [code](https://github.com/fabric8io/fluent-plugin-kubernetes_metadata_filter/blob/master/lib/fluent/plugin/filter_kubernetes_metadata.rb#L68)
@@ -5,7 +5,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
 
6
6
  Gem::Specification.new do |gem|
7
7
  gem.name = 'fluent-plugin-kubernetes_metadata_filter'
8
- gem.version = '2.8.1'
8
+ gem.version = '2.9.0'
9
9
  gem.authors = ['Jimmi Dyson']
10
10
  gem.email = ['jimmidyson@gmail.com']
11
11
  gem.description = 'Filter plugin to add Kubernetes metadata'
@@ -58,6 +58,8 @@ module Fluent::Plugin
58
58
  config_param :secret_dir, :string, default: '/var/run/secrets/kubernetes.io/serviceaccount'
59
59
  config_param :de_dot, :bool, default: true
60
60
  config_param :de_dot_separator, :string, default: '_'
61
+ config_param :de_slash, :bool, default: false
62
+ config_param :de_slash_separator, :string, default: '__'
61
63
  # if reading from the journal, the record will contain the following fields in the following
62
64
  # format:
63
65
  # CONTAINER_NAME=k8s_$containername.$containerhash_$podname_$namespacename_$poduuid_$rand32bitashex
@@ -166,6 +168,10 @@ module Fluent::Plugin
166
168
  raise Fluent::ConfigError, "Invalid de_dot_separator: cannot be or contain '.'"
167
169
  end
168
170
 
171
+ if @de_slash && @de_slash_separator.include?('/')
172
+ raise Fluent::ConfigError, "Invalid de_slash_separator: cannot be or contain '/'"
173
+ end
174
+
169
175
  if @cache_ttl < 0
170
176
  log.info 'Setting the cache TTL to :none because it was <= 0'
171
177
  @cache_ttl = :none
@@ -381,6 +387,16 @@ module Fluent::Plugin
381
387
  end
382
388
  end
383
389
 
390
+ def de_slash!(h)
391
+ h.keys.each do |ref|
392
+ next unless h[ref] && ref =~ /\//
393
+
394
+ v = h.delete(ref)
395
+ newref = ref.to_s.gsub('/', @de_slash_separator)
396
+ h[newref] = v
397
+ end
398
+ end
399
+
384
400
  # copied from activesupport
385
401
  def present?(object)
386
402
  object.respond_to?(:empty?) ? !object.empty? : !!object
@@ -47,6 +47,10 @@ module KubernetesMetadata
47
47
  de_dot!(labels) unless @skip_labels
48
48
  de_dot!(annotations)
49
49
  end
50
+ if @de_slash
51
+ de_slash!(labels) unless @skip_labels
52
+ de_slash!(annotations)
53
+ end
50
54
  kubernetes_metadata = {
51
55
  'namespace_id' => namespace_object[:metadata][:uid],
52
56
  'creation_timestamp' => namespace_object[:metadata][:creationTimestamp]
@@ -65,6 +69,10 @@ module KubernetesMetadata
65
69
  de_dot!(labels) unless @skip_labels
66
70
  de_dot!(annotations)
67
71
  end
72
+ if @de_slash
73
+ de_slash!(labels) unless @skip_labels
74
+ de_slash!(annotations)
75
+ end
68
76
 
69
77
  # collect container information
70
78
  container_meta = {}
@@ -432,13 +432,15 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
432
432
  assert_equal(msg, filtered[0])
433
433
  end
434
434
 
435
- test 'with kubernetes dotted labels, de_dot enabled' do
435
+ test 'with kubernetes dotted and slashed labels, de_dot and de_slash enabled' do
436
436
  VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' },
437
- { name: 'kubernetes_docker_metadata_dotted_labels' }]) do
437
+ { name: 'kubernetes_docker_metadata_dotted_slashed_labels' }]) do
438
438
  filtered = emit({}, '
439
439
  kubernetes_url https://localhost:8443
440
440
  watch false
441
441
  cache_size 1
442
+ de_dot true
443
+ de_slash true
442
444
  ')
443
445
  expected_kube_metadata = {
444
446
  'docker' => {
@@ -452,14 +454,14 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
452
454
  'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
453
455
  'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
454
456
  'namespace_labels' => {
455
- 'kubernetes_io/namespacetest' => 'somevalue'
457
+ 'kubernetes_io__namespacetest' => 'somevalue'
456
458
  },
457
459
  'namespace_name' => 'default',
458
460
  'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
459
461
  'pod_ip' => '172.17.0.8',
460
462
  'master_url' => 'https://localhost:8443',
461
463
  'labels' => {
462
- 'kubernetes_io/test' => 'somevalue'
464
+ 'kubernetes_io__test' => 'somevalue'
463
465
  }
464
466
  }
465
467
  }
@@ -467,14 +469,15 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
467
469
  end
468
470
  end
469
471
 
470
- test 'with kubernetes dotted labels, de_dot disabled' do
472
+ test 'with kubernetes dotted and slashed labels, de_dot and de_slash disabled' do
471
473
  VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' },
472
- { name: 'kubernetes_docker_metadata_dotted_labels' }]) do
474
+ { name: 'kubernetes_docker_metadata_dotted_slashed_labels' }]) do
473
475
  filtered = emit({}, '
474
476
  kubernetes_url https://localhost:8443
475
477
  watch false
476
478
  cache_size 1
477
479
  de_dot false
480
+ de_slash false
478
481
  ')
479
482
  expected_kube_metadata = {
480
483
  'docker' => {
@@ -506,11 +509,21 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
506
509
  test 'invalid de_dot_separator config' do
507
510
  assert_raise Fluent::ConfigError do
508
511
  create_driver('
512
+ de_dot true
509
513
  de_dot_separator contains.
510
514
  ')
511
515
  end
512
516
  end
513
517
 
518
+ test 'invalid de_slash_separator config' do
519
+ assert_raise Fluent::ConfigError do
520
+ create_driver('
521
+ de_slash true
522
+ de_slash_separator contains/
523
+ ')
524
+ end
525
+ end
526
+
514
527
  test 'with records from journald and docker & kubernetes metadata' do
515
528
  # with use_journal true should ignore tags and use CONTAINER_NAME and CONTAINER_ID_FULL
516
529
  tag = 'var.log.containers.junk1_junk2_junk3-49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed450.log'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-kubernetes_metadata_filter
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.8.1
4
+ version: 2.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jimmi Dyson
@@ -230,7 +230,7 @@ files:
230
230
  - lib/fluent/plugin/kubernetes_metadata_watch_pods.rb
231
231
  - test/cassettes/invalid_api_server_config.yml
232
232
  - test/cassettes/kubernetes_docker_metadata_annotations.yml
233
- - test/cassettes/kubernetes_docker_metadata_dotted_labels.yml
233
+ - test/cassettes/kubernetes_docker_metadata_dotted_slashed_labels.yml
234
234
  - test/cassettes/kubernetes_get_api_v1.yml
235
235
  - test/cassettes/kubernetes_get_api_v1_using_token.yml
236
236
  - test/cassettes/kubernetes_get_namespace_default.yml