Sha256: 4c9db9b11b6ba4ba5fae02735d6d3a8bde2d70499ebe4c6d76482fbb8e4ab763

Contents?: true

Size: 1.43 KB

Versions: 1

Compression:

Stored size: 1.43 KB

Contents

# frozen_string_literal: true

require 'sidekiq/prometheus/exporter/version'
require 'sidekiq/prometheus/exporter/exporters'

module Sidekiq
  module Prometheus
    # Expose Prometheus metrics via Rack application or Sidekiq::Web application
    module Exporter
      REQUEST_VERB = 'GET'.freeze
      REQUEST_METHOD = 'REQUEST_METHOD'.freeze
      NOT_FOUND_TEXT = 'Not Found'.freeze
      MOUNT_PATH = '/metrics'.freeze
      HEADERS = {
        Rack::CONTENT_TYPE => 'text/plain; version=0.0.4',
        Rack::CACHE_CONTROL => 'no-cache'
      }.freeze
      EXPORTERS = Exporters.new

      class << self
        def banner
          exporters =
            EXPORTERS.enabled
              .map { |klass| "  - #{klass.name.split('::').last.downcase}" }
              .join("\n".freeze)

          "Enabled Sidekiq Prometheus exporters:\n#{exporters}"
        end

        def configure
          yield(EXPORTERS)
        end

        def registered(app)
          app.get(MOUNT_PATH) do
            Sidekiq::Prometheus::Exporter.call(REQUEST_METHOD => REQUEST_VERB)
          end
        end

        def to_app
          Rack::Builder.app do
            map(MOUNT_PATH) do
              run Sidekiq::Prometheus::Exporter
            end
          end
        end

        def call(env)
          return [404, HEADERS, [NOT_FOUND_TEXT]] if env[REQUEST_METHOD] != REQUEST_VERB

          [200, HEADERS.dup, [EXPORTERS.to_s]]
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
sidekiq-prometheus-exporter-0.2.1 lib/sidekiq/prometheus/exporter.rb