Class: Ask::OpenTelemetry::Subscriber
- Inherits:
-
Object
- Object
- Ask::OpenTelemetry::Subscriber
- Defined in:
- lib/ask/open_telemetry/subscriber.rb
Overview
Subscribes to Ask::Instrumentation events and creates OpenTelemetry spans.
Maps each event name to a span name:
"chat.ask" → "llm.chat"
"chat.stream.ask" → "llm.chat"
"tool.ask" → "llm.tool"
"embedding.ask" → "llm.embedding"
"image.ask" → "llm.image"
Forwards the event payload as span attributes under the llm.* namespace
and merges in any metadata from Ask::Instrumentation.current_metadata.
Constant Summary collapse
- SPAN_NAMES =
Event name pattern → OpenTelemetry span name.
{ "chat.ask" => "llm.chat", "chat.stream.ask" => "llm.chat", "tool.ask" => "llm.tool", "embedding.ask" => "llm.embedding", "image.ask" => "llm.image" }.freeze
Instance Method Summary collapse
-
#call(event) ⇒ Object
Invoked by
ActiveSupport::Notificationsfor each matching event.
Instance Method Details
#call(event) ⇒ Object
Invoked by ActiveSupport::Notifications for each matching event.
27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/ask/open_telemetry/subscriber.rb', line 27 def call(event) span_name = SPAN_NAMES[event.name] return unless span_name tracer.in_span(span_name, attributes: attributes_for(event)) do |span| # event.duration is already MILLISECONDS — multiplying by 1000 # produced microsecond values labeled as ms (a 0.2s call showed # llm_duration_ms=203052). span.set_attribute("llm.duration_ms", event.duration.round(2)) end end |