Class: ActiveAgent::Providers::LogSubscriber

Inherits:
ActiveSupport::LogSubscriber
  • Object
show all
Defined in:
lib/active_agent/providers/log_subscriber.rb

Overview

Logs provider operations via ActiveSupport::Notifications events.

Subscribes to instrumented provider events and formats them consistently. Customize by subclassing and attaching your subscriber, or adjust log levels.

Examples:

Custom log formatting

class MyLogSubscriber < ActiveAgent::Providers::LogSubscriber
  def prompt(event)
    info "🚀 #{event.payload[:provider_module]}: #{event.duration}ms"
  end
end

ActiveAgent::Providers::LogSubscriber.detach_from :active_agent
MyLogSubscriber.attach_to :active_agent

Instance Method Summary collapse

Instance Method Details

#connection_error(event) ⇒ void

This method returns an undefined value.

Logs connection failures with service URI and error details.

Parameters:

  • event (ActiveSupport::Notifications::Event)


146
147
148
149
150
151
152
153
154
155
156
# File 'lib/active_agent/providers/log_subscriber.rb', line 146

def connection_error(event)
  trace_id        = event.payload[:trace_id]
  provider_module = event.payload[:provider_module]
  uri_base        = event.payload[:uri_base]
  exception       = event.payload[:exception]
  message         = event.payload[:message]

  debug do
    "[#{trace_id}] [ActiveAgent] [#{provider_module}] Unable to connect to #{uri_base}. Please ensure the service is running. Error: #{exception} - #{message}"
  end
end

#embed(event) ⇒ void

This method returns an undefined value.

Logs completed embedding with model, input size, and token usage.

Parameters:

  • event (ActiveSupport::Notifications::Event)


64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/active_agent/providers/log_subscriber.rb', line 64

def embed(event)
  trace_id        = event.payload[:trace_id]
  provider_module = event.payload[:provider_module]
  model           = event.payload[:model]
  input_size      = event.payload[:input_size]
  embedding_count = event.payload[:embedding_count]
  usage           = event.payload[:usage]
  duration        = event.duration.round(1)

  debug do
    parts = [ "[#{trace_id}]", "[ActiveAgent]", "[#{provider_module}]" ]
    parts << "Embed completed:"
    parts << "model=#{model}" if model
    parts << "inputs=#{input_size}" if input_size
    parts << "embeddings=#{embedding_count}" if embedding_count
    parts << "tokens=#{usage[:input_tokens]}" if usage
    parts << "#{duration}ms"

    parts.join(" ")
  end
end

#prompt(event) ⇒ void

This method returns an undefined value.

Logs completed prompt with model, message count, token usage, and duration.

Parameters:

  • event (ActiveSupport::Notifications::Event)


28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/active_agent/providers/log_subscriber.rb', line 28

def prompt(event)
  trace_id        = event.payload[:trace_id]
  provider_module = event.payload[:provider_module]
  model           = event.payload[:model]
  message_count   = event.payload[:message_count]
  stream          = event.payload[:stream]
  usage           = event.payload[:usage]
  finish_reason   = event.payload[:finish_reason]
  duration        = event.duration.round(1)

  debug do
    parts = [ "[#{trace_id}]", "[ActiveAgent]", "[#{provider_module}]" ]
    parts << "Prompt completed:"
    parts << "model=#{model}" if model
    parts << "messages=#{message_count}"
    parts << "stream=#{stream}"

    if usage
      tokens = "tokens=#{usage[:input_tokens]}/#{usage[:output_tokens]}"
      tokens += " (cached: #{usage[:cached_tokens]})" if usage[:cached_tokens]&.positive?
      tokens += " (reasoning: #{usage[:reasoning_tokens]})" if usage[:reasoning_tokens]&.positive?
      parts << tokens
    end

    parts << "finish=#{finish_reason}" if finish_reason
    parts << "#{duration}ms"

    parts.join(" ")
  end
end

#stream_chunk(event) ⇒ void

This method returns an undefined value.

Parameters:

  • event (ActiveSupport::Notifications::Event)


127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'lib/active_agent/providers/log_subscriber.rb', line 127

def stream_chunk(event)
  trace_id        = event.payload[:trace_id]
  provider_module = event.payload[:provider_module]
  chunk_type      = event.payload[:chunk_type]

  debug do
    if chunk_type
      "[#{trace_id}] [ActiveAgent] [#{provider_module}] Stream chunk: #{chunk_type}"
    else
      "[#{trace_id}] [ActiveAgent] [#{provider_module}] Stream chunk"
    end
  end
end

#stream_close(event) ⇒ void

This method returns an undefined value.

Parameters:

  • event (ActiveSupport::Notifications::Event)


101
102
103
104
105
106
107
108
# File 'lib/active_agent/providers/log_subscriber.rb', line 101

def stream_close(event)
  trace_id        = event.payload[:trace_id]
  provider_module = event.payload[:provider_module]

  debug do
    "[#{trace_id}] [ActiveAgent] [#{provider_module}] Closing stream"
  end
end

#stream_open(event) ⇒ void

This method returns an undefined value.

Parameters:

  • event (ActiveSupport::Notifications::Event)


89
90
91
92
93
94
95
96
# File 'lib/active_agent/providers/log_subscriber.rb', line 89

def stream_open(event)
  trace_id        = event.payload[:trace_id]
  provider_module = event.payload[:provider_module]

  debug do
    "[#{trace_id}] [ActiveAgent] [#{provider_module}] Opening stream"
  end
end

#tool_call(event) ⇒ void

This method returns an undefined value.

Parameters:

  • event (ActiveSupport::Notifications::Event)


113
114
115
116
117
118
119
120
121
122
# File 'lib/active_agent/providers/log_subscriber.rb', line 113

def tool_call(event)
  trace_id        = event.payload[:trace_id]
  provider_module = event.payload[:provider_module]
  tool_name       = event.payload[:tool_name]
  duration        = event.duration.round(1)

  debug do
    "[#{trace_id}] [ActiveAgent] [#{provider_module}] Tool call: #{tool_name} (#{duration}ms)"
  end
end