module Longboat module Metrics class << self def report!(name, value, help: nil, type: nil, labels: {}) @metrics ||= {} @metrics[name] ||= {help: help, type: type} @metrics[name][labels] = value end def to_s timestamp = (Time.now.to_f * 1000).to_i res = "" (@metrics || {}).each do |name, metric| res << "#HELP #{name} #{metric[:help]}\n" unless metric[:help].nil? res << "#TYPE #{name} #{metric[:type]}\n" unless metric[:type].nil? metric.each do |labels, value| next if labels == :help next if labels == :type labellist = [] labels.each do |k, v| labellist << "#{k}=\"#{v}\"" end labellist = labellist.join(",") res << "#{name}{#{labellist}} #{value} #{timestamp}\n" end end res end def register!(collector) @collectors ||= [] @collectors << collector end def collect! (@collectors || []).each do |collector| collector.collect! end end end end end