prometheus_text.rb 906 Bytes
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
module Gitlab::HealthChecks
  class PrometheusText
    def marshal(metrics)
      metrics_with_type_declarations(metrics).join("\n")
    end

    private

    def metrics_with_type_declarations(metrics)
      type_declaration_added = {}

      metrics.flat_map do |metric|
        metric_lines = []

        unless type_declaration_added.has_key?(metric.name)
          type_declaration_added[metric.name] = true
          metric_lines << metric_type_declaration(metric)
        end

        metric_lines << metric_text(metric)
      end
    end

    def metric_type_declaration(metric)
      "# TYPE #{metric.name} gauge"
    end

    def metric_text(metric)
      labels = metric.labels&.map { |key, value| "#{key}=\"#{value}\"" }&.join(',') || ''

      if labels.empty?
        "#{metric.name} #{metric.value}"
      else
        "#{metric.name}{#{labels}} #{metric.value}"
      end
    end
  end
end