class Bigcommerce::Prometheus::Server

Server implementation for Prometheus

Public Class Methods

new(host: nil, port: nil, timeout: nil, prefix: nil, logger: nil, thread_pool_size: nil) click to toggle source

@param [String] host @param [Integer] port @param [Integer] timeout @param [String] prefix @param [Integer] thread_pool_size

# File lib/bigcommerce/prometheus/server.rb, line 31
def initialize(host: nil, port: nil, timeout: nil, prefix: nil, logger: nil, thread_pool_size: nil)
  @host = host || ::Bigcommerce::Prometheus.server_host
  @port = (port || ::Bigcommerce::Prometheus.server_port).to_i
  @timeout = (timeout || ::Bigcommerce::Prometheus.server_timeout).to_i
  @prefix = (prefix || ::PrometheusExporter::DEFAULT_PREFIX).to_s
  @process_name = ::Bigcommerce::Prometheus.process_name
  @logger = logger || ::Bigcommerce::Prometheus.logger
  @server = ::Bigcommerce::Prometheus::Servers::Thin::Server.new(
    port: @port,
    timeout: @timeout,
    logger: @logger,
    thread_pool_size: (thread_pool_size || ::Bigcommerce::Prometheus.server_thread_pool_size).to_i
  )
  @running = false
  ::PrometheusExporter::Metric::Base.default_prefix = @prefix
  setup_signal_handlers
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/server.rb, line 106
def add_type_collector(collector)
  @logger.info "[bigcommerce-prometheus][#{@process_name}] Registering collector #{collector&.type}"
  @server.add_type_collector(collector)
end
running?() click to toggle source

Whether or not the server is running

@return [Boolean]

# File lib/bigcommerce/prometheus/server.rb, line 97
def running?
  @running
end
start() click to toggle source

Start the server

# File lib/bigcommerce/prometheus/server.rb, line 52
def start
  @logger.info "[bigcommerce-prometheus][#{@process_name}] Starting prometheus exporter on port #{@host}:#{@port}"

  @run_thread = ::Thread.start do
    @server.start
  end
  @running = true

  @logger.info "[bigcommerce-prometheus][#{@process_name}] Prometheus exporter started on #{@host}:#{@port} with #{@server.threadpool_size} threads"

  @server
rescue ::StandardError => e
  @logger.error "[bigcommerce-prometheus][#{@process_name}] Failed to start exporter: #{e.message}"
  stop
end
start_until_stopped() { || ... } click to toggle source

Start the server and run it until stopped

# File lib/bigcommerce/prometheus/server.rb, line 71
def start_until_stopped
  start
  yield
  @run_thread.join
rescue StandardError => e
  warn "[bigcommerce-prometheus] Server crashed: #{e.message}"
  stop
end
stop() click to toggle source

Stop the server

# File lib/bigcommerce/prometheus/server.rb, line 83
def stop
  @server.stop!
  @run_thread.kill
  @running = false
  $stdout.puts "[bigcommerce-prometheus][#{@process_name}] Prometheus exporter cleanly shut down"
rescue ::StandardError => e
  warn "[bigcommerce-prometheus][#{@process_name}] Failed to stop exporter: #{e.message}"
end

Private Instance Methods

setup_signal_handlers() click to toggle source

Register signal handlers

:nocov:

# File lib/bigcommerce/prometheus/server.rb, line 117
def setup_signal_handlers
  ::Signal.trap('INT', proc { stop })
  ::Signal.trap('TERM', proc { stop })
end