fluent-plugin-kubernetes_metadata_filter 2.11.1 → 3.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -1
  3. data/Gemfile.lock +25 -25
  4. data/README.md +5 -52
  5. data/doc/benchmark/5m-1-2500lps-256b-baseline-01/cpu.png +0 -0
  6. data/doc/benchmark/5m-1-2500lps-256b-baseline-01/latency.png +0 -0
  7. data/doc/benchmark/5m-1-2500lps-256b-baseline-01/loss.png +0 -0
  8. data/doc/benchmark/5m-1-2500lps-256b-baseline-01/mem.png +0 -0
  9. data/doc/benchmark/5m-1-2500lps-256b-baseline-01/readme.md +88 -0
  10. data/doc/benchmark/5m-1-2500lps-256b-baseline-01/results.html +127 -0
  11. data/doc/benchmark/5m-1-2500lps-256b-kube-01-01/cpu.png +0 -0
  12. data/doc/benchmark/5m-1-2500lps-256b-kube-01-01/latency.png +0 -0
  13. data/doc/benchmark/5m-1-2500lps-256b-kube-01-01/loss.png +0 -0
  14. data/doc/benchmark/5m-1-2500lps-256b-kube-01-01/mem.png +0 -0
  15. data/doc/benchmark/5m-1-2500lps-256b-kube-01-01/readme.md +97 -0
  16. data/doc/benchmark/5m-1-2500lps-256b-kube-01-01/results.html +136 -0
  17. data/doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/cpu.png +0 -0
  18. data/doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/latency.png +0 -0
  19. data/doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/loss.png +0 -0
  20. data/doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/mem.png +0 -0
  21. data/doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/readme.md +97 -0
  22. data/doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/results.html +136 -0
  23. data/fluent-plugin-kubernetes_metadata_filter.gemspec +3 -3
  24. data/lib/fluent/plugin/filter_kubernetes_metadata.rb +33 -103
  25. data/lib/fluent/plugin/kubernetes_metadata_cache_strategy.rb +2 -2
  26. data/lib/fluent/plugin/kubernetes_metadata_common.rb +1 -16
  27. data/lib/fluent/plugin/kubernetes_metadata_stats.rb +16 -0
  28. data/lib/fluent/plugin/kubernetes_metadata_util.rb +0 -20
  29. data/lib/fluent/plugin/kubernetes_metadata_watch_pods.rb +1 -1
  30. data/test/plugin/test_filter_kubernetes_metadata.rb +23 -420
  31. metadata +23 -6
  32. data/test/plugin/test_utils.rb +0 -56
@@ -18,26 +18,6 @@
18
18
  # See the License for the specific language governing permissions and
19
19
  # limitations under the License.
20
20
  #
21
- module KubernetesMetadata
22
- module Util
23
- def create_time_from_record(record, internal_time)
24
- time_key = @time_fields.detect { |ii| record.key?(ii) }
25
- time = record[time_key]
26
- if time.nil? || time.is_a?(String) && time.chop.empty?
27
- # `internal_time` is a Fluent::EventTime, it can't compare with Time.
28
- return Time.at(internal_time.to_f)
29
- end
30
-
31
- if ['_SOURCE_REALTIME_TIMESTAMP', '__REALTIME_TIMESTAMP'].include?(time_key)
32
- timei = time.to_i
33
- return Time.at(timei / 1_000_000, timei % 1_000_000)
34
- end
35
- return Time.at(time) if time.is_a?(Numeric)
36
-
37
- Time.parse(time)
38
- end
39
- end
40
- end
41
21
 
42
22
  #https://stackoverflow.com/questions/5622435/how-do-i-convert-a-ruby-class-name-to-a-underscore-delimited-symbol
43
23
  class String
@@ -52,7 +52,7 @@ module KubernetesMetadata
52
52
  # recreate client to refresh token
53
53
  log.info("Encountered '401 Unauthorized' exception in watch, recreating client to refresh token")
54
54
  create_client()
