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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
|
require 'prometheus/client/uses_value_type'
require 'prometheus/client/helper/json_parser'
require 'prometheus/client/helper/plain_file'
require 'prometheus/client/helper/metrics_processing'
require 'prometheus/client/helper/metrics_representation'
module Prometheus
module Client
module Formats
# Text format is human readable mainly used for manual inspection.
module Text
MEDIA_TYPE = 'text/plain'.freeze
VERSION = '0.0.4'.freeze
CONTENT_TYPE = "#{MEDIA_TYPE}; version=#{VERSION}".freeze
class << self
def marshal(registry)
metrics = registry.metrics.map do |metric|
samples = metric.values.flat_map do |label_set, value|
representation(metric, label_set, value)
end
[metric.name, { type: metric.type, help: metric.docstring, samples: samples }]
end
Helper::MetricsRepresentation.to_text(metrics)
end
def marshal_multiprocess(path = Prometheus::Client.configuration.multiprocess_files_dir)
file_list = Dir.glob(File.join(path, '*.db')).sort
.map {|f| Helper::PlainFile.new(f) }
.map {|f| [f.filepath, f.multiprocess_mode.to_sym, f.type.to_sym, f.pid] }
FastMmapedFileRs.to_metrics(file_list.to_a)
end
private
def load_metrics(path)
metrics = {}
Dir.glob(File.join(path, '*.db')).sort.each do |f|
Helper::PlainFile.new(f).to_metrics(metrics)
end
metrics
end
def representation(metric, label_set, value)
labels = metric.base_labels.merge(label_set)
if metric.type == :summary
summary(metric.name, labels, value)
elsif metric.type == :histogram
histogram(metric.name, labels, value)
else
[[metric.name, labels, value.get]]
end
end
def summary(name, set, value)
rv = value.get.map do |q, v|
[name, set.merge(quantile: q), v]
end
rv << ["#{name}_sum", set, value.get.sum]
rv << ["#{name}_count", set, value.get.total]
rv
end
def histogram(name, set, value)
# |metric_name, labels, value|
rv = value.get.map do |q, v|
[name, set.merge(le: q), v]
end
rv << [name, set.merge(le: '+Inf'), value.get.total]
rv << ["#{name}_sum", set, value.get.sum]
rv << ["#{name}_count", set, value.get.total]
rv
end
end
end
end
end
end
|