phihos-fluent-plugin-prometheus 2.0.3
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 +7 -0
- data/.github/workflows/linux.yml +34 -0
- data/.gitignore +16 -0
- data/.rspec +2 -0
- data/.travis.yml +14 -0
- data/ChangeLog +43 -0
- data/Gemfile +4 -0
- data/LICENSE +202 -0
- data/README.md +537 -0
- data/Rakefile +7 -0
- data/fluent-plugin-prometheus.gemspec +22 -0
- data/lib/fluent/plugin/filter_prometheus.rb +43 -0
- data/lib/fluent/plugin/in_prometheus/async_wrapper.rb +47 -0
- data/lib/fluent/plugin/in_prometheus.rb +230 -0
- data/lib/fluent/plugin/in_prometheus_monitor.rb +107 -0
- data/lib/fluent/plugin/in_prometheus_output_monitor.rb +234 -0
- data/lib/fluent/plugin/in_prometheus_tail_monitor.rb +98 -0
- data/lib/fluent/plugin/out_prometheus.rb +42 -0
- data/lib/fluent/plugin/prometheus/data_store.rb +93 -0
- data/lib/fluent/plugin/prometheus/placeholder_expander.rb +132 -0
- data/lib/fluent/plugin/prometheus.rb +418 -0
- data/lib/fluent/plugin/prometheus_metrics.rb +77 -0
- data/misc/fluentd_sample.conf +170 -0
- data/misc/nginx_proxy.conf +22 -0
- data/misc/prometheus.yaml +13 -0
- data/misc/prometheus_alerts.yaml +59 -0
- data/spec/fluent/plugin/filter_prometheus_spec.rb +118 -0
- data/spec/fluent/plugin/in_prometheus_monitor_spec.rb +42 -0
- data/spec/fluent/plugin/in_prometheus_spec.rb +225 -0
- data/spec/fluent/plugin/in_prometheus_tail_monitor_spec.rb +42 -0
- data/spec/fluent/plugin/out_prometheus_spec.rb +139 -0
- data/spec/fluent/plugin/prometheus/placeholder_expander_spec.rb +110 -0
- data/spec/fluent/plugin/prometheus_metrics_spec.rb +138 -0
- data/spec/fluent/plugin/shared.rb +248 -0
- data/spec/spec_helper.rb +10 -0
- metadata +176 -0
@@ -0,0 +1,248 @@
|
|
1
|
+
|
2
|
+
BASE_CONFIG = %[
|
3
|
+
@type prometheus
|
4
|
+
]
|
5
|
+
|
6
|
+
SIMPLE_CONFIG = BASE_CONFIG + %[
|
7
|
+
<metric>
|
8
|
+
name simple_foo
|
9
|
+
type counter
|
10
|
+
desc Something foo.
|
11
|
+
key foo
|
12
|
+
</metric>
|
13
|
+
]
|
14
|
+
|
15
|
+
FULL_CONFIG = BASE_CONFIG + %[
|
16
|
+
<metric>
|
17
|
+
name full_foo
|
18
|
+
type counter
|
19
|
+
desc Something foo.
|
20
|
+
key foo
|
21
|
+
<labels>
|
22
|
+
key foo1
|
23
|
+
</labels>
|
24
|
+
</metric>
|
25
|
+
<metric>
|
26
|
+
name full_bar
|
27
|
+
type gauge
|
28
|
+
desc Something bar.
|
29
|
+
key bar
|
30
|
+
<labels>
|
31
|
+
key foo2
|
32
|
+
</labels>
|
33
|
+
</metric>
|
34
|
+
<metric>
|
35
|
+
name full_baz
|
36
|
+
type summary
|
37
|
+
desc Something baz.
|
38
|
+
key baz
|
39
|
+
<labels>
|
40
|
+
key foo3
|
41
|
+
</labels>
|
42
|
+
</metric>
|
43
|
+
<metric>
|
44
|
+
name full_qux
|
45
|
+
type histogram
|
46
|
+
desc Something qux.
|
47
|
+
key qux
|
48
|
+
buckets 0.1, 1, 5, 10
|
49
|
+
<labels>
|
50
|
+
key foo4
|
51
|
+
</labels>
|
52
|
+
</metric>
|
53
|
+
<metric>
|
54
|
+
name full_accessor1
|
55
|
+
type summary
|
56
|
+
desc Something with accessor.
|
57
|
+
key $.foo
|
58
|
+
<labels>
|
59
|
+
key foo5
|
60
|
+
</labels>
|
61
|
+
</metric>
|
62
|
+
<metric>
|
63
|
+
name full_accessor2
|
64
|
+
type counter
|
65
|
+
desc Something with accessor.
|
66
|
+
key $.foo
|
67
|
+
<labels>
|
68
|
+
key foo6
|
69
|
+
</labels>
|
70
|
+
</metric>
|
71
|
+
<labels>
|
72
|
+
test_key test_value
|
73
|
+
</labels>
|
74
|
+
]
|
75
|
+
|
76
|
+
PLACEHOLDER_CONFIG = BASE_CONFIG + %[
|
77
|
+
<metric>
|
78
|
+
name placeholder_foo
|
79
|
+
type counter
|
80
|
+
desc Something foo.
|
81
|
+
key foo
|
82
|
+
<labels>
|
83
|
+
foo ${foo}
|
84
|
+
</labels>
|
85
|
+
</metric>
|
86
|
+
<labels>
|
87
|
+
tag ${tag}
|
88
|
+
hostname ${hostname}
|
89
|
+
</labels>
|
90
|
+
]
|
91
|
+
|
92
|
+
ACCESSOR_CONFIG = BASE_CONFIG + %[
|
93
|
+
<metric>
|
94
|
+
name accessor_foo
|
95
|
+
type counter
|
96
|
+
desc Something foo.
|
97
|
+
key foo
|
98
|
+
<labels>
|
99
|
+
foo $.foo
|
100
|
+
</labels>
|
101
|
+
</metric>
|
102
|
+
]
|
103
|
+
|
104
|
+
COUNTER_WITHOUT_KEY_CONFIG = BASE_CONFIG + %[
|
105
|
+
<metric>
|
106
|
+
name without_key_foo
|
107
|
+
type counter
|
108
|
+
desc Something foo.
|
109
|
+
</metric>
|
110
|
+
]
|
111
|
+
|
112
|
+
shared_examples_for 'output configuration' do
|
113
|
+
context 'base config' do
|
114
|
+
let(:config) { BASE_CONFIG }
|
115
|
+
it { expect { driver }.not_to raise_error }
|
116
|
+
end
|
117
|
+
|
118
|
+
context 'with simple configuration' do
|
119
|
+
let(:config) { SIMPLE_CONFIG }
|
120
|
+
it { expect { driver }.not_to raise_error }
|
121
|
+
end
|
122
|
+
|
123
|
+
context 'with full configuration' do
|
124
|
+
let(:config) { FULL_CONFIG }
|
125
|
+
it { expect { driver }.not_to raise_error }
|
126
|
+
end
|
127
|
+
|
128
|
+
context 'with placeholder configuration' do
|
129
|
+
let(:config) { PLACEHOLDER_CONFIG }
|
130
|
+
it { expect { driver }.not_to raise_error }
|
131
|
+
end
|
132
|
+
|
133
|
+
context 'with accessor configuration' do
|
134
|
+
let(:config) { ACCESSOR_CONFIG }
|
135
|
+
it { expect { driver }.not_to raise_error }
|
136
|
+
end
|
137
|
+
|
138
|
+
describe 'with counter without key configuration' do
|
139
|
+
let(:config) { COUNTER_WITHOUT_KEY_CONFIG }
|
140
|
+
it { expect { driver }.not_to raise_error }
|
141
|
+
end
|
142
|
+
|
143
|
+
context 'with unknown type' do
|
144
|
+
let(:config) do
|
145
|
+
BASE_CONFIG + %[
|
146
|
+
<metric>
|
147
|
+
type foo
|
148
|
+
</metric>
|
149
|
+
]
|
150
|
+
end
|
151
|
+
it { expect { driver }.to raise_error(Fluent::ConfigError) }
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
shared_examples_for 'instruments record' do
|
156
|
+
before do
|
157
|
+
driver.run(default_tag: tag) { driver.feed(event_time, message) }
|
158
|
+
end
|
159
|
+
|
160
|
+
context 'full config' do
|
161
|
+
let(:config) { FULL_CONFIG }
|
162
|
+
let(:counter) { registry.get(:full_foo) }
|
163
|
+
let(:gauge) { registry.get(:full_bar) }
|
164
|
+
let(:summary) { registry.get(:full_baz) }
|
165
|
+
let(:histogram) { registry.get(:full_qux) }
|
166
|
+
let(:summary_with_accessor) { registry.get(:full_accessor1) }
|
167
|
+
let(:counter_with_accessor) { registry.get(:full_accessor2) }
|
168
|
+
|
169
|
+
it 'adds all metrics' do
|
170
|
+
expect(registry.metrics.map(&:name)).to eq(%i[full_foo full_bar full_baz full_qux full_accessor1 full_accessor2])
|
171
|
+
expect(counter).to be_kind_of(::Prometheus::Client::Metric)
|
172
|
+
expect(gauge).to be_kind_of(::Prometheus::Client::Metric)
|
173
|
+
expect(summary).to be_kind_of(::Prometheus::Client::Metric)
|
174
|
+
expect(summary_with_accessor).to be_kind_of(::Prometheus::Client::Metric)
|
175
|
+
expect(counter_with_accessor).to be_kind_of(::Prometheus::Client::Metric)
|
176
|
+
expect(histogram).to be_kind_of(::Prometheus::Client::Metric)
|
177
|
+
end
|
178
|
+
|
179
|
+
it 'instruments counter metric' do
|
180
|
+
expect(counter.type).to eq(:counter)
|
181
|
+
expect(counter.get(labels: {test_key: 'test_value', key: 'foo1'})).to be_kind_of(Numeric)
|
182
|
+
expect(counter_with_accessor.get(labels: {test_key: 'test_value', key: 'foo6'})).to be_kind_of(Numeric)
|
183
|
+
end
|
184
|
+
|
185
|
+
it 'instruments gauge metric' do
|
186
|
+
expect(gauge.type).to eq(:gauge)
|
187
|
+
expect(gauge.get(labels: {test_key: 'test_value', key: 'foo2'})).to eq(100)
|
188
|
+
end
|
189
|
+
|
190
|
+
it 'instruments summary metric' do
|
191
|
+
expect(summary.type).to eq(:summary)
|
192
|
+
expect(summary.get(labels: {test_key: 'test_value', key: 'foo3'})).to be_kind_of(Hash)
|
193
|
+
expect(summary_with_accessor.get(labels: {test_key: 'test_value', key: 'foo5'})["sum"]).to eq(100)
|
194
|
+
end
|
195
|
+
|
196
|
+
it 'instruments histogram metric' do
|
197
|
+
driver.run(default_tag: tag) do
|
198
|
+
4.times { driver.feed(event_time, message) }
|
199
|
+
end
|
200
|
+
|
201
|
+
expect(histogram.type).to eq(:histogram)
|
202
|
+
expect(histogram.get(labels: {test_key: 'test_value', key: 'foo4'})).to be_kind_of(Hash)
|
203
|
+
expect(histogram.get(labels: {test_key: 'test_value', key: 'foo4'})["10"]).to eq(5) # 4 + `es` in before
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
context 'placeholder config' do
|
208
|
+
let(:config) { PLACEHOLDER_CONFIG }
|
209
|
+
let(:counter) { registry.get(:placeholder_foo) }
|
210
|
+
|
211
|
+
it 'expands placeholders with record values' do
|
212
|
+
expect(registry.metrics.map(&:name)).to eq([:placeholder_foo])
|
213
|
+
expect(counter).to be_kind_of(::Prometheus::Client::Metric)
|
214
|
+
key, _ = counter.values.find {|k,v| v == 100 }
|
215
|
+
expect(key).to be_kind_of(Hash)
|
216
|
+
expect(key[:tag]).to eq(tag)
|
217
|
+
expect(key[:hostname]).to be_kind_of(String)
|
218
|
+
expect(key[:hostname]).not_to eq("${hostname}")
|
219
|
+
expect(key[:hostname]).not_to be_empty
|
220
|
+
expect(key[:foo]).to eq("100")
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
context 'accessor config' do
|
225
|
+
let(:config) { ACCESSOR_CONFIG }
|
226
|
+
let(:counter) { registry.get(:accessor_foo) }
|
227
|
+
|
228
|
+
it 'expands accessor with record values' do
|
229
|
+
expect(registry.metrics.map(&:name)).to eq([:accessor_foo])
|
230
|
+
expect(counter).to be_kind_of(::Prometheus::Client::Metric)
|
231
|
+
key, _ = counter.values.find {|k,v| v == 100 }
|
232
|
+
expect(key).to be_kind_of(Hash)
|
233
|
+
expect(key[:foo]).to eq("100")
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
context 'counter_without config' do
|
238
|
+
let(:config) { COUNTER_WITHOUT_KEY_CONFIG }
|
239
|
+
let(:counter) { registry.get(:without_key_foo) }
|
240
|
+
|
241
|
+
it 'just increments by 1' do
|
242
|
+
expect(registry.metrics.map(&:name)).to eq([:without_key_foo])
|
243
|
+
expect(counter).to be_kind_of(::Prometheus::Client::Metric)
|
244
|
+
_, value = counter.values.find {|k,v| k == {} }
|
245
|
+
expect(value).to eq(1)
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
2
|
+
require 'fluent/test'
|
3
|
+
require 'fluent/test/helpers'
|
4
|
+
require 'fluent/plugin/prometheus'
|
5
|
+
|
6
|
+
# Disable Test::Unit
|
7
|
+
Test::Unit::AutoRunner.need_auto_run = false
|
8
|
+
|
9
|
+
Fluent::Test.setup
|
10
|
+
include Fluent::Test::Helpers
|
metadata
ADDED
@@ -0,0 +1,176 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: phihos-fluent-plugin-prometheus
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Philipp Hossner
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2022-08-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: fluentd
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.9.1
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '2'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.9.1
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '2'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: prometheus-client
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 2.1.0
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 2.1.0
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: bundler
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: rake
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: rspec
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: test-unit
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
description: A fluent plugin that collects metrics and exposes for Prometheus.
|
104
|
+
email:
|
105
|
+
- philipp.hossner@posteo.de
|
106
|
+
executables: []
|
107
|
+
extensions: []
|
108
|
+
extra_rdoc_files: []
|
109
|
+
files:
|
110
|
+
- ".github/workflows/linux.yml"
|
111
|
+
- ".gitignore"
|
112
|
+
- ".rspec"
|
113
|
+
- ".travis.yml"
|
114
|
+
- ChangeLog
|
115
|
+
- Gemfile
|
116
|
+
- LICENSE
|
117
|
+
- README.md
|
118
|
+
- Rakefile
|
119
|
+
- fluent-plugin-prometheus.gemspec
|
120
|
+
- lib/fluent/plugin/filter_prometheus.rb
|
121
|
+
- lib/fluent/plugin/in_prometheus.rb
|
122
|
+
- lib/fluent/plugin/in_prometheus/async_wrapper.rb
|
123
|
+
- lib/fluent/plugin/in_prometheus_monitor.rb
|
124
|
+
- lib/fluent/plugin/in_prometheus_output_monitor.rb
|
125
|
+
- lib/fluent/plugin/in_prometheus_tail_monitor.rb
|
126
|
+
- lib/fluent/plugin/out_prometheus.rb
|
127
|
+
- lib/fluent/plugin/prometheus.rb
|
128
|
+
- lib/fluent/plugin/prometheus/data_store.rb
|
129
|
+
- lib/fluent/plugin/prometheus/placeholder_expander.rb
|
130
|
+
- lib/fluent/plugin/prometheus_metrics.rb
|
131
|
+
- misc/fluentd_sample.conf
|
132
|
+
- misc/nginx_proxy.conf
|
133
|
+
- misc/prometheus.yaml
|
134
|
+
- misc/prometheus_alerts.yaml
|
135
|
+
- spec/fluent/plugin/filter_prometheus_spec.rb
|
136
|
+
- spec/fluent/plugin/in_prometheus_monitor_spec.rb
|
137
|
+
- spec/fluent/plugin/in_prometheus_spec.rb
|
138
|
+
- spec/fluent/plugin/in_prometheus_tail_monitor_spec.rb
|
139
|
+
- spec/fluent/plugin/out_prometheus_spec.rb
|
140
|
+
- spec/fluent/plugin/prometheus/placeholder_expander_spec.rb
|
141
|
+
- spec/fluent/plugin/prometheus_metrics_spec.rb
|
142
|
+
- spec/fluent/plugin/shared.rb
|
143
|
+
- spec/spec_helper.rb
|
144
|
+
homepage: https://github.com/phihos/fluent-plugin-prometheus
|
145
|
+
licenses:
|
146
|
+
- Apache-2.0
|
147
|
+
metadata: {}
|
148
|
+
post_install_message:
|
149
|
+
rdoc_options: []
|
150
|
+
require_paths:
|
151
|
+
- lib
|
152
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
153
|
+
requirements:
|
154
|
+
- - ">="
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
version: '0'
|
157
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
158
|
+
requirements:
|
159
|
+
- - ">="
|
160
|
+
- !ruby/object:Gem::Version
|
161
|
+
version: '0'
|
162
|
+
requirements: []
|
163
|
+
rubygems_version: 3.3.5
|
164
|
+
signing_key:
|
165
|
+
specification_version: 4
|
166
|
+
summary: A fluent plugin that collects metrics and exposes for Prometheus.
|
167
|
+
test_files:
|
168
|
+
- spec/fluent/plugin/filter_prometheus_spec.rb
|
169
|
+
- spec/fluent/plugin/in_prometheus_monitor_spec.rb
|
170
|
+
- spec/fluent/plugin/in_prometheus_spec.rb
|
171
|
+
- spec/fluent/plugin/in_prometheus_tail_monitor_spec.rb
|
172
|
+
- spec/fluent/plugin/out_prometheus_spec.rb
|
173
|
+
- spec/fluent/plugin/prometheus/placeholder_expander_spec.rb
|
174
|
+
- spec/fluent/plugin/prometheus_metrics_spec.rb
|
175
|
+
- spec/fluent/plugin/shared.rb
|
176
|
+
- spec/spec_helper.rb
|