55
- namespace_watcher = nil
55
+ pod_watcher = nil
56
56
  else
57
57
  # treat all other errors the same as StandardError, log, swallow and reset
58
58
  @stats.bump(:pod_watch_failures)
@@ -41,6 +41,24 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
41
41
  assert_equal(1000, d.instance.cache_size)
42
42
  end
43
43
 
44
+ sub_test_case 'stats_interval' do
45
+
46
+ test 'enables stats when greater than zero' do
47
+ d = create_driver('stats_interval 1')
48
+ assert_equal(1, d.instance.stats_interval)
49
+ d.instance.dump_stats
50
+ assert_false(d.instance.instance_variable_get("@curr_time").nil?)
51
+ end
52
+
53
+ test 'disables stats when <= zero' do
54
+ d = create_driver('stats_interval 0')
55
+ assert_equal(0, d.instance.stats_interval)
56
+ d.instance.dump_stats
57
+ assert_nil(d.instance.instance_variable_get("@curr_time"))
58
+ end
59
+
60
+ end
61
+
44
62
  test 'check test_api_adapter' do
45
63
  d = create_driver('test_api_adapter KubernetesMetadata::TestApiAdapter')
46
64
  assert_equal('KubernetesMetadata::TestApiAdapter', d.instance.test_api_adapter)
@@ -156,15 +174,6 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
156
174
  d.filtered.map(&:last)
157
175
  end
158
176
 
159
- test 'nil event stream' do
160
- # not certain how this is possible but adding test to properly
161
- # guard against this condition we have seen - test for nil,
162
- # empty, no empty method, not an event stream
163
- plugin = create_driver.instance
164
- plugin.filter_stream('tag', nil)
165
- plugin.filter_stream('tag', Fluent::MultiEventStream.new)
166
- end
167
-
168
177
  sub_test_case 'parsing_pod_metadata when container_status is missing from the pod status' do
169
178
  test 'using the tag_to_kubernetes_name_regexp for /var/log/containers ' do
