class Bigcommerce::Prometheus::Servers::Thin::Controllers::MetricsController

GET /metrics

Public Instance Methods

call() click to toggle source

Handle outputting of metrics

# File lib/bigcommerce/prometheus/servers/thin/controllers/metrics_controller.rb, line 34
def call
  collected_metrics = metrics
  if @request.accept_encoding.to_s.include?('gzip')
    write_gzip(metrics)
  else
    @response.write(collected_metrics)
  end
  @response
end

Private Instance Methods

metrics() click to toggle source

Gather all metrics

# File lib/bigcommerce/prometheus/servers/thin/controllers/metrics_controller.rb, line 64
def metrics
  metric_text = ''
  working = true

  begin
    ::Timeout.timeout(@timeout) do
      metric_text = @collector.prometheus_metrics_text
    end
  rescue ::Timeout::Error
    working = false
    @logger.error 'Generating Prometheus metrics text timed out'
  end

  output = []
  output << @server_metrics.to_prometheus_text(working: working)
  output << metric_text
  output.join("\n")
end
write_gzip(metrics) click to toggle source

Output via gzip

# File lib/bigcommerce/prometheus/servers/thin/controllers/metrics_controller.rb, line 49
def write_gzip(metrics)
  sio = ::StringIO.new
  begin
    writer = ::Zlib::GzipWriter.new(sio)
    writer.write(metrics)
  ensure
    writer.close
  end
  @response.body << sio.string
  set_header('Content-Encoding', 'gzip')
end