Module: SidekiqPrometheus

Defined in:
lib/sidekiq_prometheus.rb,
lib/sidekiq_prometheus/version.rb

Defined Under Namespace

Modules: Metrics Classes: Error, JobMetrics, PeriodicMetrics

Constant Summary collapse

VERSION =
"2.0.1"

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.clientObject

Returns Prometheus::Client.

Returns:

  • Prometheus::Client



99
100
101
# File 'lib/sidekiq_prometheus.rb', line 99

def client
  @client ||= Prometheus::Client
end

.custom_labelsHash{Symbol => Array<Symbol>}

Returns Custom labels applied to specific metrics.

Returns:

  • (Hash{Symbol => Array<Symbol>})

    Custom labels applied to specific metrics



22
23
24
# File 'lib/sidekiq_prometheus.rb', line 22

def custom_labels
  @custom_labels
end

.custom_metricsArray

Note:

Each element of the array is a hash and must have the required keys: ‘:name`, `:type`, and `:docstring`. The values for `:name` and `:type` should be symbols and `:docstring` should be a string. `preset_labels` is optional and, if used, must be a hash of labels that will be included on every instance of this metric.

Returns Custom metrics that will be registered on setup.

Examples:

[
  {
    name: :metric_name,
    type: :prometheus_metric_type,
    docstring: 'Description of the metric',
    preset_labels : { label: 'value' },
  }
]

Returns:

  • (Array)

    Custom metrics that will be registered on setup.



37
38
39
# File 'lib/sidekiq_prometheus.rb', line 37

def custom_metrics
  @custom_metrics
end

.gc_metrics_enabledBoolean

Returns Setting to control enabling/disabling GC metrics. Default: true.

Returns:

  • (Boolean)

    Setting to control enabling/disabling GC metrics. Default: true



40
41
42
# File 'lib/sidekiq_prometheus.rb', line 40

def gc_metrics_enabled
  @gc_metrics_enabled
end

.global_metrics_enabledBoolean

Returns Setting to control enabling/disabling global metrics. Default: true.

Returns:

  • (Boolean)

    Setting to control enabling/disabling global metrics. Default: true



43
44
45
# File 'lib/sidekiq_prometheus.rb', line 43

def global_metrics_enabled
  @global_metrics_enabled
end

.init_label_setsHash{Symbol => Array(Hash)}

metric_name: [{label: 'value1', other_label: 'value1', 'value1', other_label: 'value2'],
another_metric_name: ['value1', other_label: 'value1']

}

Returns:

  • (Hash{Symbol => Array(Hash)})

    Label sets that will be initiliazed when a metric is registered.



51
52
53
# File 'lib/sidekiq_prometheus.rb', line 51

def init_label_sets
  @init_label_sets
end

.metrics_hostString

Returns Host on which the metrics server will listen. Default: localhost.

Returns:

  • (String)

    Host on which the metrics server will listen. Default: localhost



63
64
65
# File 'lib/sidekiq_prometheus.rb', line 63

def metrics_host
  @metrics_host
end

.metrics_portInteger

Returns Port on which the metrics server will listen. Default: 9357.

Returns:

  • (Integer)

    Port on which the metrics server will listen. Default: 9357



66
67
68
# File 'lib/sidekiq_prometheus.rb', line 66

def metrics_port
  @metrics_port
end

.metrics_server_enabledBoolean

Returns Setting to control enabling/disabling the metrics server. Default: true.

Returns:

  • (Boolean)

    Setting to control enabling/disabling the metrics server. Default: true



60
61
62
# File 'lib/sidekiq_prometheus.rb', line 60

def metrics_server_enabled
  @metrics_server_enabled
end

.metrics_server_logger_enabledBoolean

Returns When set to false will silence the metric server access logs. Default: true.

Returns:

  • (Boolean)

    When set to false will silence the metric server access logs. Default: true



69
70
71
# File 'lib/sidekiq_prometheus.rb', line 69

def metrics_server_logger_enabled
  @metrics_server_logger_enabled
end

.periodic_metrics_enabledBoolean

Returns Setting to control enabling/disabling periodic metrics. Default: true.

Returns:

  • (Boolean)

    Setting to control enabling/disabling periodic metrics. Default: true



54
55
56
# File 'lib/sidekiq_prometheus.rb', line 54

def periodic_metrics_enabled
  @periodic_metrics_enabled
end

.periodic_reporting_intervalInteger

Returns Interval in seconds to record metrics. Default: 30.

Returns:

  • (Integer)

    Interval in seconds to record metrics. Default: 30



57
58
59
# File 'lib/sidekiq_prometheus.rb', line 57

def periodic_reporting_interval
  @periodic_reporting_interval
end

.preset_labelsHash

Returns Preset labels applied to every registered metric.

Returns:

  • (Hash)

    Preset labels applied to every registered metric



19
20
21
# File 'lib/sidekiq_prometheus.rb', line 19

def preset_labels
  @preset_labels
end

.registryPrometheus::Client::Registry

Prometheus client metric registry

Returns:

  • (Prometheus::Client::Registry)


168
169
170
# File 'lib/sidekiq_prometheus.rb', line 168

def registry
  @registry ||= client::Registry.new
end

.setup_complete=(value) ⇒ Object (writeonly)



80
81
82
# File 'lib/sidekiq_prometheus.rb', line 80

def setup_complete=(value)
  @setup_complete = value
end

Class Method Details

.[](metric) ⇒ Prometheus::Client::Metric Also known as: get

Get a metric from the registry

Parameters:

  • metric (Symbol)

    name of metric to fetch

Returns:

  • (Prometheus::Client::Metric)


156
157
158
# File 'lib/sidekiq_prometheus.rb', line 156

def [](metric)
  registry.get(metric.to_sym)
end

.configure {|_self| ... } ⇒ Object Also known as: configure!

Configure SidekiqPrometheus and setup for reporting

Examples:

SidekiqPrometheus.configure do |config|
  config.preset_labels = { service: 'images_api' }
  config.custom_labels = { sidekiq_job_count: [:custom_label_1, :custom_label_2] } }
  config.gc_metrics_enabled = true
end

Yields:

  • (_self)

Yield Parameters:



111
112
113
114
# File 'lib/sidekiq_prometheus.rb', line 111

def configure
  yield self
  setup
end

.gc_metrics_enabled?Boolean

Helper method for gc_metrics_enabled configuration setting

Returns:

  • (Boolean)

    defaults to true



118
119
120
# File 'lib/sidekiq_prometheus.rb', line 118

def gc_metrics_enabled?
  gc_metrics_enabled
end

.global_metrics_enabled?Boolean

Helper method for global_metrics_enabled configuration setting Requires Sidekiq::Enterprise as it uses the leader election functionality

Returns:

  • (Boolean)

    defaults to true if Sidekiq::Enterprise is available



126
127
128
# File 'lib/sidekiq_prometheus.rb', line 126

def global_metrics_enabled?
  Object.const_defined?("Sidekiq::Enterprise") && global_metrics_enabled
end

.metrics_serverObject

Start a new Prometheus exporter in a new thread. Will listen on SidekiqPrometheus.metrics_host and SidekiqPrometheus.metrics_port



221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
# File 'lib/sidekiq_prometheus.rb', line 221

def metrics_server
  opts = {
    Port: SidekiqPrometheus.metrics_port,
    Host: SidekiqPrometheus.metrics_host
  }

  unless metrics_server_logger_enabled?
    opts[:Logger] = WEBrick::Log.new("/dev/null")
    opts[:AccessLog] = []
  end

  @_metrics_server ||= Thread.new do
    Rack::Handler::WEBrick.run(
      Rack::Builder.new {
        use Prometheus::Middleware::Exporter, registry: SidekiqPrometheus.registry
        run ->(_) { [301, {"Location" => "/metrics"}, []] }
      },
      **opts
    )
  end
end

.metrics_server_enabled?Boolean

Helper method for metrics_server_enabled configuration setting

Returns:

  • (Boolean)

    defaults to true



141
142
143
# File 'lib/sidekiq_prometheus.rb', line 141

def metrics_server_enabled?
  metrics_server_enabled
end

.metrics_server_logger_enabled?Boolean

Helper method for metrics_server_logger_enabled configuration setting

Returns:

  • (Boolean)

    defaults to true



148
149
150
# File 'lib/sidekiq_prometheus.rb', line 148

def metrics_server_logger_enabled?
  metrics_server_logger_enabled
end

.periodic_metrics_enabled?Boolean

Helper method for periodic_metrics_enabled configuration setting Requires Sidekiq::Enterprise as it uses the leader election functionality

Returns:

  • (Boolean)

    defaults to true if Sidekiq::Enterprise is available



134
135
136
# File 'lib/sidekiq_prometheus.rb', line 134

def periodic_metrics_enabled?
  periodic_metrics_enabled
end

.register_custom_metricsObject

Register custom metrics Internal method called by setup. This method should not be called from application code in most cases.



175
176
177
178
179
180
181
# File 'lib/sidekiq_prometheus.rb', line 175

def register_custom_metrics
  return if custom_metrics.empty?

  raise SidekiqPrometheus::Error, "custom_metrics is not an array." unless custom_metrics.is_a?(Array)

  SidekiqPrometheus::Metrics.register_metrics(custom_metrics)
end

.setupObject

register metrics and instrument sidekiq



185
186
187
188
189
190
191
192
193
194
195
# File 'lib/sidekiq_prometheus.rb', line 185

def setup
  return false if @setup_complete
  SidekiqPrometheus::Metrics.register_sidekiq_job_metrics
  SidekiqPrometheus::Metrics.register_sidekiq_gc_metric if gc_metrics_enabled?
  SidekiqPrometheus::Metrics.register_sidekiq_worker_gc_metrics if gc_metrics_enabled? && periodic_metrics_enabled?
  register_custom_metrics

  sidekiq_setup

  self.setup_complete = true
end

.sidekiq_setupObject

Add Prometheus instrumentation to sidekiq



199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
# File 'lib/sidekiq_prometheus.rb', line 199

def sidekiq_setup
  Sidekiq.configure_server do |config|
    config.server_middleware do |chain|
      chain.add SidekiqPrometheus::JobMetrics
    end

    if periodic_metrics_enabled?
      config.on(:startup) { SidekiqPrometheus::PeriodicMetrics.reporter(config).start }
      config.on(:shutdown) { SidekiqPrometheus::PeriodicMetrics.reporter(config).stop }
    end

    if metrics_server_enabled?
      config.on(:startup) { SidekiqPrometheus.metrics_server }
      config.on(:shutdown) { SidekiqPrometheus.metrics_server.kill }
    end
  end
end

.sidekiq_seven?Boolean

Returns:

  • (Boolean)


243
244
245
# File 'lib/sidekiq_prometheus.rb', line 243

def sidekiq_seven?
  @sk7 ||= Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new("7.0")
end