170
179
  VCR.use_cassettes(
@@ -503,318 +512,6 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
503
512
  assert_equal(msg, filtered[0])
504
513
  end
505
514
 
506
- test 'with kubernetes dotted and slashed labels, de_dot and de_slash enabled' do
507
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' },
508
- { name: 'kubernetes_docker_metadata_dotted_slashed_labels' }]) do
509
- filtered = emit({}, '
510
- kubernetes_url https://localhost:8443
511
- watch false
512
- cache_size 1
513
- de_dot true
514
- de_slash true
515
- ')
516
- expected_kube_metadata = {
517
- 'docker' => {
518
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
519
- },
520
- 'kubernetes' => {
521
- 'host' => 'jimmi-redhat.localnet',
522
- 'pod_name' => 'fabric8-console-controller-98rqc',
523
- 'container_name' => 'fabric8-console-container',
524
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
525
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
526
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
527
- 'namespace_labels' => {
528
- 'kubernetes_io__namespacetest' => 'somevalue'
529
- },
530
- 'namespace_name' => 'default',
531
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
532
- 'pod_ip' => '172.17.0.8',
533
- 'master_url' => 'https://localhost:8443',
534
- 'labels' => {
535
- 'kubernetes_io__test' => 'somevalue'
536
- }
537
- }
538
- }
539
- assert_equal(expected_kube_metadata, filtered[0])
540
- end
541
- end
542
-
543
- test 'with kubernetes dotted and slashed labels, de_dot and de_slash disabled' do
544
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' },
545
- { name: 'kubernetes_docker_metadata_dotted_slashed_labels' }]) do
546
- filtered = emit({}, '
547
- kubernetes_url https://localhost:8443
548
- watch false
549
- cache_size 1
550
- de_dot false
551
- de_slash false
552
- ')
553
- expected_kube_metadata = {
554
- 'docker' => {
555
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
556
- },
557
- 'kubernetes' => {
558
- 'host' => 'jimmi-redhat.localnet',
559
- 'pod_name' => 'fabric8-console-controller-98rqc',
560
- 'container_name' => 'fabric8-console-container',
561
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
562
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
563
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
564
- 'namespace_labels' => {
565
- 'kubernetes.io/namespacetest' => 'somevalue'
566
- },
567
- 'namespace_name' => 'default',
568
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
569
- 'pod_ip' => '172.17.0.8',
570
- 'master_url' => 'https://localhost:8443',
571
- 'labels' => {
572
- 'kubernetes.io/test' => 'somevalue'
573
- }
574
- }
575
- }
576
- assert_equal(expected_kube_metadata, filtered[0])
577
- end
578
- end
579
-
580
- test 'invalid de_dot_separator config' do
581
- assert_raise Fluent::ConfigError do
582
- create_driver('
583
- de_dot true
584
- de_dot_separator contains.
585
- ')
586
- end
587
- end
588
-
589
- test 'invalid de_slash_separator config' do
590
- assert_raise Fluent::ConfigError do
591
- create_driver('
592
- de_slash true
593
- de_slash_separator contains/
594
- ')
595
- end
596
- end
597
-
598
- test 'with records from journald and docker & kubernetes metadata' do
599
- # with use_journal true should ignore tags and use CONTAINER_NAME and CONTAINER_ID_FULL
600
- tag = 'var.log.containers.junk1_junk2_junk3-49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed450.log'
601
- msg = {
602
- 'CONTAINER_NAME' => 'k8s_fabric8-console-container.db89db89_fabric8-console-controller-98rqc_default_c76927af-f563-11e4-b32d-54ee7527188d_89db89db',
603
- 'CONTAINER_ID_FULL' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459',
604
- 'randomfield' => 'randomvalue'
605
- }
606
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' },
607
- { name: 'kubernetes_get_namespace_default' }]) do
608
- filtered = emit_with_tag(tag, msg, '
609
- kubernetes_url https://localhost:8443
610
- watch false
611
- cache_size 1
612
- use_journal true
613
- ')
614
- expected_kube_metadata = {
615
- 'docker' => {
616
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
617
- },
618
- 'kubernetes' => {
619
- 'host' => 'jimmi-redhat.localnet',
620
- 'pod_name' => 'fabric8-console-controller-98rqc',
621
- 'container_name' => 'fabric8-console-container',
622
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
623
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
624
- 'namespace_name' => 'default',
625
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
626
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
627
- 'pod_ip' => '172.17.0.8',
628
- 'master_url' => 'https://localhost:8443',
629
- 'labels' => {
630
- 'component' => 'fabric8Console'
631
- }
632
- }
633
- }.merge(msg)
634
- assert_equal(expected_kube_metadata, filtered[0])
635
- end
636
- end
637
-
638
- test 'with records from journald and docker & kubernetes metadata & namespace_id enabled' do
639
- # with use_journal true should ignore tags and use CONTAINER_NAME and CONTAINER_ID_FULL
640
- tag = 'var.log.containers.junk1_junk2_junk3-49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed450.log'
641
- msg = {
642
- 'CONTAINER_NAME' => 'k8s_fabric8-console-container.db89db89_fabric8-console-controller-98rqc_default_c76927af-f563-11e4-b32d-54ee7527188d_89db89db',
643
- 'CONTAINER_ID_FULL' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459',
644
- 'randomfield' => 'randomvalue'
645
- }
646
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' },
647
- { name: 'kubernetes_get_namespace_default', options: { allow_playback_repeats: true } }]) do
648
- filtered = emit_with_tag(tag, msg, '
649
- kubernetes_url https://localhost:8443
650
- watch false
651
- cache_size 1
652
- use_journal true
653
- ')
654
- expected_kube_metadata = {
655
- 'docker' => {
656
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
657
- },
658
- 'kubernetes' => {
659
- 'host' => 'jimmi-redhat.localnet',
660
- 'pod_name' => 'fabric8-console-controller-98rqc',
661
- 'container_name' => 'fabric8-console-container',
662
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
663
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
664
- 'namespace_name' => 'default',
665
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
666
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
667
- 'pod_ip' => '172.17.0.8',
668
- 'master_url' => 'https://localhost:8443',
669
- 'labels' => {
670
- 'component' => 'fabric8Console'
671
- }
672
- }
673
- }.merge(msg)
674
- assert_equal(expected_kube_metadata, filtered[0])
675
- end
676
- end
677
-
678
- test 'with records from journald and docker & kubernetes metadata with use_journal unset' do
679
- # with use_journal unset, should still use the journal fields instead of tag fields
680
- tag = 'var.log.containers.fabric8-console-controller-98rqc_default_fabric8-console-container-49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459.log'
681
- msg = {
682
- 'CONTAINER_NAME' => 'k8s_journald-container-name.db89db89_journald-pod-name_journald-namespace-name_c76927af-f563-11e4-b32d-54ee7527188d_89db89db',
683
- 'CONTAINER_ID_FULL' => '838350c64bacba968d39a30a50789b2795291fceca6ccbff55298671d46b0e3b',
684
- 'kubernetes' => {
685
- 'namespace_name' => 'k8s-namespace-name',
686
- 'pod_name' => 'k8s-pod-name',
687
- 'container_name' => 'k8s-container-name'
688
- },
689
- 'docker' => { 'container_id' => 'e463bc0d3ae38f5c89d92dca49b30e049e899799920b79d4d5f705acbe82ba95' },
690
- 'randomfield' => 'randomvalue'
691
- }
692
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' },
693
- { name: 'kubernetes_get_namespace_default' },
694
- { name: 'metadata_from_tag_journald_and_kubernetes_fields' }]) do
695
- es = emit_with_tag(tag, msg, '
696
- kubernetes_url https://localhost:8443
697
- watch false
698
- cache_size 1
699
- ')
700
- expected_kube_metadata = {
701
- 'docker' => {
702
- 'container_id' => 'e463bc0d3ae38f5c89d92dca49b30e049e899799920b79d4d5f705acbe82ba95'
703
- },
704
- 'kubernetes' => {
705
- 'host' => 'jimmi-redhat.localnet',
706
- 'pod_name' => 'k8s-pod-name',
707
- 'container_name' => 'k8s-container-name',
708
- 'container_image' => 'k8s-container-image:latest',
709
- 'container_image_id' => 'docker://d78c5217c41e9af08d37d9ae2cb070afa1fe3da6bc77bfb18879a8b4bfdf8a34',
710
- 'namespace_name' => 'k8s-namespace-name',
711
- 'namespace_id' => '8e0dc8fc-59f2-49f7-a3e2-ed0913e19d9f',
712
- 'pod_id' => 'ebabf749-5fcd-4750-a3f0-aedd89476da8',
713
- 'pod_ip' => '172.17.0.8',
714
- 'master_url' => 'https://localhost:8443',
715
- 'labels' => {
716
- 'component' => 'k8s-test'
717
- }
718
- }
719
- }.merge(msg) { |key, oldval, newval| (key == 'kubernetes') || (key == 'docker') ? oldval : newval }
720
- assert_equal(expected_kube_metadata, es[0])
721
- end
722
- end
723
-
724
- test 'with records from journald and docker & kubernetes metadata with lookup_from_k8s_field false' do
725
- # with use_journal unset, should still use the journal fields instead of tag fields
726
- tag = 'var.log.containers.fabric8-console-controller-98rqc_default_fabric8-console-container-49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459.log'
727
- msg = {
728
- 'CONTAINER_NAME' => 'k8s_journald-container-name.db89db89_journald-pod-name_journald-namespace-name_c76927af-f563-11e4-b32d-54ee7527188d_89db89db',
729
- 'CONTAINER_ID_FULL' => '838350c64bacba968d39a30a50789b2795291fceca6ccbff55298671d46b0e3b',
730
- 'kubernetes' => {
731
- 'namespace_name' => 'k8s-namespace-name',
732
- 'pod_name' => 'k8s-pod-name',
733
- 'container_name' => 'k8s-container-name'
734
- },
735
- 'docker' => { 'container_id' => 'e463bc0d3ae38f5c89d92dca49b30e049e899799920b79d4d5f705acbe82ba95' },
736
- 'randomfield' => 'randomvalue'
737
- }
738
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' },
739
- { name: 'kubernetes_get_namespace_default', options: { allow_playback_repeats: true } },
740
- { name: 'metadata_from_tag_and_journald_fields' }]) do
741
- es = emit_with_tag(tag, msg, '
742
- kubernetes_url https://localhost:8443
743
- watch false
744
- cache_size 1
745
- lookup_from_k8s_field false
746
- ')
747
- expected_kube_metadata = {
748
- 'docker' => {
749
- 'container_id' => '838350c64bacba968d39a30a50789b2795291fceca6ccbff55298671d46b0e3b'
750
- },
751
- 'kubernetes' => {
752
- 'host' => 'jimmi-redhat.localnet',
753
- 'pod_name' => 'journald-pod-name',
754
- 'container_name' => 'journald-container-name',
755
- 'container_image' => 'journald-container-image:latest',
756
- 'container_image_id' => 'docker://dda4c95705fb7050b701b10a7fe928ca5bc971a1dcb521ae3c339194cbf36b47',
757
- 'namespace_name' => 'journald-namespace-name',
758
- 'namespace_id' => '8282888f-733f-4f23-a3d3-1fdfa3bdacf2',
759
- 'pod_id' => '5e1c1e27-b637-4e81-80b6-6d8a8c404d3b',
760
- 'pod_ip' => '172.17.0.8',
761
- 'master_url' => 'https://localhost:8443',
762
- 'labels' => {
763
- 'component' => 'journald-test'
764
- }
765
- }
766
- }.merge(msg) { |key, oldval, newval| (key == 'kubernetes') || (key == 'docker') ? oldval : newval }
767
- assert_equal(expected_kube_metadata, es[0])
768
- end
769
- end
770
-
771
- test 'uses metadata from tag if use_journal false and lookup_from_k8s_field false' do
772
- # with use_journal unset, should still use the journal fields instead of tag fields
773
- msg = {
774
- 'CONTAINER_NAME' => 'k8s_journald-container-name.db89db89_journald-pod-name_journald-namespace-name_c76927af-f563-11e4-b32d-54ee7527188d_89db89db',
775
- 'CONTAINER_ID_FULL' => '838350c64bacba968d39a30a50789b2795291fceca6ccbff55298671d46b0e3b',
776
- 'kubernetes' => {
777
- 'namespace_name' => 'k8s-namespace-name',
778
- 'pod_name' => 'k8s-pod-name',
779
- 'container_name' => 'k8s-container-name'
780
- },
781
- 'docker' => { 'container_id' => 'e463bc0d3ae38f5c89d92dca49b30e049e899799920b79d4d5f705acbe82ba95' },
782
- 'randomfield' => 'randomvalue'
783
- }
784
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' },
785
- { name: 'kubernetes_get_namespace_default', options: { allow_playback_repeats: true } },
786
- { name: 'metadata_from_tag_and_journald_fields' }]) do
787
- es = emit_with_tag(VAR_LOG_CONTAINER_TAG, msg, "
788
- kubernetes_url https://localhost:8443
789
- watch false
790
- cache_size 1
791
- lookup_from_k8s_field false
792
- use_journal false
793
- ")
794
- expected_kube_metadata = {
795
- 'docker' => {
796
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
797
- },
798
- 'kubernetes' => {
799
- 'host' => 'jimmi-redhat.localnet',
800
- 'pod_name' => 'fabric8-console-controller-98rqc',
801
- 'container_name' => 'fabric8-console-container',
802
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
803
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
804
- 'namespace_name' => 'default',
805
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
806
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
807
- 'pod_ip' => '172.17.0.8',
808
- 'master_url' => 'https://localhost:8443',
809
- 'labels' => {
810
- 'component' => 'fabric8Console'
811
- }
812
- }
813
- }.merge(msg) { |key, oldval, newval| (key == 'kubernetes') || (key == 'docker') ? oldval : newval }
814
- assert_equal(expected_kube_metadata, es[0])
815
- end
816
- end
817
-
818
515
  test 'with kubernetes annotations' do
819
516
  VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' },
820
517
  { name: 'kubernetes_docker_metadata_annotations' },
@@ -844,8 +541,8 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
844
541
  'component' => 'fabric8Console'
845
542
  },
