class Bigcommerce::Prometheus::Servers::Thin::RackApp

Handles metrics requests as a Rack App on the Thin server

Public Class Methods

new(collector: nil, timeout: nil, logger: nil) click to toggle source
# File lib/bigcommerce/prometheus/servers/thin/rack_app.rb, line 28
def initialize(collector: nil, timeout: nil, logger: nil)
  @timeout = timeout || ::Bigcommerce::Prometheus.server_timeout
  @collector = collector || ::PrometheusExporter::Server::Collector.new
  @logger = logger || ::Bigcommerce::Prometheus.logger
  @server_metrics = ::Bigcommerce::Prometheus::Servers::Thin::ServerMetrics.new(logger: @logger)
end

Public Instance Methods

add_type_collector(collector) click to toggle source

Add a type collector to this server

@param [PrometheusExporter::Server::TypeCollector] collector

# File lib/bigcommerce/prometheus/servers/thin/rack_app.rb, line 50
def add_type_collector(collector)
  @collector.register_collector(collector)
end
call(env) click to toggle source
# File lib/bigcommerce/prometheus/servers/thin/rack_app.rb, line 35
def call(env)
  request = ::Rack::Request.new(env)
  response = ::Rack::Response.new
  controller = route(request)
  handle(controller: controller, request: request, response: response)
rescue StandardError => e
  @logger.error "Error: #{e.message}"
  handle(controller: ::Bigcommerce::Prometheus::Servers::Thin::Controllers::ErrorController, request: request, response: response)
end

Private Instance Methods

handle(controller:, request:, response:) click to toggle source

Handle a controller request

# File lib/bigcommerce/prometheus/servers/thin/rack_app.rb, line 74
def handle(controller:, request:, response:)
  con = controller.new(
    request: request,
    response: response,
    server_metrics: @server_metrics,
    collector: @collector,
    logger: @logger
  )
  con.handle
end
route(request) click to toggle source

Determine the controller route

@param [Rack::Request] request

# File lib/bigcommerce/prometheus/servers/thin/rack_app.rb, line 61
def route(request)
  if request.fullpath == '/metrics' && request.request_method.to_s.downcase == 'get'
    Bigcommerce::Prometheus::Servers::Thin::Controllers::MetricsController
  elsif request.fullpath == '/send-metrics' && request.request_method.to_s.downcase == 'post'
    Bigcommerce::Prometheus::Servers::Thin::Controllers::SendMetricsController
  else
    Bigcommerce::Prometheus::Servers::Thin::Controllers::NotFoundController
  end
end