class Insights::API::Common::Metrics

Public Class Methods

activate(config, prefix, args = {}) click to toggle source
# File lib/insights/api/common/metrics.rb, line 5
def self.activate(config, prefix, args = {})
  require 'prometheus_exporter'
  require 'prometheus_exporter/client'

  setup_custom_metrics(args[:custom_metrics])

  return if metrics_port == 0

  ensure_exporter_server
  enable_in_process_metrics
  enable_web_server_metrics(prefix)
end

Private Class Methods

enable_in_process_metrics() click to toggle source
# File lib/insights/api/common/metrics.rb, line 29
                     def self.enable_in_process_metrics
  require 'prometheus_exporter/instrumentation'

  # this reports basic process metrics such as RSS and Ruby metrics
  PrometheusExporter::Instrumentation::Process.start
end
enable_web_server_metrics(prefix) click to toggle source
# File lib/insights/api/common/metrics.rb, line 36
                     def self.enable_web_server_metrics(prefix)
  require "insights/api/common/middleware/web_server_metrics"
  Rails.application.middleware.unshift(Insights::API::Common::Middleware::WebServerMetrics, :metrics_prefix => prefix)
end
ensure_exporter_server() click to toggle source
# File lib/insights/api/common/metrics.rb, line 18
                     def self.ensure_exporter_server
  require 'socket'
  TCPSocket.open("127.0.0.1", metrics_port) {}
rescue Errno::ECONNREFUSED
  require 'prometheus_exporter/server'
  server = PrometheusExporter::Server::WebServer.new(port: metrics_port)
  server.start

  PrometheusExporter::Client.default = PrometheusExporter::LocalClient.new(collector: server.collector)
end
metrics_port() click to toggle source
# File lib/insights/api/common/metrics.rb, line 62
                     def self.metrics_port
  @metrics_port ||= (ENV['METRICS_PORT']&.to_i || 9394)
end
setup_custom_metrics(custom_metrics) click to toggle source
# File lib/insights/api/common/metrics.rb, line 41
                     def self.setup_custom_metrics(custom_metrics)
  return if custom_metrics.nil?

  custom_metrics.each do |metric|
    if metrics_port == 0
      define_singleton_method(metric[:name]) {}
    else
      instance_variable_set("@#{metric[:name]}_#{metric[:type]}", PrometheusExporter::Client.default.register(metric[:type], metric[:name], metric[:description]))

      define_singleton_method(metric[:name]) do
        case metric[:type]
        when :counter
          instance_variable_get("@#{metric[:name]}_#{metric[:type]}")&.observe(1)
        else
          "Metric of type #{metric[:type]} unsupported, implement it in Insights::API::Common::Metrics#L45"
        end
      end
    end
  end
end