846
543
  'annotations' => {
847
- 'custom_field1' => 'hello_kitty',
848
- 'field_two' => 'value'
544
+ 'custom.field1' => 'hello_kitty',
545
+ 'field.two' => 'value'
849
546
  }
850
547
  }
851
548
  }
@@ -853,51 +550,6 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
853
550
  end
854
551
  end
855
552
 
856
- test 'with records from journald and docker & kubernetes metadata, alternate form' do
857
- # with use_journal true should ignore tags and use CONTAINER_NAME and CONTAINER_ID_FULL
858
- tag = 'var.log.containers.junk1_junk2_junk3-49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed450.log'
859
- msg = {
860
- 'CONTAINER_NAME' => 'alt_fabric8-console-container_fabric8-console-controller-98rqc_default_c76927af-f563-11e4-b32d-54ee7527188d_0',
861
- 'CONTAINER_ID_FULL' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459',
862
- 'randomfield' => 'randomvalue'
863
- }
864
- VCR.use_cassettes([
865
- { name: 'valid_kubernetes_api_server' },
866
- { name: 'kubernetes_get_api_v1' },
867
- { name: 'kubernetes_get_pod' },
868
- { name: 'kubernetes_get_namespace_default' },
869
- { name: 'metadata_from_tag_and_journald_fields' }
870
- ]) do
871
- filtered = emit_with_tag(tag, msg, '
872
- kubernetes_url https://localhost:8443
873
- watch false
874
- cache_size 1
875
- use_journal true
876
- ')
877
- expected_kube_metadata = {
878
- 'docker' => {
879
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
880
- },
881
- 'kubernetes' => {
882
- 'host' => 'jimmi-redhat.localnet',
883
- 'pod_name' => 'fabric8-console-controller-98rqc',
884
- 'container_name' => 'fabric8-console-container',
885
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
886
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
887
- 'namespace_name' => 'default',
888
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
889
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
890
- 'pod_ip' => '172.17.0.8',
891
- 'master_url' => 'https://localhost:8443',
892
- 'labels' => {
893
- 'component' => 'fabric8Console'
894
- }
895
- }
896
- }.merge(msg)
897
- assert_equal(expected_kube_metadata, filtered[0])
898
- end
899
- end
900
-
901
553
  test 'with kubernetes namespace annotations' do
902
554
  VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' },
903
555
  { name: 'kubernetes_docker_metadata_annotations' },
@@ -927,8 +579,8 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
927
579
  'component' => 'fabric8Console'
928
580
  },
