sidekiq_prometheus 0.9.2 → 1.0.0
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 +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +16 -0
- data/README.md +12 -9
- data/lib/sidekiq_prometheus.rb +7 -7
- data/lib/sidekiq_prometheus/job_metrics.rb +5 -5
- data/lib/sidekiq_prometheus/metrics.rb +32 -17
- data/lib/sidekiq_prometheus/periodic_metrics.rb +9 -9
- data/lib/sidekiq_prometheus/version.rb +1 -1
- data/sidekiq_prometheus.gemspec +2 -2
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d3f496cf0e6e5f8cd1b1642d324029bfaa2eec41eed88c54c570cda486a25d9c
|
4
|
+
data.tar.gz: 64b0a6b104b23cb4081bbb5d006b8fd958b397a18e2c35c4cdcb37c9b8ac8e25
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e14cb219e363d1d13e1c1c40fd56e14e0dcbb873240482ef685f48a948f170af0f7e44d3530ceff578b421f1d938445526e98311b0b8d4280f27d7d4863bd3f9
|
7
|
+
data.tar.gz: e309be13ae7d718f1746d4fdb05977673b4d1f067e979bb37309280c0d7bf8de6b6b7f73f9cabea1ad9459d995a98b76c334ba73c2a272ec6e6e3496b6cd402a
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,21 @@
|
|
1
1
|
CHANGELOG
|
2
2
|
|
3
|
+
<a name="v1.0.0"></a>
|
4
|
+
## [v1.0.0](https://github.com/fastly/sidekiq-prometheus/compare/v0.9.1...v1.0.0) (2019-10-24)
|
5
|
+
|
6
|
+
### Pull Requests
|
7
|
+
|
8
|
+
* Merge pull request [#9](https://github.com/fastly/sidekiq-prometheus/issues/9) from we4tech/features/update-prometheus-client
|
9
|
+
|
10
|
+
|
11
|
+
<a name="v0.9.1"></a>
|
12
|
+
## [v0.9.1](https://github.com/fastly/sidekiq-prometheus/compare/v0.9.0...v0.9.1) (2019-07-08)
|
13
|
+
|
14
|
+
### Bug Fixes
|
15
|
+
|
16
|
+
* properly alias configure!
|
17
|
+
|
18
|
+
|
3
19
|
<a name="v0.9.0"></a>
|
4
20
|
## [v0.9.0](https://github.com/fastly/sidekiq-prometheus/compare/v0.8.1...v0.9.0) (2019-03-18)
|
5
21
|
|
data/README.md
CHANGED
@@ -58,24 +58,25 @@ You can configure the gem by calling `configure`:
|
|
58
58
|
|
59
59
|
```ruby
|
60
60
|
SidekiqPrometheus.configure do |config|
|
61
|
-
config.
|
61
|
+
config.preset_labels = { service: 'kubernandos_api' }
|
62
62
|
end
|
63
63
|
```
|
64
64
|
|
65
65
|
`configure` will automatically call setup so
|
66
66
|
|
67
|
-
If you are running multiple services that will be reporting Sidekiq metrics you will want to take advantage of the `
|
67
|
+
If you are running multiple services that will be reporting Sidekiq metrics you will want to take advantage of the `preset_labels` configuration option. For example:
|
68
68
|
|
69
69
|
```ruby
|
70
70
|
SidekiqPrometheus.configure do |config|
|
71
|
-
config.
|
71
|
+
config.preset_labels = { service: 'image_api' }
|
72
72
|
config.metrics_port = 9090
|
73
73
|
end
|
74
74
|
```
|
75
75
|
|
76
76
|
#### Configuration options
|
77
77
|
|
78
|
-
* `
|
78
|
+
* `preset_labels`: Hash of labels that will be included with every metric when they are registered.
|
79
|
+
* `custom_labels`: Array of names for each label that will be passed during the reporting.
|
79
80
|
* `gc_metrics_enabled`: Boolean that determines whether to record object allocation metrics per job. The default is `true`. Setting this to `false` if you don't need this metric.
|
80
81
|
* `global_metrics_enabled`: Boolean that determines whether to report global metrics from the PeriodicMetrics reporter. When `true` this will report on a number of stats from the Sidekiq API for the cluster. This requires Sidekiq::Enterprise as the reporter uses the leader election functionality to ensure that only one worker per cluster is reporting metrics.
|
81
82
|
* `periodic_metrics_enabled`: Boolean that determines whether to run the periodic metrics reporter. `PeriodicMetrics` runs a separate thread that reports on global metrics (if enabled) as well worker GC stats (if enabled). It reports metrics on the interval defined by `periodic_reporting_interval`. Defaults to `true`.
|
@@ -85,7 +86,8 @@ end
|
|
85
86
|
|
86
87
|
```ruby
|
87
88
|
SidekiqPrometheus.configure do |config|
|
88
|
-
config.
|
89
|
+
config.preset_labels = { service: 'myapp' }
|
90
|
+
config.custom_labels = [:worker_class, :job_type, :any_other_label]
|
89
91
|
config.gc_metrics_enabled = false
|
90
92
|
config.global_metrics_enabled = true
|
91
93
|
config.periodic_metrics_enabled = true
|
@@ -94,7 +96,8 @@ SidekiqPrometheus.configure do |config|
|
|
94
96
|
end
|
95
97
|
```
|
96
98
|
|
97
|
-
Custom labels may be added by defining the `prometheus_labels` method in the worker class
|
99
|
+
Custom labels may be added by defining the `prometheus_labels` method in the worker class,
|
100
|
+
prior you need to register the custom labels as of the above example:
|
98
101
|
|
99
102
|
```ruby
|
100
103
|
class SomeWorker
|
@@ -164,7 +167,7 @@ which ensures that metrics are only reported once per cluster.
|
|
164
167
|
| sidekiq_redis_keys | gauge | Number of redis keys |
|
165
168
|
| sidekiq_redis_expires | gauge | Number of redis keys with expiry set |
|
166
169
|
|
167
|
-
The global metrics are reported with the only the `
|
170
|
+
The global metrics are reported with the only the `preset_labels` with the exception of `sidekiq_enqueued` which will add a `queue` label and record a metric per Sidekiq queue.
|
168
171
|
|
169
172
|
## Custom Worker Metrics
|
170
173
|
|
@@ -175,14 +178,14 @@ There are a few different ways to register custom metrics with SidekiqPrometheus
|
|
175
178
|
name: :metric_name,
|
176
179
|
type: :gauge,
|
177
180
|
docstring: 'description',
|
178
|
-
|
181
|
+
preset_labels: { label_name: 'label_text' },
|
179
182
|
}
|
180
183
|
```
|
181
184
|
|
182
185
|
* `:name` (required) - Unique name of the metric and should be a symbol.
|
183
186
|
* `:type` (required) - Prometheus metric type. Supported values are: `:counter`, `:gauge`, `:histogram`, and `:summary`.
|
184
187
|
* `:docstring` (required) - Human readable description of the metric.
|
185
|
-
* `:
|
188
|
+
* `:preset_labels` (optional) - Hash of labels that will be applied to every instance of this metric.
|
186
189
|
|
187
190
|
#### Registering custom metrics:
|
188
191
|
|
data/lib/sidekiq_prometheus.rb
CHANGED
@@ -14,10 +14,10 @@ end
|
|
14
14
|
|
15
15
|
module SidekiqPrometheus
|
16
16
|
class << self
|
17
|
-
# @return [Hash]
|
18
|
-
attr_accessor :
|
17
|
+
# @return [Hash] Preset labels applied to every registered metric
|
18
|
+
attr_accessor :preset_labels
|
19
19
|
|
20
|
-
# @return [Hash] Custom labels applied to specific metrics
|
20
|
+
# @return [Hash{Symbol => Array<Symbol>}] Custom labels applied to specific metrics
|
21
21
|
attr_accessor :custom_labels
|
22
22
|
|
23
23
|
# @return [Array] Custom metrics that will be registered on setup.
|
@@ -27,12 +27,12 @@ module SidekiqPrometheus
|
|
27
27
|
# name: :metric_name,
|
28
28
|
# type: :prometheus_metric_type,
|
29
29
|
# docstring: 'Description of the metric',
|
30
|
-
#
|
30
|
+
# preset_labels : { label: 'value' },
|
31
31
|
# }
|
32
32
|
# ]
|
33
33
|
# @note Each element of the array is a hash and must have the required keys: `:name`, `:type`, and `:docstring`.
|
34
34
|
# The values for `:name` and `:type` should be symbols and `:docstring` should be a string.
|
35
|
-
# `
|
35
|
+
# `preset_labels` is optional and, if used, must be a hash of labels that will be included on every instance of this metric.
|
36
36
|
attr_accessor :custom_metrics
|
37
37
|
|
38
38
|
# @return [Boolean] Setting to control enabling/disabling GC metrics. Default: true
|
@@ -82,8 +82,8 @@ module SidekiqPrometheus
|
|
82
82
|
# Configure SidekiqPrometheus and setup for reporting
|
83
83
|
# @example
|
84
84
|
# SidekiqPrometheus.configure do |config|
|
85
|
-
# config.
|
86
|
-
# config.custom_labels = { sidekiq_job_count:
|
85
|
+
# config.preset_labels = { service: 'images_api' }
|
86
|
+
# config.custom_labels = { sidekiq_job_count: [:custom_label_1, :custom_label_2] } }
|
87
87
|
# config.gc_metrics_enabled = true
|
88
88
|
# end
|
89
89
|
def configure
|
@@ -15,20 +15,20 @@ class SidekiqPrometheus::JobMetrics
|
|
15
15
|
# In case the labels have changed after the worker perform method has been called
|
16
16
|
labels.merge!(custom_labels(worker))
|
17
17
|
|
18
|
-
registry[:sidekiq_job_duration].observe(
|
19
|
-
registry[:sidekiq_job_success].increment(labels)
|
18
|
+
registry[:sidekiq_job_duration].observe(duration, labels: labels)
|
19
|
+
registry[:sidekiq_job_success].increment(labels: labels)
|
20
20
|
|
21
21
|
if SidekiqPrometheus.gc_metrics_enabled?
|
22
22
|
allocated = GC.stat(:total_allocated_objects) - before
|
23
|
-
registry[:sidekiq_job_allocated_objects].observe(
|
23
|
+
registry[:sidekiq_job_allocated_objects].observe(allocated, labels: labels)
|
24
24
|
end
|
25
25
|
|
26
26
|
result
|
27
27
|
rescue StandardError => e
|
28
|
-
registry[:sidekiq_job_failed].increment(labels)
|
28
|
+
registry[:sidekiq_job_failed].increment(labels: labels)
|
29
29
|
raise e
|
30
30
|
ensure
|
31
|
-
registry[:sidekiq_job_count].increment(labels)
|
31
|
+
registry[:sidekiq_job_count].increment(labels: labels)
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
@@ -6,6 +6,7 @@ module SidekiqPrometheus::Metrics
|
|
6
6
|
UNKNOWN = 'unknown'
|
7
7
|
|
8
8
|
VALID_TYPES = %i[counter gauge histogram summary].freeze
|
9
|
+
JOB_LABELS = %i[class queue].freeze
|
9
10
|
SIDEKIQ_GLOBAL_METRICS = [
|
10
11
|
{ name: :sidekiq_workers_size,
|
11
12
|
type: :gauge,
|
@@ -15,10 +16,12 @@ module SidekiqPrometheus::Metrics
|
|
15
16
|
docstring: 'Total Dead Size', },
|
16
17
|
{ name: :sidekiq_enqueued,
|
17
18
|
type: :gauge,
|
18
|
-
docstring: 'Total Size of all known queues',
|
19
|
+
docstring: 'Total Size of all known queues',
|
20
|
+
labels: %i[queue], },
|
19
21
|
{ name: :sidekiq_queue_latency,
|
20
22
|
type: :summary,
|
21
|
-
docstring: 'Latency (in seconds) of all queues',
|
23
|
+
docstring: 'Latency (in seconds) of all queues',
|
24
|
+
labels: %i[queue], },
|
22
25
|
{ name: :sidekiq_failed,
|
23
26
|
type: :gauge,
|
24
27
|
docstring: 'Number of job executions which raised an error', },
|
@@ -42,30 +45,37 @@ module SidekiqPrometheus::Metrics
|
|
42
45
|
docstring: 'Used memory peak from Redis.info', },
|
43
46
|
{ name: :sidekiq_redis_keys,
|
44
47
|
type: :gauge,
|
45
|
-
docstring: 'Number of redis keys',
|
48
|
+
docstring: 'Number of redis keys',
|
49
|
+
labels: %i[database], },
|
46
50
|
{ name: :sidekiq_redis_expires,
|
47
51
|
type: :gauge,
|
48
|
-
docstring: 'Number of redis keys with expiry set',
|
52
|
+
docstring: 'Number of redis keys with expiry set',
|
53
|
+
labels: %i[database], },
|
49
54
|
].freeze
|
50
55
|
SIDEKIQ_JOB_METRICS = [
|
51
56
|
{ name: :sidekiq_job_count,
|
52
57
|
type: :counter,
|
53
|
-
docstring: 'Count of Sidekiq jobs',
|
58
|
+
docstring: 'Count of Sidekiq jobs',
|
59
|
+
labels: JOB_LABELS, },
|
54
60
|
{ name: :sidekiq_job_duration,
|
55
61
|
type: :histogram,
|
56
|
-
docstring: 'Sidekiq job processing duration',
|
62
|
+
docstring: 'Sidekiq job processing duration',
|
63
|
+
labels: JOB_LABELS, },
|
57
64
|
{ name: :sidekiq_job_failed,
|
58
65
|
type: :counter,
|
59
|
-
docstring: 'Count of failed Sidekiq jobs',
|
66
|
+
docstring: 'Count of failed Sidekiq jobs',
|
67
|
+
labels: JOB_LABELS, },
|
60
68
|
{ name: :sidekiq_job_success,
|
61
69
|
type: :counter,
|
62
|
-
docstring: 'Count of successful Sidekiq jobs',
|
70
|
+
docstring: 'Count of successful Sidekiq jobs',
|
71
|
+
labels: JOB_LABELS, },
|
63
72
|
].freeze
|
64
73
|
SIDEKIQ_GC_METRIC = {
|
65
74
|
name: :sidekiq_job_allocated_objects,
|
66
75
|
type: :histogram,
|
67
76
|
docstring: 'Count of ruby objects allocated by a Sidekiq job',
|
68
77
|
buckets: [10, 50, 100, 500, 1_000, 2_500, 5_000, 10_000, 50_000, 100_000, 500_000, 1_000_000, 5_000_000, 10_000_000, 25_000_000],
|
78
|
+
labels: JOB_LABELS,
|
69
79
|
}.freeze
|
70
80
|
SIDEKIQ_WORKER_GC_METRICS = [
|
71
81
|
{ name: :sidekiq_allocated_objects,
|
@@ -130,21 +140,26 @@ module SidekiqPrometheus::Metrics
|
|
130
140
|
# @param types [Symbol] type of metric to register. Valid types: %w(counter gauge summary histogram)
|
131
141
|
# @param name [Symbol] name of metric
|
132
142
|
# @param docstring [String] help text for metric
|
133
|
-
# @param
|
143
|
+
# @param labels [Array] Optionally an array of labels to configure for every instance of this metric
|
144
|
+
# @param preset_labels [Hash] Optionally a Hash of labels to use for every instance of this metric
|
134
145
|
# @param buckets [Hash] Optional hash of bucket values. Only used for histogram metrics.
|
135
|
-
def register(type:, name:, docstring:,
|
146
|
+
def register(type:, name:, docstring:, labels: [], preset_labels: {}, buckets: nil)
|
136
147
|
raise InvalidMetricType, type unless VALID_TYPES.include? type
|
137
148
|
|
138
|
-
|
149
|
+
# Aggregate all preset labels
|
150
|
+
all_preset_labels = preset_labels.dup
|
151
|
+
all_preset_labels.merge!(SidekiqPrometheus.preset_labels) if SidekiqPrometheus.preset_labels
|
139
152
|
|
140
|
-
|
141
|
-
|
153
|
+
# Aggregate all labels
|
154
|
+
all_labels = labels | SidekiqPrometheus.custom_labels.fetch(name, []) | all_preset_labels.keys
|
142
155
|
|
143
|
-
|
144
|
-
|
145
|
-
|
156
|
+
options = { docstring: docstring,
|
157
|
+
labels: all_labels,
|
158
|
+
preset_labels: all_preset_labels, }
|
146
159
|
|
147
|
-
|
160
|
+
options[:buckets] = buckets if buckets
|
161
|
+
|
162
|
+
registry.send(type, name.to_sym, options)
|
148
163
|
end
|
149
164
|
|
150
165
|
def unregister(name:)
|
@@ -71,13 +71,13 @@ class SidekiqPrometheus::PeriodicMetrics
|
|
71
71
|
def report_gc_metrics
|
72
72
|
stats = GC.stat
|
73
73
|
GC_STATS[:counters].each do |stat|
|
74
|
-
SidekiqPrometheus["sidekiq_#{stat}"]&.increment({}, stats[stat])
|
74
|
+
SidekiqPrometheus["sidekiq_#{stat}"]&.increment(labels: {}, by: stats[stat])
|
75
75
|
end
|
76
76
|
GC_STATS[:gauges].each do |stat|
|
77
|
-
SidekiqPrometheus["sidekiq_#{stat}"]&.set(
|
77
|
+
SidekiqPrometheus["sidekiq_#{stat}"]&.set(stats[stat], labels: {})
|
78
78
|
end
|
79
79
|
|
80
|
-
SidekiqPrometheus[:sidekiq_rss]&.set({}
|
80
|
+
SidekiqPrometheus[:sidekiq_rss]&.set(rss, labels: {})
|
81
81
|
end
|
82
82
|
|
83
83
|
##
|
@@ -85,12 +85,12 @@ class SidekiqPrometheus::PeriodicMetrics
|
|
85
85
|
def report_global_metrics
|
86
86
|
current_stats = sidekiq_stats.new
|
87
87
|
GLOBAL_STATS.each do |stat|
|
88
|
-
SidekiqPrometheus["sidekiq_#{stat}"]&.set(
|
88
|
+
SidekiqPrometheus["sidekiq_#{stat}"]&.set(current_stats.send(stat), labels: {})
|
89
89
|
end
|
90
90
|
|
91
91
|
sidekiq_queue.all.each do |queue|
|
92
|
-
SidekiqPrometheus[:sidekiq_enqueued]&.set({ queue: queue.name }
|
93
|
-
SidekiqPrometheus[:sidekiq_queue_latency]&.observe({ queue: queue.name }
|
92
|
+
SidekiqPrometheus[:sidekiq_enqueued]&.set(queue.size, labels: { queue: queue.name })
|
93
|
+
SidekiqPrometheus[:sidekiq_queue_latency]&.observe(queue.latency, labels: { queue: queue.name })
|
94
94
|
end
|
95
95
|
end
|
96
96
|
|
@@ -106,15 +106,15 @@ class SidekiqPrometheus::PeriodicMetrics
|
|
106
106
|
return if redis_info.nil?
|
107
107
|
|
108
108
|
REDIS_STATS.each do |stat|
|
109
|
-
SidekiqPrometheus["sidekiq_redis_#{stat}"]&.set(
|
109
|
+
SidekiqPrometheus["sidekiq_redis_#{stat}"]&.set(redis_info[stat].to_i, labels: {})
|
110
110
|
end
|
111
111
|
|
112
112
|
db_stats = redis_info.select { |k, _v| k.match(/^db/) }
|
113
113
|
db_stats.each do |db, stat|
|
114
114
|
label = { database: db }
|
115
115
|
values = stat.scan(/\d+/)
|
116
|
-
SidekiqPrometheus[:sidekiq_redis_keys]&.set(
|
117
|
-
SidekiqPrometheus[:sidekiq_redis_expires]&.set(
|
116
|
+
SidekiqPrometheus[:sidekiq_redis_keys]&.set(values[0].to_i, labels: label)
|
117
|
+
SidekiqPrometheus[:sidekiq_redis_expires]&.set(values[1].to_i, labels: label)
|
118
118
|
end
|
119
119
|
end
|
120
120
|
|
data/sidekiq_prometheus.gemspec
CHANGED
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
28
28
|
spec.add_development_dependency 'rubocop', '~> 0.58.0'
|
29
29
|
|
30
|
-
spec.add_runtime_dependency 'prometheus-client', '~> 0.
|
30
|
+
spec.add_runtime_dependency 'prometheus-client', '~> 0.10.0'
|
31
31
|
spec.add_runtime_dependency 'rack'
|
32
|
-
spec.add_runtime_dependency 'sidekiq', '
|
32
|
+
spec.add_runtime_dependency 'sidekiq', '~> 5.1'
|
33
33
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq_prometheus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lukas Eklund
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-10-
|
11
|
+
date: 2019-10-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -86,14 +86,14 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 0.
|
89
|
+
version: 0.10.0
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 0.
|
96
|
+
version: 0.10.0
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rack
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -112,14 +112,14 @@ dependencies:
|
|
112
112
|
name: sidekiq
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- - "
|
115
|
+
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: '5.1'
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- - "
|
122
|
+
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '5.1'
|
125
125
|
description:
|