Class: Whoosh::Metrics

Inherits:
Object
  • Object
show all
Defined in:
lib/whoosh/metrics.rb

Instance Method Summary collapse

Constructor Details

#initializeMetrics

Returns a new instance of Metrics.



6
7
8
9
10
11
# File 'lib/whoosh/metrics.rb', line 6

def initialize
  @counters = {}
  @gauges = {}
  @summaries = {}
  @mutex = Mutex.new
end

Instance Method Details

#gauge(name, value, labels: {}) ⇒ Object



18
19
20
21
# File 'lib/whoosh/metrics.rb', line 18

def gauge(name, value, labels: {})
  key = metric_key(name, labels)
  @mutex.synchronize { @gauges[key] = value }
end

#increment(name, labels: {}, by: 1) ⇒ Object



13
14
15
16
# File 'lib/whoosh/metrics.rb', line 13

def increment(name, labels: {}, by: 1)
  key = metric_key(name, labels)
  @mutex.synchronize { @counters[key] = (@counters[key] || 0) + by }
end

#observe(name, value, labels: {}) ⇒ Object



23
24
25
26
27
28
29
30
# File 'lib/whoosh/metrics.rb', line 23

def observe(name, value, labels: {})
  key = metric_key(name, labels)
  @mutex.synchronize do
    @summaries[key] ||= { sum: 0.0, count: 0 }
    @summaries[key][:sum] += value
    @summaries[key][:count] += 1
  end
end

#to_prometheusObject



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
# File 'lib/whoosh/metrics.rb', line 32

def to_prometheus
  lines = []

  @mutex.synchronize do
    @counters.each do |key, value|
      name, labels = parse_key(key)
      lines << "# TYPE #{name} counter" unless lines.any? { |l| l.include?("TYPE #{name}") }
      lines << "#{name}#{format_labels(labels)} #{value}"
    end

    @gauges.each do |key, value|
      name, labels = parse_key(key)
      lines << "# TYPE #{name} gauge" unless lines.any? { |l| l.include?("TYPE #{name}") }
      lines << "#{name}#{format_labels(labels)} #{value}"
    end

    @summaries.each do |key, data|
      name, labels = parse_key(key)
      unless lines.any? { |l| l.include?("TYPE #{name}") }
        lines << "# TYPE #{name} summary"
      end
      lines << "#{name}_sum#{format_labels(labels)} #{data[:sum]}"
      lines << "#{name}_count#{format_labels(labels)} #{data[:count]}"
    end
  end

  lines.join("\n") + "\n"
end