Class: Pigeon::Metrics::Collector

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

Overview

Metrics collector for Pigeon

Instance Method Summary collapse

Constructor Details

#initialize(adapter = nil) ⇒ Collector

Initialize a new metrics collector

Parameters:

  • adapter (Object, nil) (defaults to: nil)

    Optional metrics adapter (e.g., Prometheus, StatsD)



9
10
11
12
13
14
# File 'lib/pigeon/metrics/collector.rb', line 9

def initialize(adapter = nil)
  @adapter = adapter
  @counters = {}
  @gauges = {}
  @histograms = {}
end

Instance Method Details

#all_metricsHash

Get all metrics

Returns:

  • (Hash)

    All metrics



89
90
91
92
93
94
95
# File 'lib/pigeon/metrics/collector.rb', line 89

def all_metrics
  {
    counters: @counters,
    gauges: @gauges,
    histograms: @histograms
  }
end

#format_countersArray<Hash>

Format counters for monitoring

Returns:

  • (Array<Hash>)

    Formatted counters



117
118
119
120
121
122
123
124
125
126
# File 'lib/pigeon/metrics/collector.rb', line 117

def format_counters
  @counters.map do |key, value|
    name, tags = parse_metric_key(key)
    {
      name: name,
      value: value,
      tags: tags
    }
  end
end

#format_gaugesArray<Hash>

Format gauges for monitoring

Returns:

  • (Array<Hash>)

    Formatted gauges



130
131
132
133
134
135
136
137
138
139
# File 'lib/pigeon/metrics/collector.rb', line 130

def format_gauges
  @gauges.map do |key, value|
    name, tags = parse_metric_key(key)
    {
      name: name,
      value: value,
      tags: tags
    }
  end
end

#format_histogramsArray<Hash>

Format histograms for monitoring

Returns:

  • (Array<Hash>)

    Formatted histograms with statistics



143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# File 'lib/pigeon/metrics/collector.rb', line 143

def format_histograms
  @histograms.map do |key, values|
    next if values.empty?

    name, tags = parse_metric_key(key)
    sorted = values.sort

    {
      name: name,
      count: values.size,
      min: sorted.first,
      max: sorted.last,
      mean: values.sum / values.size.to_f,
      median: sorted[values.size / 2],
      p95: sorted[(values.size * 0.95).floor],
      p99: sorted[(values.size * 0.99).floor],
      tags: tags
    }
  end.compact
end

#gauge(name, value, tags = {}) ⇒ Numeric

Set a gauge value

Parameters:

  • name (Symbol, String)

    Gauge name

  • value (Numeric)

    Value to set

  • tags (Hash) (defaults to: {})

    Optional tags for the metric

Returns:

  • (Numeric)

    Set value



37
38
39
40
41
42
43
44
45
# File 'lib/pigeon/metrics/collector.rb', line 37

def gauge(name, value, tags = {})
  gauge_key = metric_key(name, tags)
  @gauges[gauge_key] = value

  # If an adapter is provided, delegate to it
  @adapter&.gauge(name, value, tags) if @adapter.respond_to?(:gauge)

  value
end

#get_counter(name, tags = {}) ⇒ Integer

Get the current value of a counter

Parameters:

  • name (Symbol, String)

    Counter name

  • tags (Hash) (defaults to: {})

    Optional tags for the metric

Returns:

  • (Integer)

    Current counter value



67
68
69
# File 'lib/pigeon/metrics/collector.rb', line 67

def get_counter(name, tags = {})
  @counters[metric_key(name, tags)] || 0
end

#get_gauge(name, tags = {}) ⇒ Numeric?

Get the current value of a gauge

Parameters:

  • name (Symbol, String)

    Gauge name

  • tags (Hash) (defaults to: {})

    Optional tags for the metric

Returns:

  • (Numeric, nil)

    Current gauge value



75
76
77
# File 'lib/pigeon/metrics/collector.rb', line 75

def get_gauge(name, tags = {})
  @gauges[metric_key(name, tags)]
end

#get_histogram(name, tags = {}) ⇒ Array

Get all recorded values for a histogram

Parameters:

  • name (Symbol, String)

    Histogram name

  • tags (Hash) (defaults to: {})

    Optional tags for the metric

Returns:

  • (Array)

    All recorded values



83
84
85
# File 'lib/pigeon/metrics/collector.rb', line 83

def get_histogram(name, tags = {})
  @histograms[metric_key(name, tags)] || []
end

#histogram(name, value, tags = {}) ⇒ Array

Record a histogram value

Parameters:

  • name (Symbol, String)

    Histogram name

  • value (Numeric)

    Value to record

  • tags (Hash) (defaults to: {})

    Optional tags for the metric

Returns:

  • (Array)

    All recorded values for this histogram



52
53
54
55
56
57
58
59
60
61
# File 'lib/pigeon/metrics/collector.rb', line 52

def histogram(name, value, tags = {})
  histogram_key = metric_key(name, tags)
  @histograms[histogram_key] ||= []
  @histograms[histogram_key] << value

  # If an adapter is provided, delegate to it
  @adapter&.histogram(name, value, tags) if @adapter.respond_to?(:histogram)

  @histograms[histogram_key]
end

#increment(name, value = 1, tags = {}) ⇒ Integer

Increment a counter

Parameters:

  • name (Symbol, String)

    Counter name

  • value (Integer) (defaults to: 1)

    Value to increment by (default: 1)

  • tags (Hash) (defaults to: {})

    Optional tags for the metric

Returns:

  • (Integer)

    New counter value



21
22
23
24
25
26
27
28
29
30
# File 'lib/pigeon/metrics/collector.rb', line 21

def increment(name, value = 1, tags = {})
  counter_key = metric_key(name, tags)
  @counters[counter_key] ||= 0
  @counters[counter_key] += value

  # If an adapter is provided, delegate to it
  @adapter&.increment(name, value, tags) if @adapter.respond_to?(:increment)

  @counters[counter_key]
end

#metrics_for_monitoringHash

Get metrics in a format suitable for monitoring systems

Returns:

  • (Hash)

    Formatted metrics



107
108
109
110
111
112
113
# File 'lib/pigeon/metrics/collector.rb', line 107

def metrics_for_monitoring
  {
    counters: format_counters,
    gauges: format_gauges,
    histograms: format_histograms
  }
end

#resetvoid

This method returns an undefined value.

Reset all metrics



99
100
101
102
103
# File 'lib/pigeon/metrics/collector.rb', line 99

def reset
  @counters = {}
  @gauges = {}
  @histograms = {}
end