prometheus_exporter 2.0.5 → 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: 8bd1d7c955d48051b122205cd59d9700eace9c4b5ef1e38a87c9d4fbb14e8164
4
- data.tar.gz: a44f8ab58e239550a0a75875dd4ad05c2f79769dcc781ad380afac7fac02d10b
3
+ metadata.gz: 25775f350202635101e313a78e969a076259861a993349069a2dad9af6090304
4
+ data.tar.gz: 403ea5cec32df2025140379fe44a4bb7a1850dfadb639c04de65f8d2f5589f79
5
5
  SHA512:
6
- metadata.gz: b5eedad2d76d14cfdaa6e693ba7862b82f3845e2136249bad6a879ec44bdff946c9ffc93f89448e1bdda1b2f673a5bc46df07266c2c8867247aa513250b5e79c
7
- data.tar.gz: ae93f7dc838787cb72ae00037de19028f85d66ae7a71432fd74f064820ac3bc9664a27e64bfb0072fa41c195a1956007ffee3b629f80a882517248a4b21ff1bc
6
+ metadata.gz: c03b38725cef3d3d37d9b11106980d0861892fa225d4e0ffdfcdc0178eda80902e7b89f29955b978bdc58fe496059a42a99504b29a8bc9acb4227c0661f62031
7
+ data.tar.gz: fd06bd579d2bcfdb702d40e3f2e13c33a2edfb909e938dc52b26160b5e65b5f96f1ffcd53b22e80c289f2cae013630e5017bd6e93f8b9a7cf5de3da983fae823
data/CHANGELOG CHANGED
@@ -1,3 +1,14 @@
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
+
7
+ 2.0.6 - 2022-11-22
8
+
9
+ - FIX: use user specified labels over default in merge conflict
10
+ - FIX: sidekiq stats collector memory leak
11
+
1
12
  2.0.5 - 2022-11-15
2
13
 
3
14
  - FIX: regression :prepend style instrumentation not working correctly
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.
@@ -75,7 +75,7 @@ module PrometheusExporter::Metric
75
75
  end
76
76
 
77
77
  def labels_text(labels)
78
- labels = (labels || {}).merge(Base.default_labels)
78
+ labels = Base.default_labels.merge(labels || {})
79
79
  if labels && labels.length > 0
80
80
  s = labels.map do |key, value|
81
81
  value = value.to_s
@@ -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,7 +42,7 @@ module PrometheusExporter::Server
40
42
  end
41
43
 
42
44
  def collect(object)
43
- sidekiq_metrics << object
45
+ @sidekiq_metrics << object
44
46
  end
45
47
  end
46
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.5'
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.5
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-15 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