require 'sidekiq' require 'sidekiq/datadog/version' require 'sidekiq/datadog/tag_builder' require 'datadog/statsd' require 'socket' module Sidekiq module Middleware module Client class Datadog # Configure and install datadog instrumentation. Example: # # Sidekiq.configure_client do |config| # config.client_middleware do |chain| # chain.add Sidekiq::Middleware::Client::Datadog # end # end # # You might want to also call `client_middleware` in your `configure_server` call, # since enqueued jobs can enqueue other jobs. # # If you have other client middleware that can stop jobs from getting pushed, # you might want to ensure this middleware is added last, to avoid reporting # enqueues that later get stopped. # # Options: # * :hostname - the hostname used for instrumentation, defaults to system hostname, respects +INSTRUMENTATION_HOSTNAME+ env variable # * :metric_name - the metric name (prefix) to use, defaults to "sidekiq.job_enqueued" # * :tags - array of custom tags, these can be plain strings or lambda blocks accepting a rack env instance # * :skip_tags - array of tag names that shouldn't be emitted # * :statsd_host - the statsD host, defaults to "localhost", respects +STATSD_HOST+ env variable # * :statsd_port - the statsD port, defaults to 8125, respects +STATSD_PORT+ env variable # * :statsd - custom statsd instance def initialize(opts = {}) statsd_host = opts[:statsd_host] || ENV['STATSD_HOST'] || 'localhost' statsd_port = (opts[:statsd_port] || ENV['STATSD_PORT'] || 8125).to_i @metric_name = opts[:metric_name] || 'sidekiq.job_enqueued' @statsd = opts[:statsd] || ::Datadog::Statsd.new(statsd_host, statsd_port) # `status` is meaningless when enqueueing skip_tags = Array(opts[:skip_tags]) + ['status'] @tag_builder = Sidekiq::Datadog::TagBuilder.new( opts[:tags], skip_tags, opts[:hostname], ) end def call(worker_class, job, queue, _redis_pool, *) record(worker_class, job, queue) yield end private def record(worker_class, job, queue) tags = @tag_builder.build_tags(worker_class, job, queue) @statsd.increment @metric_name, tags: tags @statsd.flush if @statsd.respond_to?(:flush) # dogstatsd-ruby >= 5.0.0 end end end end end