prometheus_exporter 2.0.6 → 2.0.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2a7a452c5d92b7dbaca7f68ae2fa0553b5e280cd0b194f8ad0914d1e372c6b54
4
- data.tar.gz: fdb40f93499fbc98cf4b94b2f52864fa1581df70b0dac448e06d8ebbf357f6f5
3
+ metadata.gz: 25775f350202635101e313a78e969a076259861a993349069a2dad9af6090304
4
+ data.tar.gz: 403ea5cec32df2025140379fe44a4bb7a1850dfadb639c04de65f8d2f5589f79
5
5
  SHA512:
6
- metadata.gz: 55eb9c1051984906ee30be3cbb2a9d4c3cb0c5f2fe58c9da0178b48187beb940a8314677052cf6b29bb0c2e5d6d364de30b36a32b56eb061065d48feab01e903
7
- data.tar.gz: 794b19bab0a66404058ca2d550659d2fbca891e894a5b234db974eefc6b0652475c94d607b0be0b0f84f8d786bebf0a5b6d8721408c7e79ef18f031cd8466446
6
+ metadata.gz: c03b38725cef3d3d37d9b11106980d0861892fa225d4e0ffdfcdc0178eda80902e7b89f29955b978bdc58fe496059a42a99504b29a8bc9acb4227c0661f62031
7
+ data.tar.gz: fd06bd579d2bcfdb702d40e3f2e13c33a2edfb909e938dc52b26160b5e65b5f96f1ffcd53b22e80c289f2cae013630e5017bd6e93f8b9a7cf5de3da983fae823
data/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ 2.0.7 - 2023-01-13
2
+
3
+ - FEATURE: allow binding server to both ipv4 and v6
4
+ - FIX: expire stale sidekiq metrics
5
+
6
+
1
7
  2.0.6 - 2022-11-22
2
8
 
3
9
  - FIX: use user specified labels over default in merge conflict
data/README.md CHANGED
@@ -857,6 +857,9 @@ prometheus_exporter -p 8080 \
857
857
  --prefix 'foo_'
