Sha256: 549eac95904e4a97b29109580a37c318021aa95b45c59418d1102e7ffc0c4b73

Contents?: true

Size: 1.46 KB

Versions: 2

Compression:

Stored size: 1.46 KB

Contents

module Prometheus
  module Client
    module Helper
      module MetricsRepresentation
        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

        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 |labels, value|
              key = labels.delete(:__key_name)
              lines << metric(key, format_labels(labels), value)
            end
          end

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

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

        def self.format_labels(set) #TODO: rename 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

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

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
prometheus-client-mmap-0.7.0.beta32 lib/prometheus/client/helper/metrics_representation.rb
prometheus-client-mmap-0.7.0.beta31 lib/prometheus/client/helper/metrics_representation.rb