prometheus_exporter 2.0.6 → 2.0.8

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: af71a5656b5fe6a90de6fe6ad1b76efa05ccfb67d4fdb3cdcc740f539097546f
4
+ data.tar.gz: cd6ef704ecdc7110d5f78dd999354e1ea093adcba51f2355a0211e99e0fb3c67
5
5
  SHA512:
6
- metadata.gz: 55eb9c1051984906ee30be3cbb2a9d4c3cb0c5f2fe58c9da0178b48187beb940a8314677052cf6b29bb0c2e5d6d364de30b36a32b56eb061065d48feab01e903
7
- data.tar.gz: 794b19bab0a66404058ca2d550659d2fbca891e894a5b234db974eefc6b0652475c94d607b0be0b0f84f8d786bebf0a5b6d8721408c7e79ef18f031cd8466446
6
+ metadata.gz: adf3c09a5609699bd055094bc509e997e320a72833b7c2beca03186d0c3d3fa0fa65fc005708b7faf496a9bf32c68c489cc7a1985525eed7a35ceb6b2d53a9df
7
+ data.tar.gz: 3975585eb3842c5cf409793d9257a184e33af062d4dd45e5bf64164bbba88c87d14aaea946bed519f9db1034afb8695fbdeecef337286bcaf00132cd2cd7a5f2
@@ -20,7 +20,7 @@ jobs:
20
20
  strategy:
21
21
  fail-fast: false
22
22
  matrix:
23
- ruby: ['2.6', '2.7', '3.0', '3.1']
23
+ ruby: ['2.6', '2.7', '3.0', '3.1', '3.2']
24
24
  activerecord: [60, 61]
25
25
 
26
26
  steps:
@@ -0,0 +1,47 @@
1
+ name: Docker
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ permissions:
9
+ contents: read
10
+ packages: write
11
+
12
+ env:
13
+ DOCKER_REPO: ghcr.io/discourse/prometheus_exporter
14
+
15
+ jobs:
16
+ build-and-publish:
17
+ runs-on: ubuntu-latest
18
+ timeout-minutes: 30
19
+
20
+ steps:
21
+ - name: Set vars
22
+ id: vars
23
+ run: |
24
+ echo "version=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
25
+
26
+ - uses: actions/checkout@v3
27
+ - uses: docker/setup-qemu-action@v2
28
+ - uses: docker/setup-buildx-action@v2
29
+
30
+ - name: Login to Github Container Registry
31
+ uses: docker/login-action@v2
32
+ with:
33
+ registry: ghcr.io
34
+ username: ${{ github.actor }}
35
+ password: ${{ secrets.GITHUB_TOKEN }}
36
+
37
+ - name: Build and push images
38
+ uses: docker/build-push-action@v3
39
+ with:
40
+ context: .
41
+ push: true
42
+ platforms: linux/amd64,linux/arm64
43
+ build-args: |
44
+ GEM_VERSION=${{ steps.vars.outputs.version }}
45
+ tags: |
46
+ ${{ env.DOCKER_REPO }}:${{ steps.vars.outputs.version }}
47
+ ${{ env.DOCKER_REPO }}:latest
data/CHANGELOG CHANGED
@@ -1,3 +1,13 @@
1
+ 2.0.8 - 2023-01-20
2
+
3
+ - FEATURE: attempting to make our first docker release
4
+
5
+ 2.0.7 - 2023-01-13
6
+
7
+ - FEATURE: allow binding server to both ipv4 and v6
8
+ - FIX: expire stale sidekiq metrics
9
+
10
+
1
11
  2.0.6 - 2022-11-22
2
12
 
3
13
  - FIX: use user specified labels over default in merge conflict
data/Dockerfile ADDED
@@ -0,0 +1,9 @@
1
+ ARG RUBY_VERSION=3.1
2
+ ARG GEM_VERSION=
3
+
4
+ FROM ruby:${RUBY_VERSION}-slim
5
+
6
+ RUN gem install --no-doc --version=${GEM_VERSION} prometheus_exporter
7
+
8
+ EXPOSE 9394
9
+ ENTRYPOINT ["prometheus_exporter", "-b", "ANY"]
data/README.md CHANGED
@@ -32,6 +32,7 @@ To learn more see [Instrumenting Rails with Prometheus](https://samsaffron.com/a
32
32
  * [Transport concerns](#transport-concerns)
33
33
  * [JSON generation and parsing](#json-generation-and-parsing)
34
34
  * [Logging](#logging)
35
+ * [Docker Usage](#docker-usage)
35
36
  * [Contributing](#contributing)
36
37
  * [License](#license)
37
38
  * [Code of Conduct](#code-of-conduct)
@@ -857,6 +858,9 @@ prometheus_exporter -p 8080 \
857
858
  --prefix 'foo_'
858
859
  ```
859
860
 
861
+ You can use `-b` option to bind the `prometheus_exporter` web server to any IPv4 interface with `-b 0.0.0.0`,
862
+ any IPv6 interface with `-b ::`, or `-b ANY` to any IPv4/IPv6 interfaces available on your host system.
863
+
860
864
  #### Enabling Basic Authentication
861
865
 
862
866
  If you desire authentication on your `/metrics` route, you can enable basic authentication with the `--auth` option.
@@ -960,6 +964,28 @@ You can also pass a log level (default is [`Logger::WARN`](https://ruby-doc.org/
960
964
  PrometheusExporter::Client.new(log_level: Logger::DEBUG)
961
965
  ```
962
966
 
967
+ ## Docker Usage
968
+
969
+ You can run `prometheus_exporter` project using an official Docker image:
970
+
971
+ ```bash
972
+ docker pull discourse/prometheus_exporter:latest
973
+ # or use specific version
974
+ docker pull discourse/prometheus_exporter:x.x.x
975
+ ```
976
+
977
+ The start the container:
978
+
979
+ ```bash
980
+ docker run -p 9394:9394 discourse/prometheus_exporter
981
+ ```
982
+
983
+ Additional flags could be included:
984
+
985
+ ```
986
+ docker run -p 9394:9394 discourse/prometheus_exporter --verbose --prefix=myapp
987
+ ```
988
+
963
989
  ## Docker/Kubernetes Healthcheck
964
990
 
965
991
  A `/ping` endpoint which only returns `PONG` is available so you can run container healthchecks :
@@ -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.8"
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.8
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-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: webrick
@@ -243,11 +243,13 @@ extensions: []
243
243
  extra_rdoc_files: []
244
244
  files:
245
245
  - ".github/workflows/ci.yml"
246
+ - ".github/workflows/docker.yml"
246
247
  - ".gitignore"
247
248
  - ".rubocop.yml"
248
249
  - Appraisals
249
250
  - CHANGELOG
250
251
  - CODE_OF_CONDUCT.md
252
+ - Dockerfile
251
253
  - Gemfile
252
254
  - Guardfile
253
255
  - LICENSE.txt
@@ -289,6 +291,7 @@ files:
289
291
  - lib/prometheus_exporter/server/collector_base.rb
290
292
  - lib/prometheus_exporter/server/delayed_job_collector.rb
291
293
  - lib/prometheus_exporter/server/hutch_collector.rb
294
+ - lib/prometheus_exporter/server/metrics_container.rb
292
295
  - lib/prometheus_exporter/server/process_collector.rb
293
296
  - lib/prometheus_exporter/server/puma_collector.rb
294
297
  - lib/prometheus_exporter/server/resque_collector.rb