fluent-plugin-jfrog-metrics 0.2.14 → 0.2.16

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: a5d5ad46df6caec2199b42f521c9722ce27552d988fda9950d8f5dac659e40ed
4
- data.tar.gz: 4ec636b979f8cae25013c698d977d3b9021b68325b806b8c415f3fa356396593
3
+ metadata.gz: 335f7170ad6eed8eb8237cfe912c0e6c547825a7b16904ebbd84c0247e51dbf6
4
+ data.tar.gz: 73c094c9e41b5e163e5a6f604073a7ec84530fc9376033cc555aa15df58d21e5
5
5
  SHA512:
6
- metadata.gz: c0e1bc0f53fd024f6f200b27a4e0c39f98833b1412bf2fcaebbd24c743e7188dd8107c5a5f5e31c12cf8c0d9a88387ffe19bc5852e53c38afbe1b29dc18eebfa
7
- data.tar.gz: f1db053da0248b953b9c023d092b101bd22dbf8a2a7a7379efacc675d6fb3ca8e161ea1dc66d43f01483da9e898057b0f373b4961781efe924a38420a585643a
6
+ metadata.gz: 84d8410b8fcccefdca9b76071cbf1a2e42cba33fde5fb973e52e09939f52b08d779f533189220c982af2a131b231807dcc76b2293661c327acf323cbf6cf495b
7
+ data.tar.gz: 58cb4bd996293b1ec508b35281f39788f5be88a32900da0faa941377328a9f9accd383b8673be109b3251c65176d9c7df9fde24e6084917fff96f4ca8f9d4272
data/CHANGELOG.md ADDED
@@ -0,0 +1,18 @@
1
+ # Changelog
2
+
3
+ ## v0.2.16
4
+ - Added RTFS (Real-Time File Store) metrics endpoint support ([JOBS-1897](https://jfrog-int.atlassian.net/browse/JOBS-1897))
5
+ - New metric_prefix `jfrog.rtfs` maps to `/artifactory/service/rtfs/api/v1/metrics`
6
+
7
+ ## v0.2.13
8
+ - Added fix to parse metrics without timestamps (JOBS-1801)
9
+ - Honour NO_PROXY environment variable for log analytics solutions (JOBS-1732)
10
+
11
+ ## v0.2.12
12
+ - Add FluentD logger option to metrics plugins (PTRENG-6541)
13
+ - Fix wrapper for gzip stream handling (PTRENG-6489)
14
+ - Enhance HTTP request timeout handling (PTRENG-6489)
15
+
16
+ ## v0.2.11
17
+ - Add support for verify_ssl flag (PTRENG-6164)
18
+ - Add http_proxy param support for API calls to vendors (PTRENG-6261)
@@ -3,12 +3,12 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
 
4
4
  Gem::Specification.new do |spec|
5
5
  spec.name = 'fluent-plugin-jfrog-metrics'
6
- spec.version = '0.2.14'
6
+ spec.version = '0.2.16'
7
7
  spec.authors = ['MahithaB, BenHarosh']
8
8
  spec.email = ['cpe-support@jfrog.com']
9
9
 
10
- spec.summary = %q{Fluentd Plugin for converting JFrog Artifactory, Xray generated metrics (Prometheus Exposition Format) to target observability platform format (Splunk HEC, New Relic, DataDog)}
11
- spec.description = %q{Fluentd Plugin for converting JFrog Artifactory, Xray generated metrics (Prometheus Exposition Format) to target observability platform format (Splunk HEC, New Relic, DataDog)}
10
+ spec.summary = %q{Fluentd Plugin for converting JFrog Artifactory, Xray, RTFS generated metrics (Prometheus Exposition Format) to target observability platform format (Splunk HEC, New Relic, DataDog)}
11
+ spec.description = %q{Fluentd Plugin for converting JFrog Artifactory, Xray, RTFS generated metrics (Prometheus Exposition Format) to target observability platform format (Splunk HEC, New Relic, DataDog)}
12
12
 
13
13
  spec.homepage = 'https://github.com/jfrog/jfrog-fluentd-plugins/tree/main/fluent-plugin-jfrog-metrics'
14
14
  spec.license = 'Apache-2.0'
@@ -19,7 +19,7 @@ class DatadogMetricsParser < BaseMetricsParser
19
19
  point = {}
20
20
  points = []
21
21
  if interim_data =~ /{/ && interim_data =~ /}/
22
- metric_name, additional_dims, metric_val_and_time = interim_data.match(/(.*){(.*)}(.*)/i).captures
22
+ metric_name, additional_dims, metric_val_and_time = interim_data.match(/(.*?){(.*)}(.*)/i).captures
23
23
  additional_dims.split("\",").each do |interim_data|
24
24
  pair_data = interim_data.gsub("\"", "").gsub("{", "").gsub("}", "")
25
25
  interim_data_value = pair_data.split("=", 2)[1]
@@ -26,6 +26,8 @@ class MetricsHelper
26
26
  "#{@jpd_url}/artifactory/api/v1/metrics"
27
27
  when 'jfrog.xray'
28
28
  "#{@jpd_url}/xray/api/v1/metrics"
29
+ when 'jfrog.rtfs'
30
+ "#{@jpd_url}/rtfs/api/v1/metrics"
29
31
  else
30
32
  "#{@jpd_url}/artifactory/api/v1/metrics"
31
33
  end
@@ -17,7 +17,7 @@ class NewRelicMetricsParser < BaseMetricsParser
17
17
  metrics_hash = {}
18
18
  if interim_data =~ /{/ && interim_data =~ /}/
19
19
  attributes = {}
20
- metric_name, additional_dims, metric_val_and_time = interim_data.match(/(.*){(.*)}(.*)/i).captures
20
+ metric_name, additional_dims, metric_val_and_time = interim_data.match(/(.*?){(.*)}(.*)/i).captures
21
21
  additional_dims.split("\",").each do |interim_data|
22
22
  pair_data = interim_data.gsub("\"", "").gsub("{", "").gsub("}", "")
23
23
  interim_data_value = pair_data.split("=", 2)[1]
@@ -20,7 +20,7 @@ class SplunkMetricsParser < BaseMetricsParser
20
20
  def generate_hash_from_data(data = '', prefix = '', separator = '')
21
21
  metrics_hash = {}
22
22
  if data =~ /{/ && data =~ /}/
23
- metric_name, additional_dims, metric_val_and_time = data.match(/(.*){(.*)}(.*)/i).captures
23
+ metric_name, additional_dims, metric_val_and_time = data.match(/(.*?){(.*)}(.*)/i).captures
24
24
  if metric_val_and_time =~ / /
25
25
  metrics_hash['metric_name'] = prefix + separator + metric_name
26
26
  metrics_hash['value'] =
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+ [
3
+ File.join(File.dirname(__FILE__), '..'),
4
+ File.join(File.dirname(__FILE__), '..', 'lib/fluent/plugin'),
5
+ File.join(File.dirname(__FILE__), '..', 'spec'),
6
+ ].each do |dir|
7
+ $LOAD_PATH.unshift(dir) unless $LOAD_PATH.include?(dir)
8
+ end
9
+
10
+ require 'datadog_metrics_parser'
11
+ require 'date'
12
+ require 'rspec'
13
+
14
+
15
+ RSpec.describe DatadogMetricsParser do
16
+ describe "#emit_parsed_metrics" do
17
+ it 'should read sample Artifactory metrics data and verify the size of parsed data > 1' do
18
+ platform_metrics = File.read('./spec/fixtures/files/sample_artifactory_metrics.txt')
19
+ expect(platform_metrics.size).to be > 1
20
+
21
+ parser = DatadogMetricsParser.new('jfrog.artifactory', '', 'jfrog.artifactory.metrics')
22
+
23
+ normalized_data = parser.normalise_data(platform_metrics)
24
+ expect(normalized_data.size).to be > 1
25
+
26
+ cleaned_data = parser.clean_data(normalized_data)
27
+ expect(cleaned_data.size).to be > 1
28
+
29
+ hash_data_array = parser.format_data(cleaned_data, 'jfrog.artifactory', '.')
30
+ expect(hash_data_array.size).to be 1
31
+ expect(hash_data_array[0]['series'].size).to be > 1
32
+
33
+ serialized_data = parser.serialize_data(hash_data_array)
34
+ expect(serialized_data.size).to be 1
35
+ end
36
+
37
+ it 'should read sample Xray metrics data and verify the size of parsed data > 1' do
38
+ platform_metrics = File.read('./spec/fixtures/files/sample_xray_metrics.txt')
39
+ expect(platform_metrics.size).to be > 1
40
+
41
+ parser = DatadogMetricsParser.new('jfrog.xray', '', 'jfrog.xray.metrics')
42
+
43
+ normalized_data = parser.normalise_data(platform_metrics)
44
+ expect(normalized_data.size).to be > 1
45
+
46
+ cleaned_data = parser.clean_data(normalized_data)
47
+ expect(cleaned_data.size).to be > 1
48
+
49
+ hash_data_array = parser.format_data(cleaned_data, 'jfrog.xray', '.')
50
+ expect(hash_data_array.size).to be 1
51
+ expect(hash_data_array[0]['series'].size).to be > 1
52
+
53
+ serialized_data = parser.serialize_data(hash_data_array)
54
+ expect(serialized_data.size).to be 1
55
+ end
56
+
57
+ it 'should parse RTFS metrics with jfrog.rtfs prefix and verify all metric names are prefixed' do
58
+ platform_metrics = File.read('./spec/fixtures/files/sample_artifactory_metrics.txt')
59
+ expect(platform_metrics.size).to be > 1
60
+
61
+ parser = DatadogMetricsParser.new('jfrog.rtfs', '', 'jfrog.metrics.rtfs')
62
+
63
+ normalized_data = parser.normalise_data(platform_metrics)
64
+ expect(normalized_data.size).to be > 1
65
+
66
+ cleaned_data = parser.clean_data(normalized_data)
67
+ expect(cleaned_data.size).to be > 1
68
+
69
+ hash_data_array = parser.format_data(cleaned_data, 'jfrog.rtfs', '.')
70
+ expect(hash_data_array.size).to be 1
71
+ expect(hash_data_array[0]['series'].size).to be > 1
72
+
73
+ hash_data_array[0]['series'].each do |metric|
74
+ expect(metric['metric']).to start_with('jfrog.rtfs.')
75
+ expect(metric['points']).not_to be_nil
76
+ expect(metric['points'].size).to be >= 1
77
+ expect(metric['points'][0]['value']).to be_a(Numeric)
78
+ end
79
+
80
+ serialized_data = parser.serialize_data(hash_data_array)
81
+ expect(serialized_data.size).to be 1
82
+ end
83
+
84
+ it 'should parse a single RTFS metric line correctly' do
85
+ single_metric = "sys_memory_used_bytes 3836522496 1645738619452"
86
+
87
+ parser = DatadogMetricsParser.new('jfrog.rtfs', '', 'jfrog.metrics.rtfs')
88
+
89
+ hash_data_array = parser.format_data([single_metric], 'jfrog.rtfs', '.')
90
+ expect(hash_data_array.size).to be 1
91
+ expect(hash_data_array[0]['series'].size).to be 1
92
+
93
+ metric = hash_data_array[0]['series'][0]
94
+ expect(metric['metric']).to eq('jfrog.rtfs.sys_memory_used_bytes')
95
+ expect(metric['points'][0]['value']).to eq(3836522496)
96
+ expect(metric['points'][0]['timestamp']).to eq(1645738619)
97
+ expect(metric['type']).to eq(3)
98
+ end
99
+ end
100
+ end
@@ -51,5 +51,29 @@ RSpec.describe NewRelicMetricsParser do
51
51
  serialized_data = parser.serialize_data(hash_data_array)
52
52
  expect(serialized_data.size).to be 1
53
53
  end
54
+
55
+ it 'should parse RTFS metrics with jfrog.rtfs prefix and verify all metric names are prefixed' do
56
+ platform_metrics = File.read('./spec/fixtures/files/sample_artifactory_metrics.txt')
57
+ expect(platform_metrics.size).to be > 1
58
+
59
+ parser = NewRelicMetricsParser.new('jfrog.rtfs', '', 'jfrog.metrics.rtfs')
60
+
61
+ normalized_data = parser.normalise_data(platform_metrics)
62
+ expect(normalized_data.size).to be > 1
63
+
64
+ cleaned_data = parser.clean_data(normalized_data)
65
+ expect(cleaned_data.size).to be > 1
66
+
67
+ hash_data_array = parser.format_data(cleaned_data, 'jfrog.rtfs', '.')
68
+ expect(hash_data_array.size).to be 1
69
+
70
+ hash_data_array[0]['metrics'].each do |metric|
71
+ expect(metric['name']).to start_with('jfrog.rtfs.')
72
+ expect(metric['value']).to be_a(Numeric)
73
+ end
74
+
75
+ serialized_data = parser.serialize_data(hash_data_array)
76
+ expect(serialized_data.size).to be 1
77
+ end
54
78
  end
55
79
  end
@@ -51,5 +51,29 @@ RSpec.describe SplunkMetricsParser do
51
51
  serialized_data = parser.serialize_data(hash_data_array)
52
52
  expect(serialized_data.size).to be > 1
53
53
  end
54
+
55
+ it 'should parse RTFS metrics with jfrog.rtfs prefix and verify all metric names are prefixed' do
56
+ platform_metrics = File.read('./spec/fixtures/files/sample_artifactory_metrics.txt')
57
+ expect(platform_metrics.size).to be > 1
58
+
59
+ parser = SplunkMetricsParser.new('jfrog.rtfs', '', 'jfrog.metrics.rtfs')
60
+
61
+ normalized_data = parser.normalise_data(platform_metrics)
62
+ expect(normalized_data.size).to be > 1
63
+
64
+ cleaned_data = parser.clean_data(normalized_data)
65
+ expect(cleaned_data.size).to be > 1
66
+
67
+ hash_data_array = parser.format_data(cleaned_data, 'jfrog.rtfs', '.')
68
+ expect(hash_data_array.size).to be > 1
69
+
70
+ hash_data_array.each do |metric|
71
+ expect(metric['metric_name']).to start_with('jfrog.rtfs.')
72
+ expect(metric['value']).to be_a(Numeric)
73
+ end
74
+
75
+ serialized_data = parser.serialize_data(hash_data_array)
76
+ expect(serialized_data.size).to be > 1
77
+ end
54
78
  end
55
79
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-jfrog-metrics
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.14
4
+ version: 0.2.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - MahithaB, BenHarosh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-01-19 00:00:00.000000000 Z
11
+ date: 2026-04-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -100,9 +100,9 @@ dependencies:
100
100
  - - "~>"
101
101
  - !ruby/object:Gem::Version
102
102
  version: 2.1.0
103
- description: Fluentd Plugin for converting JFrog Artifactory, Xray generated metrics
104
- (Prometheus Exposition Format) to target observability platform format (Splunk HEC,
105
- New Relic, DataDog)
103
+ description: Fluentd Plugin for converting JFrog Artifactory, Xray, RTFS generated
104
+ metrics (Prometheus Exposition Format) to target observability platform format (Splunk
105
+ HEC, New Relic, DataDog)
106
106
  email:
107
107
  - cpe-support@jfrog.com
108
108
  executables: []
@@ -111,6 +111,7 @@ extra_rdoc_files: []
111
111
  files:
112
112
  - ".gitignore"
113
113
  - ".rspec"
114
+ - CHANGELOG.md
114
115
  - Gemfile
115
116
  - Gemfile.lock
116
117
  - LICENSE
@@ -127,6 +128,7 @@ files:
127
128
  - spec/fixtures/files/creds.rb
128
129
  - spec/fixtures/files/sample_artifactory_metrics.txt
129
130
  - spec/fixtures/files/sample_xray_metrics.txt
131
+ - spec/lib/datadog_metrics_parser_spec.rb
130
132
  - spec/lib/metrics_helper_spec.rb
131
133
  - spec/lib/newrelic_metrics_parser_spec.rb
132
134
  - spec/lib/splunk_metrics_parser_spec.rb
@@ -155,13 +157,14 @@ requirements: []
155
157
  rubygems_version: 3.0.3.1
156
158
  signing_key:
157
159
  specification_version: 4
158
- summary: Fluentd Plugin for converting JFrog Artifactory, Xray generated metrics (Prometheus
159
- Exposition Format) to target observability platform format (Splunk HEC, New Relic,
160
- DataDog)
160
+ summary: Fluentd Plugin for converting JFrog Artifactory, Xray, RTFS generated metrics
161
+ (Prometheus Exposition Format) to target observability platform format (Splunk HEC,
162
+ New Relic, DataDog)
161
163
  test_files:
162
164
  - spec/fixtures/files/creds.rb
163
165
  - spec/fixtures/files/sample_artifactory_metrics.txt
164
166
  - spec/fixtures/files/sample_xray_metrics.txt
167
+ - spec/lib/datadog_metrics_parser_spec.rb
165
168
  - spec/lib/metrics_helper_spec.rb
166
169
  - spec/lib/newrelic_metrics_parser_spec.rb
167
170
  - spec/lib/splunk_metrics_parser_spec.rb