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.8.3"

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.clientObject

Returns Prometheus::Client.

Returns:

  • Prometheus::Client



90
91
92
# File 'lib/sidekiq_prometheus.rb', line 90

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

.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



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

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



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

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



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

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



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

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



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

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



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

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)


159
160
161
# File 'lib/sidekiq_prometheus.rb', line 159

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

.setup_complete=(value) ⇒ Object (writeonly)



72
73
74
# File 'lib/sidekiq_prometheus.rb', line 72

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)


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

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:



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

def configure
  yield self
  setup
end

.gc_metrics_enabled?Boolean

Helper method for gc_metrics_enabled configuration setting

Returns:

  • (Boolean)

    defaults to true



109
110
111
# File 'lib/sidekiq_prometheus.rb', line 109

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



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

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



212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
# File 'lib/sidekiq_prometheus.rb', line 212

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



132
133
134
# File 'lib/sidekiq_prometheus.rb', line 132

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



139
140
141
# File 'lib/sidekiq_prometheus.rb', line 139

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



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

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.



166
167
168
169
170
171
172
# File 'lib/sidekiq_prometheus.rb', line 166

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



176
177
178
179
180
181
182
183
184
185
186
# File 'lib/sidekiq_prometheus.rb', line 176

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



190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
# File 'lib/sidekiq_prometheus.rb', line 190

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