Class: SemanticLogger::Appender::OpenTelemetry
- Inherits:
-
Subscriber
- Object
- Base
- Subscriber
- SemanticLogger::Appender::OpenTelemetry
- 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
-
#logger ⇒ Object
readonly
Returns the value of attribute logger.
-
#name ⇒ Object
readonly
Returns the value of attribute name.
-
#version ⇒ Object
readonly
Returns the value of attribute version.
Attributes inherited from Subscriber
#application, #environment, #formatter, #host, #metrics
Attributes inherited from Base
Instance Method Summary collapse
-
#close ⇒ Object
Flush pending logs and close the appender.
-
#flush ⇒ Object
Flush all pending logs.
-
#initialize(name: "SemanticLogger", version: SemanticLogger::VERSION, formatter: SemanticLogger::Formatters::OpenTelemetry.new, metrics: true, **args, &block) ⇒ OpenTelemetry
constructor
Create a Open Telemetry Logger appender instance.
- #log(log) ⇒ Object
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 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
#logger ⇒ Object (readonly)
Returns the value of attribute logger.
15 16 17 |
# File 'lib/semantic_logger/appender/open_telemetry.rb', line 15 def logger @logger end |
#name ⇒ Object (readonly)
Returns the value of attribute name.
15 16 17 |
# File 'lib/semantic_logger/appender/open_telemetry.rb', line 15 def name @name end |
#version ⇒ Object (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
#close ⇒ Object
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 |
#flush ⇒ Object
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 |