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 +4 -4
- data/CHANGELOG.md +18 -0
- data/fluent-plugin-jfrog-metrics.gemspec +3 -3
- data/lib/fluent/plugin/datadog_metrics_parser.rb +1 -1
- data/lib/fluent/plugin/metrics_helper.rb +2 -0
- data/lib/fluent/plugin/newrelic_metrics_parser.rb +1 -1
- data/lib/fluent/plugin/splunk_metrics_parser.rb +1 -1
- data/spec/lib/datadog_metrics_parser_spec.rb +100 -0
- data/spec/lib/newrelic_metrics_parser_spec.rb +24 -0
- data/spec/lib/splunk_metrics_parser_spec.rb +24 -0
- metadata +11 -8
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 335f7170ad6eed8eb8237cfe912c0e6c547825a7b16904ebbd84c0247e51dbf6
|
|
4
|
+
data.tar.gz: 73c094c9e41b5e163e5a6f604073a7ec84530fc9376033cc555aa15df58d21e5
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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.
|
|
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(/(
|
|
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]
|
|
@@ -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(/(
|
|
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(/(
|
|
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.
|
|
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-
|
|
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
|
|
104
|
-
(Prometheus Exposition Format) to target observability platform format (Splunk
|
|
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
|
|
159
|
-
Exposition Format) to target observability platform format (Splunk HEC,
|
|
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
|