module SidekiqPrometheus

Constants

VERSION

Attributes

client[W]

Override the default Prometheus::Client @return [Prometheus::Client]

custom_labels[RW]

@return [Hash{Symbol => Array<Symbol>}] Custom labels applied to specific metrics

custom_metrics[RW]

@return [Array] Custom metrics that will be registered on setup. @example

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

@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.
gc_metrics_enabled[RW]

@return [Boolean] Setting to control enabling/disabling GC metrics. Default: true

global_metrics_enabled[RW]

@return [Boolean] Setting to control enabling/disabling global metrics. Default: true

metrics_host[RW]

@return [String] Host on which the metrics server will listen. Default: localhost

metrics_port[RW]

@return [Integer] Port on which the metrics server will listen. Default: 9357

metrics_server_enabled[RW]

@return [Boolean] Setting to control enabling/disabling the metrics server. Default: true

metrics_server_logger_enabled[RW]

@return [Boolean] When set to false will silence the metric server access logs. Default: true

periodic_metrics_enabled[RW]

@return [Boolean] Setting to control enabling/disabling periodic metrics. Default: true

periodic_reporting_interval[RW]

@return [Integer] Interval in seconds to record metrics. Default: 30

preset_labels[RW]

@return [Hash] Preset labels applied to every registered metric

registry[W]

Orverride the default Prometheus Metric Registry @return [Prometheus::Client::Registry]

setup_complete[W]

@private

Public Instance Methods

[](metric) click to toggle source

Get a metric from the registry @param metric [Symbol] name of metric to fetch @return [Prometheus::Client::Metric]

# File lib/sidekiq_prometheus.rb, line 147
def [](metric)
  registry.get(metric.to_sym)
end
client() click to toggle source

@return Prometheus::Client

# File lib/sidekiq_prometheus.rb, line 90
def client
  @client ||= Prometheus::Client
end
configure() { |self| ... } click to toggle source

Configure SidekiqPrometheus and setup for reporting @example

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
# File lib/sidekiq_prometheus.rb, line 102
def configure
  yield self
  setup
end
gc_metrics_enabled?() click to toggle source

Helper method for gc_metrics_enabled configuration setting @return [Boolean] defaults to true

# File lib/sidekiq_prometheus.rb, line 109
def gc_metrics_enabled?
  gc_metrics_enabled
end
global_metrics_enabled?() click to toggle source

Helper method for global_metrics_enabled configuration setting Requires Sidekiq::Enterprise as it uses the leader election functionality @return [Boolean] defaults to true if Sidekiq::Enterprise is available

# File lib/sidekiq_prometheus.rb, line 117
def global_metrics_enabled?
  Object.const_defined?('Sidekiq::Enterprise') && global_metrics_enabled
end
metrics_server() click to toggle source

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

# File lib/sidekiq_prometheus.rb, line 213
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?() click to toggle source

Helper method for metrics_server_enabled configuration setting @return [Boolean] defaults to true

# File lib/sidekiq_prometheus.rb, line 132
def metrics_server_enabled?
  metrics_server_enabled
end
metrics_server_logger_enabled?() click to toggle source

Helper method for metrics_server_logger_enabled configuration setting @return [Boolean] defaults to true

# File lib/sidekiq_prometheus.rb, line 139
def metrics_server_logger_enabled?
  metrics_server_logger_enabled
end
periodic_metrics_enabled?() click to toggle source

Helper method for periodic_metrics_enabled configuration setting Requires Sidekiq::Enterprise as it uses the leader election functionality @return [Boolean] defaults to true if Sidekiq::Enterprise is available

# File lib/sidekiq_prometheus.rb, line 125
def periodic_metrics_enabled?
  periodic_metrics_enabled
end
register_custom_metrics() click to toggle source

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

# 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
registry() click to toggle source

Prometheus client metric registry @return [Prometheus::Client::Registry]

# File lib/sidekiq_prometheus.rb, line 159
def registry
  @registry ||= client::Registry.new
end
setup() click to toggle source

register metrics and instrument sidekiq

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

  sidekiq_setup

  self.setup_complete = true
end
sidekiq_setup() click to toggle source

Add Prometheus instrumentation to sidekiq

# File lib/sidekiq_prometheus.rb, line 191
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