Module: Observ::Concerns::ObservableService
- Extended by:
- ActiveSupport::Concern
- Included in:
- ModerationGuardrailService
- Defined in:
- app/services/observ/concerns/observable_service.rb
Overview
Concern for adding observability to service objects
This module provides automatic observability session management for services that perform LLM operations. It handles session creation, lifecycle management, and chat instrumentation.
Usage:
class MyService
include Observ::Concerns::ObservableService
def initialize(observability_session: nil, moderate: false)
initialize_observability(
observability_session,
service_name: "my_service",
metadata: { custom: "data" },
moderate: moderate
)
end
def perform(input)
with_observability do |session|
# Your service logic here
# Session automatically finalized on success/error
# If moderate: true, content moderation runs after finalization
end
end
end
Instance Method Summary collapse
-
#initialize_observability(session_or_false = nil, service_name:, metadata: {}, moderate: false) ⇒ Object
Initialize observability for the service.
-
#instrument_chat(chat, context: {}) ⇒ Observ::ChatInstrumenter?
Instrument a RubyLLM chat instance for observability.
-
#instrument_embedding(context: {}) ⇒ Observ::EmbeddingInstrumenter?
Instrument RubyLLM.embed for observability.
-
#instrument_image_generation(context: {}) ⇒ Observ::ImageGenerationInstrumenter?
Instrument RubyLLM.paint for observability.
-
#instrument_moderation(context: {}) ⇒ Observ::ModerationInstrumenter?
Instrument RubyLLM.moderate for observability.
-
#instrument_transcription(context: {}) ⇒ Observ::TranscriptionInstrumenter?
Instrument RubyLLM.transcribe for observability.
-
#with_observability {|session| ... } ⇒ Object
Execute a block with automatic session lifecycle management.
Instance Method Details
#initialize_observability(session_or_false = nil, service_name:, metadata: {}, moderate: false) ⇒ Object
Initialize observability for the service
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# File 'app/services/observ/concerns/observable_service.rb', line 45 def initialize_observability(session_or_false = nil, service_name:, metadata: {}, moderate: false) @moderate_on_complete = moderate if session_or_false == false # Explicitly disable observability @observability = nil @owns_session = false elsif session_or_false # Use provided session @observability = session_or_false @owns_session = false else # Auto-create session for standalone use @observability = create_service_session(service_name, ) @owns_session = @observability.present? end end |
#instrument_chat(chat, context: {}) ⇒ Observ::ChatInstrumenter?
Instrument a RubyLLM chat instance for observability
This wraps the chat's ask method to automatically create traces and track LLM calls within the observability session.
104 105 106 107 108 |
# File 'app/services/observ/concerns/observable_service.rb', line 104 def instrument_chat(chat, context: {}) return unless @observability @observability.instrument_chat(chat, context: context) end |
#instrument_embedding(context: {}) ⇒ Observ::EmbeddingInstrumenter?
Instrument RubyLLM.embed for observability
This wraps the RubyLLM.embed class method to automatically create traces and track embedding calls within the observability session.
121 122 123 124 125 |
# File 'app/services/observ/concerns/observable_service.rb', line 121 def (context: {}) return unless @observability @observability.(context: context) end |
#instrument_image_generation(context: {}) ⇒ Observ::ImageGenerationInstrumenter?
Instrument RubyLLM.paint for observability
This wraps the RubyLLM.paint class method to automatically create traces and track image generation calls within the observability session.
138 139 140 141 142 |
# File 'app/services/observ/concerns/observable_service.rb', line 138 def instrument_image_generation(context: {}) return unless @observability @observability.instrument_image_generation(context: context) end |
#instrument_moderation(context: {}) ⇒ Observ::ModerationInstrumenter?
Instrument RubyLLM.moderate for observability
This wraps the RubyLLM.moderate class method to automatically create traces and track moderation calls within the observability session.
172 173 174 175 176 |
# File 'app/services/observ/concerns/observable_service.rb', line 172 def instrument_moderation(context: {}) return unless @observability @observability.instrument_moderation(context: context) end |
#instrument_transcription(context: {}) ⇒ Observ::TranscriptionInstrumenter?
Instrument RubyLLM.transcribe for observability
This wraps the RubyLLM.transcribe class method to automatically create traces and track transcription calls within the observability session.
155 156 157 158 159 |
# File 'app/services/observ/concerns/observable_service.rb', line 155 def instrument_transcription(context: {}) return unless @observability @observability.instrument_transcription(context: context) end |
#with_observability {|session| ... } ⇒ Object
Execute a block with automatic session lifecycle management
The session will be finalized automatically after the block completes, whether it succeeds or raises an error. Only sessions owned by this service instance (i.e., auto-created sessions) will be finalized.
If moderate: true was passed to initialize_observability, content moderation will be enqueued after the session is finalized.
80 81 82 83 84 85 86 87 88 89 |
# File 'app/services/observ/concerns/observable_service.rb', line 80 def with_observability(&block) result = block.call(@observability) finalize_service_session if @owns_session enqueue_moderation if should_moderate? result rescue StandardError finalize_service_session if @owns_session enqueue_moderation if should_moderate? raise end |