Class: SemanticLogger::Appender::OpenTelemetry

Inherits:
Subscriber show all
Defined in:
lib/semantic_logger/appender/open_telemetry.rb

Constant Summary collapse

CAPTURE_CONTEXT =
->(log) { log.set_context(:open_telemetry, ::OpenTelemetry::Context.current) }

Instance Attribute Summary collapse

Attributes inherited from Subscriber

#application, #environment, #formatter, #host, #metrics

Attributes inherited from Base

#filter

Instance Method Summary collapse

Methods inherited from Subscriber

#console_output?, #default_formatter, #level, #should_log?

Methods inherited from Base

#backtrace, #fast_tag, #level, #level=, #measure, #named_tags, #pop_tags, #push_tags, #should_log?, #silence, #tagged, #tags

Constructor Details

#initialize(name: "SemanticLogger", version: SemanticLogger::VERSION, formatter: SemanticLogger::Formatters::OpenTelemetry.new, metrics: true, **args, &block) ⇒ OpenTelemetry

Create a Open Telemetry Logger appender instance.

Metric only log events are sent to the Open Telemetry Metrics API instead of the Logs API.

I.e. A metric without a message or an exception.
To disable this default behavior set `metrics: false`

Example

SemanticLogger.add_appender(appender: :open_telemetry)


27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/semantic_logger/appender/open_telemetry.rb', line 27

def initialize(name: "SemanticLogger",
               version: SemanticLogger::VERSION,
               formatter: SemanticLogger::Formatters::OpenTelemetry.new,
               metrics: true,
               **args,
               &block)
  @name    = name
  @version = version
  @logger  = ::OpenTelemetry.logger_provider.logger(name: @name, version: @version)

  # Capture the current Open Telemetry context when a log entry is captured.
  # Prevents duplicate subscribers as long as it is from a constant.
  SemanticLogger.on_log(CAPTURE_CONTEXT)

  super(formatter: formatter, metrics: metrics, **args, &block)
end

Instance Attribute Details

#loggerObject (readonly)

Returns the value of attribute logger.



15
16
17
# File 'lib/semantic_logger/appender/open_telemetry.rb', line 15

def logger
  @logger
end

#nameObject (readonly)

Returns the value of attribute name.



15
16
17
# File 'lib/semantic_logger/appender/open_telemetry.rb', line 15

def name
  @name
end

#versionObject (readonly)

Returns the value of attribute version.



15
16
17
# File 'lib/semantic_logger/appender/open_telemetry.rb', line 15

def version
  @version
end

Instance Method Details

#closeObject

Flush pending logs and close the appender



70
71
72
# File 'lib/semantic_logger/appender/open_telemetry.rb', line 70

def close
  @logger.logger_provider.shutdown
end

#flushObject

Flush all pending logs.



65
66
67
# File 'lib/semantic_logger/appender/open_telemetry.rb', line 65

def flush
  @logger.logger_provider.force_flush
end

#log(log) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/semantic_logger/appender/open_telemetry.rb', line 44

def log(log)
  # return log_metric(log) if metrics && log.metric_only?

  body        = formatter.call(log, self)
  level       = body.delete(:level)
  level_index = body.delete(:level_index)
  time        = body.delete(:time)
  payload     = body.delete(:payload)

  @logger.on_emit(
    severity_text:   level,
    severity_number: level_index,
    timestamp:       time,
    body:            body.transform_keys!(&:to_s),
    attributes:      payload,
    context:         log.context[:open_telemetry] || ::OpenTelemetry::Context.current
  )
  true
end