Class: Foam::Ruby::OtelLogDevice

Inherits:
Object
  • Object
show all
Defined in:
lib/foam/ruby/log_subscriber.rb

Overview

Emits OTel log records. Attached to Rails.logger as a broadcast destination so existing log output (stdout, file, etc.) is preserved.

Constant Summary collapse

SEVERITY_MAP =
{
  Logger::DEBUG => OpenTelemetry::Logs::SeverityNumber::SEVERITY_NUMBER_DEBUG,
  Logger::INFO => OpenTelemetry::Logs::SeverityNumber::SEVERITY_NUMBER_INFO,
  Logger::WARN => OpenTelemetry::Logs::SeverityNumber::SEVERITY_NUMBER_WARN,
  Logger::ERROR => OpenTelemetry::Logs::SeverityNumber::SEVERITY_NUMBER_ERROR,
  Logger::FATAL => OpenTelemetry::Logs::SeverityNumber::SEVERITY_NUMBER_FATAL,
}.freeze
SEVERITY_TEXT =
{
  Logger::DEBUG => "DEBUG",
  Logger::INFO => "INFO",
  Logger::WARN => "WARN",
  Logger::ERROR => "ERROR",
  Logger::FATAL => "FATAL",
}.freeze

Instance Method Summary collapse

Constructor Details

#initializeOtelLogDevice

Returns a new instance of OtelLogDevice.



26
27
28
# File 'lib/foam/ruby/log_subscriber.rb', line 26

def initialize
  @otel_logger = OpenTelemetry.logger_provider.logger(name: "foam-ruby")
end

Instance Method Details

#emit(severity, message) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/foam/ruby/log_subscriber.rb', line 30

def emit(severity, message)
  return if message.nil? || (message.respond_to?(:empty?) && message.empty?)

  @otel_logger.on_emit(
    body: message.to_s,
    severity_number: SEVERITY_MAP.fetch(severity, OpenTelemetry::Logs::SeverityNumber::SEVERITY_NUMBER_INFO),
    severity_text: SEVERITY_TEXT.fetch(severity, "INFO"),
    timestamp: Time.now
  )
rescue StandardError => e
  warn "[foam-ruby] Failed to emit OTel log record: #{e.message}"
end