929
581
  'annotations' => {
930
- 'custom_field1' => 'hello_kitty',
931
- 'field_two' => 'value'
582
+ 'custom.field1' => 'hello_kitty',
583
+ 'field.two' => 'value'
932
584
  },
933
585
  'namespace_annotations' => {
934
586
  'workspaceId' => 'myWorkspaceName'
@@ -973,56 +625,6 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
973
625
  end
974
626
  end
975
627
 
976
- test 'with CONTAINER_NAME that does not match' do
977
- tag = 'var.log.containers.junk4_junk5_junk6-49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed450.log'
978
- msg = {
979
- 'CONTAINER_NAME' => 'does_not_match',
980
- 'CONTAINER_ID_FULL' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459',
981
- 'randomfield' => 'randomvalue'
982
- }
983
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' },
984
- { name: 'kubernetes_docker_metadata_annotations' },
985
- { name: 'kubernetes_get_namespace_default' }]) do
986
- filtered = emit_with_tag(tag, msg, '
987
- kubernetes_url https://localhost:8443
988
- watch false
989
- cache_size 1
990
- use_journal true
991
- ')
992
- expected_kube_metadata = {
993
- 'CONTAINER_NAME' => 'does_not_match',
994
- 'CONTAINER_ID_FULL' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459',
995
- 'randomfield' => 'randomvalue'
996
- }
997
- assert_equal(expected_kube_metadata, filtered[0])
998
- end
999
- end
1000
-
1001
- test 'with CONTAINER_NAME starts with k8s_ that does not match' do
1002
- tag = 'var.log.containers.junk4_junk5_junk6-49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed450.log'
1003
- msg = {
1004
- 'CONTAINER_NAME' => 'k8s_doesnotmatch',
1005
- 'CONTAINER_ID_FULL' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459',
1006
- 'randomfield' => 'randomvalue'
1007
- }
1008
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' },
1009
- { name: 'kubernetes_docker_metadata_annotations' },
1010
- { name: 'kubernetes_get_namespace_default' }]) do
1011
- filtered = emit_with_tag(tag, msg, '
1012
- kubernetes_url https://localhost:8443
1013
- watch false
1014
- cache_size 1
1015
- use_journal true
1016
- ')
1017
- expected_kube_metadata = {
1018
- 'CONTAINER_NAME' => 'k8s_doesnotmatch',
1019
- 'CONTAINER_ID_FULL' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459',
1020
- 'randomfield' => 'randomvalue'
1021
- }
1022
- assert_equal(expected_kube_metadata, filtered[0])
1023
- end
1024
- end
1025
-
1026
628
  test 'processes all events when reading from MessagePackEventStream' do
1027
629
  VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' },
1028
630
  { name: 'kubernetes_get_api_v1' },
@@ -1036,6 +638,7 @@ class KubernetesMetadataFilterTest < Test::Unit::TestCase
1036
638
  kubernetes_url https://localhost:8443
1037
639
  watch false
1038
640
  cache_size 1
641
+ stats_interval 0
1039
642
  ')
1040
643
  d.run do
1041
644
  d.feed(VAR_LOG_CONTAINER_TAG, msgpack_stream)
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.11.1
4
+ version: 3.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenShift Cluster Logging
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-06-24 00:00:00.000000000 Z
12
+ date: 2022-09-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fluentd
@@ -20,7 +20,7 @@ dependencies:
20
20
  version: 0.14.0
21
21
  - - "<"
22
22
  - !ruby/object:Gem::Version
23
- version: '1.15'
23
+ version: '1.16'
24
24
  type: :runtime
25
25
  prerelease: false
26
26
  version_requirements: !ruby/object:Gem::Requirement
@@ -30,7 +30,7 @@ dependencies:
30
30
  version: 0.14.0
31
31
  - - "<"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.15'
33
+ version: '1.16'
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: kubeclient
36
36
  requirement: !ruby/object:Gem::Requirement
@@ -221,6 +221,24 @@ files:
221
221
  - LICENSE.txt
222
222
  - README.md
223
223
  - Rakefile
224
+ - doc/benchmark/5m-1-2500lps-256b-baseline-01/cpu.png
225
+ - doc/benchmark/5m-1-2500lps-256b-baseline-01/latency.png
226
+ - doc/benchmark/5m-1-2500lps-256b-baseline-01/loss.png
227
+ - doc/benchmark/5m-1-2500lps-256b-baseline-01/mem.png
228
+ - doc/benchmark/5m-1-2500lps-256b-baseline-01/readme.md
229
+ - doc/benchmark/5m-1-2500lps-256b-baseline-01/results.html
230
+ - doc/benchmark/5m-1-2500lps-256b-kube-01-01/cpu.png
231
+ - doc/benchmark/5m-1-2500lps-256b-kube-01-01/latency.png
232
+ - doc/benchmark/5m-1-2500lps-256b-kube-01-01/loss.png
233
+ - doc/benchmark/5m-1-2500lps-256b-kube-01-01/mem.png
234
+ - doc/benchmark/5m-1-2500lps-256b-kube-01-01/readme.md
235
+ - doc/benchmark/5m-1-2500lps-256b-kube-01-01/results.html
236
+ - doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/cpu.png
237
+ - doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/latency.png
238
+ - doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/loss.png
239
+ - doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/mem.png
240
+ - doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/readme.md
241
+ - doc/benchmark/5m-1-2500lps-256b-kube-01-marshal-02/results.html
224
242
  - fluent-plugin-kubernetes_metadata_filter.gemspec
225
243
  - lib/fluent/plugin/filter_kubernetes_metadata.rb
226
244
  - lib/fluent/plugin/kubernetes_metadata_cache_strategy.rb
@@ -250,7 +268,6 @@ files:
250
268
  - test/plugin/test_cache_stats.rb
251
269
  - test/plugin/test_cache_strategy.rb
252
270
  - test/plugin/test_filter_kubernetes_metadata.rb
253
- - test/plugin/test_utils.rb
254
271
  - test/plugin/test_watch_namespaces.rb
255
272
  - test/plugin/test_watch_pods.rb
256
273
  - test/plugin/watch_test.rb
@@ -266,7 +283,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
266
283
  requirements:
267
284
  - - ">="
268
285
  - !ruby/object:Gem::Version
269
- version: 2.5.0
286
+ version: 2.6.0
270
287
  required_rubygems_version: !ruby/object:Gem::Requirement
271
288
  requirements:
272
289
  - - ">="
@@ -1,56 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- #
4
- # Fluentd Kubernetes Metadata Filter Plugin - Enrich Fluentd events with
5
- # Kubernetes metadata
6
- #
7
- # Copyright 2015 Red Hat, Inc.
8
- #
9
- # Licensed under the Apache License, Version 2.0 (the "License");
10
- # you may not use this file except in compliance with the License.
11
- # You may obtain a copy of the License at
12
- #
13
- # http://www.apache.org/licenses/LICENSE-2.0
14
- #
15
- # Unless required by applicable law or agreed to in writing, software
16
- # distributed under the License is distributed on an "AS IS" BASIS,
17
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
- # See the License for the specific language governing permissions and
19
- # limitations under the License.
20
- #
21
- class KubernetesMetadataCacheStatsTest < Test::Unit::TestCase
22
- include KubernetesMetadata::Util
23
-
24
- def setup
25
- @time_fields = ['time']
26
- @internal_time = Time.now
27
- end
28
-
29
- test '#create_time_from_record when time is empty' do
30
- record = { 'time' => ' ' }
31
- assert_equal(@internal_time.to_i, create_time_from_record(record, @internal_time).to_i)
32
- end
33
- test '#create_time_from_record when time is nil' do
34
- record = {}
35
- assert_equal(@internal_time.to_i, create_time_from_record(record, @internal_time).to_i)
36
- end
37
-
38
- test '#create_time_from_record when time is an integer' do
39
- exp_time = Time.now
40
- record = { 'time' => exp_time.to_i }
41
- assert_equal(exp_time.to_i, create_time_from_record(record, @internal_time).to_i)
42
- end
43
-
44
- test '#create_time_from_record when time is a string' do
45
- exp_time = Time.now
46
- record = { 'time' => exp_time.to_s }
47
- assert_equal(exp_time.to_i, create_time_from_record(record, @internal_time).to_i)
48
- end
49
-
50
- test '#create_time_from_record when timefields include journal time fields' do
51
- @time_fields = ['_SOURCE_REALTIME_TIMESTAMP']
52
- exp_time = Time.now
53
- record = { '_SOURCE_REALTIME_TIMESTAMP' => exp_time.to_i.to_s }
54
- assert_equal(Time.at(exp_time.to_i / 1_000_000, exp_time.to_i % 1_000_000).to_i, create_time_from_record(record, @internal_time).to_i)
55
- end
56
- end