Module: SidekiqPrometheus::Metrics

Defined in:
lib/sidekiq_prometheus/metrics.rb

Defined Under Namespace

Classes: InvalidMetricType

Constant Summary collapse

UNKNOWN =
'unknown'
VALID_TYPES =
%i[counter gauge histogram summary].freeze
SIDEKIQ_GLOBAL_METRICS =
[
  { name:      :sidekiq_workers_size,
    type:      :gauge,
    docstring: 'Total number of workers processing jobs', },
  { name:      :sidekiq_dead_size,
    type:      :gauge,
    docstring: 'Total Dead Size', },
  { name:      :sidekiq_enqueued,
    type:      :gauge,
    docstring: 'Total Size of all known queues', },
  { name:      :sidekiq_queue_latency,
    type:      :summary,
    docstring: 'Latency (in seconds) of all queues', },
  { name:      :sidekiq_failed,
    type:      :gauge,
    docstring: 'Number of job executions which raised an error', },
  { name:      :sidekiq_processed,
    type:      :gauge,
    docstring: 'Number of job executions completed (success or failure)', },
  { name:      :sidekiq_retry_size,
    type:      :gauge,
    docstring: 'Total Retries Size', },
  { name:      :sidekiq_scheduled_size,
    type:      :gauge,
    docstring: 'Total Scheduled Size', },
  { name:      :sidekiq_redis_connected_clients,
    type:      :gauge,
    docstring: 'Number of clients connected to Redis instance for Sidekiq', },
  { name:      :sidekiq_redis_used_memory,
    type:      :gauge,
    docstring: 'Used memory from Redis.info', },
  { name:      :sidekiq_redis_used_memory_peak,
    type:      :gauge,
    docstring: 'Used memory peak from Redis.info', },
  { name:      :sidekiq_redis_keys,
    type:      :gauge,
    docstring: 'Number of redis keys', },
  { name:      :sidekiq_redis_expires,
    type:      :gauge,
    docstring: 'Number of redis keys with expiry set', },
].freeze
SIDEKIQ_JOB_METRICS =
[
  { name:      :sidekiq_job_count,
    type:      :counter,
    docstring: 'Count of Sidekiq jobs', },
  { name:      :sidekiq_job_duration,
    type:      :histogram,
    docstring: 'Sidekiq job processing duration', },
  { name:      :sidekiq_job_failed,
    type:      :counter,
    docstring: 'Count of failed Sidekiq jobs', },
  { name:      :sidekiq_job_success,
    type:      :counter,
    docstring: 'Count of successful Sidekiq jobs', },
].freeze
SIDEKIQ_GC_METRIC =
{
  name:      :sidekiq_job_allocated_objects,
  type:      :histogram,
  docstring: 'Count of ruby objects allocated by a Sidekiq job',
  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],
}.freeze
SIDEKIQ_WORKER_GC_METRICS =
[
  { name:      :sidekiq_allocated_objects,
    type:      :counter,
    docstring: 'Count of ruby objects allocated by a Sidekiq worker', },
  { name:      :sidekiq_heap_free_slots,
    type:      :gauge,
    docstring: 'Sidekiq worker GC.stat[:heap_free_slots]', },
  { name:      :sidekiq_heap_live_slots,
    type:      :gauge,
    docstring: 'Sidekiq worker GC.stat[:heap_live_slots]', },
  { name:      :sidekiq_major_gc_count,
    type:      :counter,
    docstring: 'Sidekiq worker GC.stat[:major_gc_count]', },
  { name:      :sidekiq_minor_gc_count,
    type:      :counter,
    docstring: 'Sidekiq worker GC.stat[:minor_gc_count]', },
  { name:      :sidekiq_rss,
    type:      :gauge,
    docstring: 'Sidekiq process RSS', },
].freeze

Class Method Summary collapse

Class Method Details

.[](name) ⇒ Object Also known as: get

Fetch a metric from the registry

Parameters:

  • name (Symbol)

    name of metric to fetch



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

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

.register(type:, name:, docstring:, base_labels: {}, buckets: nil) ⇒ Object

Register a new metric

Parameters:

  • types (Symbol)

    type of metric to register. Valid types: %w(counter gauge summary histogram)

  • name (Symbol)

    name of metric

  • docstring (String)

    help text for metric

  • base_labels (Hash) (defaults to: {})

    Optional hash of base labels to use for every instance of this metric

  • buckets (Hash) (defaults to: nil)

    Optional hash of bucket values. Only used for histogram metrics.

Raises:



135
136
137
138
139
140
141
142
143
144
145
146
147
148
# File 'lib/sidekiq_prometheus/metrics.rb', line 135

def register(type:, name:, docstring:, base_labels: {}, buckets: nil)
  raise InvalidMetricType, type unless VALID_TYPES.include? type

  custom_labels = SidekiqPrometheus.custom_labels[name]

  base_labels.merge! custom_labels if custom_labels&.is_a?(Hash)
  base_labels.merge! SidekiqPrometheus.base_labels if SidekiqPrometheus.base_labels

  args = [name.to_sym, docstring]
  args << base_labels
  args << buckets if buckets

  registry.send(type, *args)
end

.register_metrics(metrics) ⇒ Object



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

def register_metrics(metrics)
  metrics.each do |metric|
    register(metric)
  end
end

.register_sidekiq_gc_metricObject



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

def register_sidekiq_gc_metric
  register SIDEKIQ_GC_METRIC
end

.register_sidekiq_global_metricsObject



107
108
109
# File 'lib/sidekiq_prometheus/metrics.rb', line 107

def register_sidekiq_global_metrics
  register_metrics SIDEKIQ_GLOBAL_METRICS
end

.register_sidekiq_job_metricsObject



95
96
97
# File 'lib/sidekiq_prometheus/metrics.rb', line 95

def register_sidekiq_job_metrics
  register_metrics SIDEKIQ_JOB_METRICS
end

.register_sidekiq_worker_gc_metricsObject



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

def register_sidekiq_worker_gc_metrics
  register_metrics SIDEKIQ_WORKER_GC_METRICS
end

.registryObject



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

def registry
  SidekiqPrometheus.registry
end

.unregister(name:) ⇒ Object



150
151
152
# File 'lib/sidekiq_prometheus/metrics.rb', line 150

def unregister(name:)
  registry.unregister(name.to_sym)
end