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
JOB_LABELS =
%i[class queue].freeze
SIDEKIQ_GLOBAL_METRICS =
{name: :sidekiq_workers_size,
   type: :gauge,
   docstring: "Total number of workers processing jobs"},
  {name: :sidekiq_processes_size,
   type: :gauge,
   docstring: "Total number of running sidekiq processes"},
  {name: :sidekiq_dead_size,
   type: :gauge,
   docstring: "Total Dead Size"},
  {name: :sidekiq_enqueued,
   type: :gauge,
   docstring: "Total Size of all known queues",
   labels: %i[queue]},
  {name: :sidekiq_queue_latency,
   type: :summary,
   docstring: "Latency (in seconds) of all queues",
   labels: %i[queue]},
  {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",
   labels: %i[database]},
  {name: :sidekiq_redis_expires,
   type: :gauge,
   docstring: "Number of redis keys with expiry set",
   labels: %i[database]}
].freeze
SIDEKIQ_JOB_METRICS =
[
  {name: :sidekiq_job_count,
   type: :counter,
   docstring: "Count of Sidekiq jobs",
   labels: JOB_LABELS},
  {name: :sidekiq_job_duration,
   type: :histogram,
   docstring: "Sidekiq job processing duration",
   labels: JOB_LABELS},
  {name: :sidekiq_job_failed,
   type: :counter,
   docstring: "Count of failed Sidekiq jobs",
   labels: JOB_LABELS + [:error_class]},
  {name: :sidekiq_job_success,
   type: :counter,
   docstring: "Count of successful Sidekiq jobs",
   labels: JOB_LABELS},
  {name: :sidekiq_job_over_limit,
   type: :counter,
   docstring: "Count of over limit Sidekiq jobs",
   labels: JOB_LABELS}
].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],
  labels: JOB_LABELS
}.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



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

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

.register(type:, name:, docstring:, labels: [], preset_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

  • labels (Array) (defaults to: [])

    Optionally an array of labels to configure for every instance of this metric

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

    Optionally a Hash of 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:



163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# File 'lib/sidekiq_prometheus/metrics.rb', line 163

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

  # Aggregate all preset labels
  all_preset_labels = preset_labels.dup
  all_preset_labels.merge!(SidekiqPrometheus.preset_labels) if SidekiqPrometheus.preset_labels

  # Aggregate all labels
  all_labels = labels | SidekiqPrometheus.custom_labels.fetch(name, []) | all_preset_labels.keys

  options = {docstring: docstring,
             labels: all_labels,
             preset_labels: all_preset_labels}

  options[:buckets] = buckets if buckets

  registry.send(type, name.to_sym, **options)
end

.register_metrics(metrics) ⇒ Object



128
129
130
131
132
# File 'lib/sidekiq_prometheus/metrics.rb', line 128

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

.register_sidekiq_gc_metricObject



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

def register_sidekiq_gc_metric
  register(**SIDEKIQ_GC_METRIC)
end

.register_sidekiq_global_metricsObject



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

def register_sidekiq_global_metrics
  register_metrics SIDEKIQ_GLOBAL_METRICS
end

.register_sidekiq_job_metricsObject



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

def register_sidekiq_job_metrics
  register_metrics SIDEKIQ_JOB_METRICS
end

.register_sidekiq_worker_gc_metricsObject



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

def register_sidekiq_worker_gc_metrics
  register_metrics SIDEKIQ_WORKER_GC_METRICS
end

.registryObject



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

def registry
  SidekiqPrometheus.registry
end

.unregister(name:) ⇒ Object



182
183
184
# File 'lib/sidekiq_prometheus/metrics.rb', line 182

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

.unregister_metrics(metrics) ⇒ Object



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

def unregister_metrics(metrics)
  metrics.each do |metric|
    unregister(name: metric[:name])
  end
end

.unregister_sidekiq_global_metricsObject



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

def unregister_sidekiq_global_metrics
  unregister_metrics SIDEKIQ_GLOBAL_METRICS
end