858
858
  ```
859
859
 
860
+ You can use `-b` option to bind the `prometheus_exporter` web server to any IPv4 interface with `-b 0.0.0.0`,
861
+ any IPv6 interface with `-b ::`, or `-b ANY` to any IPv4/IPv6 interfaces available on your host system.
862
+
860
863
  #### Enabling Basic Authentication
861
864
 
862
865
  If you desire authentication on your `/metrics` route, you can enable basic authentication with the `--auth` option.
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PrometheusExporter::Server
4
+ class MetricsContainer
5
+ METRIC_MAX_AGE = 60
6
+ METRIC_EXPIRE_ATTR = "_expire_at"
7
+
8
+ attr_reader :data, :ttl
9
+ attr_accessor :filter
10
+
11
+ def initialize(ttl: METRIC_MAX_AGE, expire_attr: METRIC_EXPIRE_ATTR, filter: nil)
12
+ @data = []
13
+ @ttl = ttl
14
+ @expire_attr = expire_attr
15
+ @filter = filter
16
+ end
17
+
18
+ def <<(obj)
19
+ now = get_time
20
+ obj[@expire_attr] = now + @ttl
21
+
22
+ expire(time: now, new_metric: obj)
23
+
24
+ @data << obj
25
+ @data
26
+ end
27
+
28
+ def [](key)
29
+ @data.tap { expire }[key]
30
+ end
31
+
32
+ def size(&blk)
33
+ wrap_expire(:size, &blk)
34
+ end
35
+ alias_method :length, :size
36
+
37
+ def map(&blk)
38
+ wrap_expire(:map, &blk)
39
+ end
40
+
41
+ def each(&blk)
42
+ wrap_expire(:each, &blk)
43
+ end
44
+
45
+ def expire(time: nil, new_metric: nil)
46
+ time ||= get_time
47
+
48
+ @data.delete_if do |metric|
49
+ expired = metric[@expire_attr] < time
50
+ expired ||= filter.call(new_metric, metric) if @filter && new_metric
51
+ expired
52
+ end
53
+ end
54
+
55
+ private
56
+
57
+ def get_time
58
+ ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
59
+ end
60
+
61
+ def wrap_expire(method_name, &blk)
62
+ expire
63
+ @data.public_send(method_name, &blk)
64
+ end
65
+ end
66
+ end
@@ -14,7 +14,10 @@ module PrometheusExporter::Server
14
14
  }
15
15
 
16
16
  def initialize
17
- @puma_metrics = []
17
+ @puma_metrics = MetricsContainer.new
18
+ @puma_metrics.filter = -> (new_metric, old_metric) do
19
+ new_metric["pid"] == old_metric["pid"] && new_metric["hostname"] == old_metric["hostname"]
20
+ end
18
21
  end
19
22
 
20
23
  def type
@@ -51,15 +54,6 @@ module PrometheusExporter::Server
51
54
  end
52
55
 
53
56
  def collect(obj)
54
- now = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
55
-
56
- obj["created_at"] = now
57
-
58
- @puma_metrics.delete_if do |current|
59
- (obj["pid"] == current["pid"] && obj["hostname"] == current["hostname"]) ||
60
- (current["created_at"] + MAX_PUMA_METRIC_AGE < now)
61
- end
62
-
63
57
  @puma_metrics << obj
64
58
  end
65
59
  end
@@ -12,7 +12,7 @@ module PrometheusExporter::Server
12
12
  attr_reader :sidekiq_metrics, :gauges
13
13
 
14
14
  def initialize
15
- @sidekiq_metrics = []
15
+ @sidekiq_metrics = MetricsContainer.new(ttl: MAX_SIDEKIQ_METRIC_AGE)
16
16
  @gauges = {}
17
17
  end
18
18
 
@@ -21,6 +21,8 @@ module PrometheusExporter::Server
21
21
  end
22
22
 
23
23
  def metrics
24
+ SIDEKIQ_PROCESS_GAUGES.each_key { |name| gauges[name]&.reset! }
25
+
24
26
  sidekiq_metrics.map do |metric|
25
27
  labels = metric.fetch('labels', {})
26
28
  SIDEKIQ_PROCESS_GAUGES.map do |name, help|
@@ -35,12 +37,7 @@ module PrometheusExporter::Server
35
37
  end
36
38
 
37
39
  def collect(object)
38
- now = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
39
- process = object['process']
40
-
41
- process["created_at"] = now
42
- sidekiq_metrics.delete_if { |metric| metric['created_at'] + MAX_SIDEKIQ_METRIC_AGE < now }
43
- sidekiq_metrics << process
40
+ @sidekiq_metrics << object["process"]
44
41
  end
45
42
  end
46
43
  end
@@ -11,7 +11,7 @@ module PrometheusExporter::Server
11
11
  attr_reader :sidekiq_metrics, :gauges
12
12
 
13
13
  def initialize
14
- @sidekiq_metrics = []
14
+ @sidekiq_metrics = MetricsContainer.new
15
15
  @gauges = {}
16
16
  end
17
17
 
@@ -20,6 +20,8 @@ module PrometheusExporter::Server
20
20
  end
21
21
 
22
22
  def metrics
23
+ SIDEKIQ_QUEUE_GAUGES.each_key { |name| gauges[name]&.reset! }
24
+
23
25
  sidekiq_metrics.map do |metric|
24
26
  labels = metric.fetch("labels", {})
25
27
  SIDEKIQ_QUEUE_GAUGES.map do |name, help|
@@ -34,12 +36,9 @@ module PrometheusExporter::Server
34
36
  end
35
37
 
36
38
  def collect(object)
37
- now = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
38
39
  object['queues'].each do |queue|
39
- queue["created_at"] = now
40
40
  queue["labels"].merge!(object['custom_labels']) if object['custom_labels']
41
- sidekiq_metrics.delete_if { |metric| metric['created_at'] + MAX_SIDEKIQ_METRIC_AGE < now }
42
- sidekiq_metrics << queue
41
+ @sidekiq_metrics << queue
43
42
  end
44
43
  end
45
44
  end
@@ -18,7 +18,7 @@ module PrometheusExporter::Server
18
18
  attr_reader :sidekiq_metrics, :gauges
19
19
 
20
20
  def initialize
21
- @sidekiq_metrics = []
21
+ @sidekiq_metrics = MetricsContainer.new(ttl: MAX_SIDEKIQ_METRIC_AGE)
22
22
  @gauges = {}
23
23
  end
24
24
 
@@ -27,6 +27,8 @@ module PrometheusExporter::Server
27
27
  end
28
28
 
29
29
  def metrics
30
+ SIDEKIQ_STATS_GAUGES.each_key { |name| gauges[name]&.reset! }
31
+
30
32
  sidekiq_metrics.map do |metric|
31
33
  SIDEKIQ_STATS_GAUGES.map do |name, help|
32
34
  if (value = metric['stats'][name])
@@ -40,10 +42,7 @@ module PrometheusExporter::Server
40
42
  end
41
43
 
42
44
  def collect(object)
43
- now = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
44
- object['created_at'] = now
45
- sidekiq_metrics.delete_if { |metric| metric['created_at'] + MAX_SIDEKIQ_METRIC_AGE < now }
46
- sidekiq_metrics << object
45
+ @sidekiq_metrics << object
47
46
  end
48
47
  end
49
48
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "prometheus_exporter/server/metrics_container"
4
+
3
5
  module PrometheusExporter::Server
4
6
  class TypeCollector
5
7
  def type
@@ -44,6 +44,11 @@ module PrometheusExporter::Server
44
44
 
45
45
  @logger.info "Using Basic Authentication via #{@auth}" if @verbose && @auth
46
46
 
47
+ if %w(ALL ANY).include?(@bind)
48
+ @logger.info "Listening on both 0.0.0.0/:: network interfaces"
49
+ @bind = nil
50
+ end
51
+
47
52
  @server = WEBrick::HTTPServer.new(
48
53
  Port: @port,
49
54
  BindAddress: @bind,
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PrometheusExporter
4
- VERSION = '2.0.6'
4
+ VERSION = '2.0.7'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prometheus_exporter
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.6
4
+ version: 2.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Saffron
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-11-22 00:00:00.000000000 Z
11
+ date: 2023-01-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: webrick
@@ -289,6 +289,7 @@ files:
289
289
  - lib/prometheus_exporter/server/collector_base.rb
290
290
  - lib/prometheus_exporter/server/delayed_job_collector.rb
291
291
  - lib/prometheus_exporter/server/hutch_collector.rb
292
+ - lib/prometheus_exporter/server/metrics_container.rb
292
293
  - lib/prometheus_exporter/server/process_collector.rb
293
294
  - lib/prometheus_exporter/server/puma_collector.rb
294
295
  - lib/prometheus_exporter/server/resque_collector.rb