Class: Ask::OpenTelemetry::Subscriber

Inherits:
Object
  • Object
show all
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

Instance Method Details

#call(event) ⇒ Object

Invoked by ActiveSupport::Notifications for each matching event.

Parameters:

  • event (ActiveSupport::Notifications::Event)

    The instrumentation event



27
28
29
30
31
32
33
34
# 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|
    span.set_attribute("llm.duration_ms", (event.duration * 1000).round(2))
  end
end