Class: Puma::Plugin::Telemetry::Targets::OpenTelemetryTarget
- Inherits:
-
Object
- Object
- Puma::Plugin::Telemetry::Targets::OpenTelemetryTarget
- 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
-
#call(telemetry) ⇒ Object
We are using
gaugemetric type, which means that only the last value will get exported since the OpenTelemetry exporter aggregates metrics before sending them. -
#initialize(meter_provider:, prefix: 'puma', suffix: nil, force_flush: false, attributes: {}) ⇒ OpenTelemetryTarget
constructor
A new instance of OpenTelemetryTarget.
- #instrument(metric) ⇒ Object
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 |