Module: PlatformSdk::Observability::Langfuse::NotificationSubscriber
- Defined in:
- lib/platform_sdk/observability/langfuse/notification_subscriber.rb
Overview
Subscribes to llm_call.platform_sdk ActiveSupport::Notifications events
and forwards them to Recorder.record_generation.
Apps instrument their LLM calls with the convention:
ActiveSupport::Notifications.instrument(
'llm_call.platform_sdk',
name: 'chat_response',
model: 'claude-3-5-sonnet',
input: ,
output: response_text,
usage: { input_tokens: 120, output_tokens: 84 }
) { call_the_llm }
Inside the block, the payload Hash can be mutated to enrich it with
values only known after the call completes. (Instrumenter#instrument
passes the same Hash to the block and reads it again after yield;
this isn't documented in the Rails Guide but is relied on across
the ecosystem.)
Two error-passing paths:
-
Direct
instrument-with-a-block callers that let the block raise: Rails populates:exception_objectautomatically and this subscriber records a failure observation from it. -
Caller-rescues-and-rethrows patterns (e.g.
RubyLLMAdapter.fire, course-builder'sLlmErrorHandling#with_llm_error_handling): setpayload[:error] = exceptionbefore firing. Rails only auto-sets:exception_objectfor the block form, so adapter-style callers thatinstrumentwithout a block need to populate:error.
format_output prefers :error when both are set so the
caller-provided value wins.
Idempotent: install! is safe to call repeatedly — only the first
call registers a subscriber.
Constant Summary collapse
- EVENT_NAME =
LLM_CALL_EVENT- DEFAULT_NAME =
'llm_call'
Class Method Summary collapse
Class Method Details
.install! ⇒ Object
54 55 56 57 58 59 60 61 62 63 |
# File 'lib/platform_sdk/observability/langfuse/notification_subscriber.rb', line 54 def install! @mutex.synchronize do return if @installed @subscriber = ActiveSupport::Notifications.subscribe(EVENT_NAME) do |_name, _start, _finish, _id, payload| handle_event(payload) end @installed = true end end |
.installed? ⇒ Boolean
73 74 75 |
# File 'lib/platform_sdk/observability/langfuse/notification_subscriber.rb', line 73 def installed? @installed end |
.reset! ⇒ Object
65 66 67 68 69 70 71 |
# File 'lib/platform_sdk/observability/langfuse/notification_subscriber.rb', line 65 def reset! @mutex.synchronize do ActiveSupport::Notifications.unsubscribe(@subscriber) if @subscriber @subscriber = nil @installed = false end end |