Sha256: 62ee64d8dd0bdd7b0c9437eb0bd500980eedcf141c245dd50f0665c3441b859a

Contents?: true

Size: 1.45 KB

Versions: 1

Compression:

Stored size: 1.45 KB

Contents

# frozen_string_literal: true

require_relative 'config'
require 'prometheus_exporter/server'

module PgqPrometheus
  class Collector < PrometheusExporter::Server::TypeCollector
    MAX_METRIC_AGE = 30

    def initialize
      @data = []
      @observers = {}

      Config._metrics.each do |name, opts|
        metric_class = Kernel.const_get opts[:metric_class].to_s
        help = opts[:help]
        metric_args = opts[:metric_args]
        @observers[name] = metric_class.new("#{type}_#{name}", help, *metric_args)
      end
    end

    def type
      Config.type
    end

    def metrics
      return [] if @data.length == 0

      @observers.each_value(&:reset!)
      metrics = {}

      @data.map do |obj|
        labels = {}
        # labels are passed by PgqPrometheus::Processor
        labels.merge!(obj['metric_labels']) if obj['metric_labels']
        # custom_labels are passed by PrometheusExporter::Client
        labels.merge!(obj['custom_labels']) if obj['custom_labels']

        @observers.each do |name, observer|
          name = name.to_s
          value = obj[name]
          if value
            observer.observe(value, labels)
            metrics[name] = observer
          end
        end
      end

      metrics.values
    end

    def collect(obj)
      now = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)

      obj['created_at'] = now
      @data.delete_if { |m| m['created_at'] + MAX_METRIC_AGE < now }
      @data << obj
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
pgq_prometheus-0.2.3 lib/pgq_prometheus/collector.rb