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 =
'1.2.0'

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.clientObject

Returns Prometheus::Client.

Returns:

  • Prometheus::Client



85
86
87
# File 'lib/sidekiq_prometheus.rb', line 85

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



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

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.



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

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



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

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



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

def global_metrics_enabled
  @global_metrics_enabled
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



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

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



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

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



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

def metrics_server_enabled
  @metrics_server_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



45
46
47
# File 'lib/sidekiq_prometheus.rb', line 45

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



48
49
50
# File 'lib/sidekiq_prometheus.rb', line 48

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



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

def preset_labels
  @preset_labels
end

.registryPrometheus::Client::Registry

Prometheus client metric registry

Returns:

  • (Prometheus::Client::Registry)


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

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

.setup_complete=(value) ⇒ Object (writeonly)



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

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)


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

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:



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

def configure
  yield self
  setup
end

.gc_metrics_enabled?Boolean

Helper method for gc_metrics_enabled configuration setting

Returns:

  • (Boolean)

    defaults to true



104
105
106
# File 'lib/sidekiq_prometheus.rb', line 104

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



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

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



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

def metrics_server
  @_metrics_server ||= Thread.new do
    Rack::Handler::WEBrick.run(
      Rack::Builder.new {
        use Prometheus::Middleware::Exporter, registry: SidekiqPrometheus.registry
        run ->(_) { [301, { 'Location' => '/metrics' }, []] }
      },
      Port: SidekiqPrometheus.metrics_port,
      Host: SidekiqPrometheus.metrics_host,
    )
  end
end

.metrics_server_enabled?Boolean

Helper method for metrics_server_enabled configuration setting

Returns:

  • (Boolean)

    defaults to true



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

def metrics_server_enabled?
  metrics_server_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



120
121
122
# File 'lib/sidekiq_prometheus.rb', line 120

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.



154
155
156
157
158
159
160
# File 'lib/sidekiq_prometheus.rb', line 154

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



164
165
166
167
168
169
170
171
172
173
174
175
# File 'lib/sidekiq_prometheus.rb', line 164

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?
  SidekiqPrometheus::Metrics.register_sidekiq_global_metrics if global_metrics_enabled? && periodic_metrics_enabled?
  register_custom_metrics

  sidekiq_setup

  self.setup_complete = true
end

.sidekiq_setupObject

Add Prometheus instrumentation to sidekiq



179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
# File 'lib/sidekiq_prometheus.rb', line 179

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.start }
      config.on(:shutdown) { SidekiqPrometheus::PeriodicMetrics.reporter.stop }
    end

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