prometheus_exporter 2.0.6 → 2.0.7

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: 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