Class: Puma::Plugin::Telemetry::Targets::OpenTelemetryTarget

Inherits:
Object
  • Object
show all
Defined in:
lib/puma/plugin/telemetry/targets/open_telemetry_target.rb

Overview

Target wrapping OpenTelemetry Metrics client.

Example

require 'opentelemetry-metrics-sdk'

OpenTelemetryTarget.new(meter_provider: OpenTelemetry.meter_provider)

Instance Method Summary collapse

Constructor Details

#initialize(meter_provider:, prefix: 'puma', suffix: nil, force_flush: false, attributes: {}) ⇒ OpenTelemetryTarget

Returns a new instance of OpenTelemetryTarget.



16
17
18
19
20
21
22
23
24
# File 'lib/puma/plugin/telemetry/targets/open_telemetry_target.rb', line 16

def initialize(meter_provider:, prefix: 'puma', suffix: nil, force_flush: false, attributes: {})
  @meter_provider = meter_provider
  @meter          = meter_provider.meter('puma.telemetry')
  @prefix         = prefix
  @suffix         = suffix
  @force_flush    = force_flush
  @attributes     = attributes
  @instruments    = {}
end

Instance Method Details

#call(telemetry) ⇒ Object

We are using gauge metric type, which means that only the last value will get exported since the OpenTelemetry exporter aggregates metrics before sending them.

This means that we could publish metrics from here several times before they get flushed from the aggregation thread, and when they do, only the last values will get sent.

That's why we provide the option to explicitly call force_flush here, in order to persist all metrics, and not only the most recent ones.

Note: Force flushing metrics every time can significantly impact performance



38
39
40
41
42
43
44
# File 'lib/puma/plugin/telemetry/targets/open_telemetry_target.rb', line 38

def call(telemetry)
  telemetry.each do |metric, value|
    instrument(metric).record(value, attributes: @attributes)
  end

  @meter_provider.force_flush if @force_flush
end

#instrument(metric) ⇒ Object



46
47
48
# File 'lib/puma/plugin/telemetry/targets/open_telemetry_target.rb', line 46

def instrument(metric)
  @instruments[metric] ||= @meter.create_gauge([@prefix, metric, @suffix].compact.join('.'))
end