Add an optional metric exporter (#33734)
This commit is contained in:
parent
b868e30fdf
commit
59384282ed
6 changed files with 119 additions and 0 deletions
24
config/initializers/prometheus_exporter.rb
Normal file
24
config/initializers/prometheus_exporter.rb
Normal file
|
@ -0,0 +1,24 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
if ENV['MASTODON_PROMETHEUS_EXPORTER_ENABLED'] == 'true'
|
||||
if ENV['MASTODON_PROMETHEUS_EXPORTER_LOCAL'] == 'true'
|
||||
require 'prometheus_exporter/server'
|
||||
require 'prometheus_exporter/client'
|
||||
|
||||
# bind is the address, on which the webserver will listen
|
||||
# port is the port that will provide the /metrics route
|
||||
server = PrometheusExporter::Server::WebServer.new bind: ENV.fetch('MASTODON_PROMETHEUS_EXPORTER_HOST', 'localhost'), port: ENV.fetch('MASTODON_PROMETHEUS_EXPORTER_PORT', '9394').to_i
|
||||
server.start
|
||||
|
||||
# wire up a default local client
|
||||
PrometheusExporter::Client.default = PrometheusExporter::LocalClient.new(collector: server.collector)
|
||||
end
|
||||
|
||||
if ENV['MASTODON_PROMETHEUS_EXPORTER_WEB_DETAILED_METRICS'] == 'true'
|
||||
# Optional, as those metrics might generate extra overhead and be redundant with what OTEL provides
|
||||
require 'prometheus_exporter/middleware'
|
||||
|
||||
# Per-action/controller request stats like HTTP status and timings
|
||||
Rails.application.middleware.unshift PrometheusExporter::Middleware
|
||||
end
|
||||
end
|
|
@ -22,6 +22,48 @@ Sidekiq.configure_server do |config|
|
|||
end
|
||||
end
|
||||
|
||||
if ENV['MASTODON_PROMETHEUS_EXPORTER_ENABLED'] == 'true'
|
||||
require 'prometheus_exporter'
|
||||
require 'prometheus_exporter/instrumentation'
|
||||
|
||||
config.on :startup do
|
||||
# Ruby process metrics (memory, GC, etc)
|
||||
PrometheusExporter::Instrumentation::Process.start type: 'sidekiq'
|
||||
|
||||
# Sidekiq process metrics (concurrency, busy, etc)
|
||||
PrometheusExporter::Instrumentation::SidekiqProcess.start
|
||||
|
||||
# ActiveRecord metrics (connection pool usage)
|
||||
PrometheusExporter::Instrumentation::ActiveRecord.start(
|
||||
custom_labels: { type: 'sidekiq' },
|
||||
config_labels: [:database, :host]
|
||||
)
|
||||
|
||||
if ENV['MASTODON_PROMETHEUS_EXPORTER_SIDEKIQ_DETAILED_METRICS'] == 'true'
|
||||
# Optional, as those metrics might generate extra overhead and be redundant with what OTEL provides
|
||||
|
||||
# Per-job metrics
|
||||
config.server_middleware do |chain|
|
||||
chain.add PrometheusExporter::Instrumentation::Sidekiq
|
||||
end
|
||||
config.death_handlers << PrometheusExporter::Instrumentation::Sidekiq.death_handler
|
||||
|
||||
# Per-queue metrics for queues handled by this process (size, latency, etc)
|
||||
# They will be reported by every process handling those queues, so do not sum them up
|
||||
PrometheusExporter::Instrumentation::SidekiqQueue.start
|
||||
|
||||
# Global Sidekiq metrics (size of the global queues, number of jobs, etc)
|
||||
# Will be the same for every Sidekiq process
|
||||
PrometheusExporter::Instrumentation::SidekiqStats.start
|
||||
end
|
||||
end
|
||||
|
||||
at_exit do
|
||||
# Wait for the latest metrics to be reported before shutting down
|
||||
PrometheusExporter::Client.default.stop(wait_timeout_seconds: 10)
|
||||
end
|
||||
end
|
||||
|
||||
config.server_middleware do |chain|
|
||||
chain.add Mastodon::SidekiqMiddleware
|
||||
end
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue