summaryrefslogtreecommitdiff
path: root/lib/gitlab/health_checks/prometheus_text_format.rb
blob: 2a8f9d31cd5143b35ba5354ffe6059ab18592221 (plain)
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
39
40
41
42
# frozen_string_literal: true

module Gitlab
  module HealthChecks
    class PrometheusTextFormat
      def marshal(metrics)
        "#{metrics_with_type_declarations(metrics).join("\n")}\n"
      end

      private

      def metrics_with_type_declarations(metrics)
        type_declaration_added = {}

        metrics.flat_map do |metric|
          metric_lines = []

          unless type_declaration_added.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
end