Module: Prometheus::Client::Helper::MetricsRepresentation

Defined in:
lib/prometheus/client/helper/metrics_representation.rb

Constant Summary collapse

METRIC_LINE =
'%s%s %s'.freeze
TYPE_LINE =
'# TYPE %s %s'.freeze
HELP_LINE =
'# HELP %s %s'.freeze
LABEL =
'%s="%s"'.freeze
SEPARATOR =
','.freeze
DELIMITER =
"\n".freeze
REGEX =
{ doc: /[\n\\]/, label: /[\n\\"]/ }.freeze
REPLACE =
{ "\n" => '\n', '\\' => '\\\\', '"' => '\"' }.freeze

Class Method Summary collapse

Class Method Details

.escape(string, format = :doc) ⇒ Object



45
46
47
# File 'lib/prometheus/client/helper/metrics_representation.rb', line 45

def self.escape(string, format = :doc)
  string.to_s.gsub(REGEX[format], REPLACE)
end

.format_labels(set) ⇒ Object



35
36
37
38
39
40
41
42
43
# File 'lib/prometheus/client/helper/metrics_representation.rb', line 35

def self.format_labels(set)
  return if set.empty?

  strings = set.each_with_object([]) do |(key, value), memo|
    memo << format(LABEL, key, escape(value, :label))
  end

  "{#{strings.join(SEPARATOR)}}"
end

.metric(name, labels, value) ⇒ Object



31
32
33
# File 'lib/prometheus/client/helper/metrics_representation.rb', line 31

def self.metric(name, labels, value)
  format(METRIC_LINE, name, labels, value)
end

.to_text(metrics) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/prometheus/client/helper/metrics_representation.rb', line 16

def self.to_text(metrics)
  lines = []

  metrics.each do |name, metric|
    lines << format(HELP_LINE, name, escape(metric[:help]))
    lines << format(TYPE_LINE, name, metric[:type])
    metric[:samples].each do |metric_name, labels, value|
      lines << metric(metric_name, format_labels(labels), value)
    end
  end

  # there must be a trailing delimiter
  (lines << nil).join(DELIMITER)
end