From de7f36ce8fa8eab285dea579afe69e2501bfb635 Mon Sep 17 00:00:00 2001 From: Kayla Reopelle Date: Wed, 9 Aug 2023 11:42:05 -0700 Subject: [PATCH 01/13] feat: Create Logs SDK LoggerProvider * Add OpenTelemetry::SDK::Logs::Export constants * Create OpenTelemetry::SDK::Logs::LoggerProvider * Implement LoggerProvider#logger * Implement LoggerProvider#shutdown * Implement LoggerProvider#force_flush * Create no-op LogRecordProcessor --- logs_sdk/Gemfile | 5 + logs_sdk/lib/opentelemetry-logs-sdk.rb | 3 +- logs_sdk/lib/opentelemetry/sdk/logs.rb | 4 + logs_sdk/lib/opentelemetry/sdk/logs/export.rb | 24 +++ .../sdk/logs/log_record_processor.rb | 47 +++++ logs_sdk/lib/opentelemetry/sdk/logs/logger.rb | 33 +++ .../opentelemetry/sdk/logs/logger_provider.rb | 127 ++++++++++++ logs_sdk/opentelemetry-logs-sdk.gemspec | 15 +- logs_sdk/test/.rubocop.yml | 22 +- .../sdk/logs/logger_provider_test.rb | 195 ++++++++++++++++++ logs_sdk/test/test_helper.rb | 2 + 11 files changed, 451 insertions(+), 26 deletions(-) create mode 100644 logs_sdk/lib/opentelemetry/sdk/logs/export.rb create mode 100644 logs_sdk/lib/opentelemetry/sdk/logs/log_record_processor.rb create mode 100644 logs_sdk/lib/opentelemetry/sdk/logs/logger.rb create mode 100644 logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb create mode 100644 logs_sdk/test/opentelemetry/sdk/logs/logger_provider_test.rb diff --git a/logs_sdk/Gemfile b/logs_sdk/Gemfile index f649e2f64a..69362a59bf 100644 --- a/logs_sdk/Gemfile +++ b/logs_sdk/Gemfile @@ -7,3 +7,8 @@ source 'https://rubygems.org' gemspec + +gem 'opentelemetry-api', path: '../api' +gem 'opentelemetry-logs-api', path: '../logs_api' +gem 'opentelemetry-sdk', path: '../sdk' +gem 'opentelemetry-test-helpers', path: '../test_helpers' diff --git a/logs_sdk/lib/opentelemetry-logs-sdk.rb b/logs_sdk/lib/opentelemetry-logs-sdk.rb index 0865890b8a..2f6b645458 100644 --- a/logs_sdk/lib/opentelemetry-logs-sdk.rb +++ b/logs_sdk/lib/opentelemetry-logs-sdk.rb @@ -4,5 +4,6 @@ # # SPDX-License-Identifier: Apache-2.0 +require 'opentelemetry' +require 'opentelemetry/sdk' require 'opentelemetry/sdk/logs' -require 'opentelemetry/sdk/logs/version' diff --git a/logs_sdk/lib/opentelemetry/sdk/logs.rb b/logs_sdk/lib/opentelemetry/sdk/logs.rb index b4f503b18d..4331257d39 100644 --- a/logs_sdk/lib/opentelemetry/sdk/logs.rb +++ b/logs_sdk/lib/opentelemetry/sdk/logs.rb @@ -5,6 +5,10 @@ # SPDX-License-Identifier: Apache-2.0 require_relative 'logs/version' +require_relative 'logs/logger' +require_relative 'logs/logger_provider' +require_relative 'logs/log_record_processor' +require_relative 'logs/export' module OpenTelemetry module SDK diff --git a/logs_sdk/lib/opentelemetry/sdk/logs/export.rb b/logs_sdk/lib/opentelemetry/sdk/logs/export.rb new file mode 100644 index 0000000000..cb8c846eff --- /dev/null +++ b/logs_sdk/lib/opentelemetry/sdk/logs/export.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +# Copyright The OpenTelemetry Authors +# +# SPDX-License-Identifier: Apache-2.0 + +module OpenTelemetry + module SDK + module Logs + # The export module contains result codes for LoggerProvider#force_flush + # and LoggerProvider#shutdown + module Export + # The operation finished successfully. + SUCCESS = 0 + + # The operation finished with an error. + FAILURE = 1 + + # The operation timed out. + TIMEOUT = 2 + end + end + end +end diff --git a/logs_sdk/lib/opentelemetry/sdk/logs/log_record_processor.rb b/logs_sdk/lib/opentelemetry/sdk/logs/log_record_processor.rb new file mode 100644 index 0000000000..4c3fa4b1fb --- /dev/null +++ b/logs_sdk/lib/opentelemetry/sdk/logs/log_record_processor.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +# Copyright The OpenTelemetry Authors +# +# SPDX-License-Identifier: Apache-2.0 + +module OpenTelemetry + module SDK + module Logs + # LogRecordProcessor describes a duck type and provides synchronous no-op hooks for when a + # {LogRecord} is started or when a {LogRecord} is ended. It is not required to subclass this + # class to provide an implementation of LogRecordProcessor, provided the interface is + # satisfied. + class LogRecordProcessor + # Called when a {LogRecord} is emitted. Subsequent calls are not + # permitted after shutdown is called. + # @param [LogRecord] log_record The emitted {LogRecord} + # @param [Context] context The resolved Context + def on_emit(log_record, context); end + + # Export all log records to the configured `Exporter` that have not yet + # been exported. + # + # This method should only be called in cases where it is absolutely + # necessary, such as when using some FaaS providers that may suspend + # the process after an invocation, but before the `Processor` exports + # the completed spans. + # + # @param [optional Numeric] timeout An optional timeout in seconds. + # @return [Integer] Export::SUCCESS if no error occurred, Export::FAILURE if + # a non-specific failure occurred, Export::TIMEOUT if a timeout occurred. + def force_flush(timeout: nil) + Export::SUCCESS + end + + # Called when {LoggerProvider#shutdown} is called. + # + # @param [optional Numeric] timeout An optional timeout in seconds. + # @return [Integer] Export::SUCCESS if no error occurred, Export::FAILURE if + # a non-specific failure occurred, Export::TIMEOUT if a timeout occurred. + def shutdown(timeout: nil) + Export::SUCCESS + end + end + end + end +end diff --git a/logs_sdk/lib/opentelemetry/sdk/logs/logger.rb b/logs_sdk/lib/opentelemetry/sdk/logs/logger.rb new file mode 100644 index 0000000000..5d3707c4d4 --- /dev/null +++ b/logs_sdk/lib/opentelemetry/sdk/logs/logger.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +# Copyright The OpenTelemetry Authors +# +# SPDX-License-Identifier: Apache-2.0 + +module OpenTelemetry + module SDK + module Logs + # The SDK implementation of OpenTelemetry::Logs::Logger + class Logger < OpenTelemetry::Logs::Logger + attr_reader :instrumentation_scope, :logger_provider + + # @api private + # + # Returns a new {OpenTelemetry::SDK::Logs::Logger} instance. This should + # not be called directly. New loggers should be created using + # {LoggerProvider#logger}. + # + # @param [String] name Instrumentation package name + # @param [String] version Instrumentation package version + # @param [LoggerProvider] logger_provider The {LoggerProvider} that + # initialized the logger + # + # @return [OpenTelemetry::SDK::Logs::Logger] + def initialize(name, version, logger_provider) + @instrumentation_scope = InstrumentationScope.new(name, version) + @logger_provider = logger_provider + end + end + end + end +end diff --git a/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb b/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb new file mode 100644 index 0000000000..f71700e5c7 --- /dev/null +++ b/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb @@ -0,0 +1,127 @@ +# frozen_string_literal: true + +# Copyright The OpenTelemetry Authors +# +# SPDX-License-Identifier: Apache-2.0 + +module OpenTelemetry + module SDK + module Logs + # The SDK implementation of OpenTelemetry::Logs::LoggerProvider. + class LoggerProvider < OpenTelemetry::Logs::LoggerProvider + attr_reader :resource, :log_record_processors + + UNEXPECTED_ERROR_MESSAGE = 'unexpected error in ' \ + 'OpenTelemetry::SDK::Logs::LoggerProvider#%s' + # Returns a new LoggerProvider instance. + # + # @param [optional Resource] resource The resource to associate with + # new LogRecords created by {Logger}s created by this LoggerProvider. + # @param [optional Array] log_record_processors The + # {LogRecordProcessor}s to associate with this LoggerProvider. + # + # @return [OpenTelemetry::SDK::Logs::LoggerProvider] + def initialize( + resource: OpenTelemetry::SDK::Resources::Resource.create, + log_record_processors: [] + ) + @log_record_processors = log_record_processors + @mutex = Mutex.new + @resource = resource + @stopped = false + end + + # Creates an {OpenTelemetry::SDK::Logs::Logger} instance. + # + # @param [optional String] name Instrumentation package name + # @param [optional String] version Instrumentation package version + # + # @return [OpenTelemetry::SDK::Logs::Logger] + def logger(name = nil, version = nil) + name ||= '' + version ||= '' + + OpenTelemetry.logger.warn('LoggerProvider#logger called without providing a logger name.') if name.empty? + + OpenTelemetry::SDK::Logs::Logger.new(name, version, self) + end + + # Adds a new log record processor to this LoggerProvider's + # log_record_processors. + # + # @param [LogRecordProcessor] log_record_processor The + # {LogRecordProcessor} to add to this LoggerProvider. + def add_log_record_processor(log_record_processor) + @mutex.synchronize do + @log_record_processors = log_record_processors.dup.push(log_record_processor) + end + end + + # Attempts to stop all the activity for this LoggerProvider. Calls + # {LogRecordProcessor#shutdown} for all registered {LogRecordProcessor}s. + # + # This operation may block until all log records are processed. Must + # be called before turning off the main application to ensure all data + # are processed and exported. + # + # After this is called all newly created {LogRecord}s will be no-op. + # + # @param [optional Numeric] timeout An optional timeout in seconds. + # @return [Integer] Export::SUCCESS if no error occurred, Export::FAILURE if + # a non-specific failure occurred, Export::TIMEOUT if a timeout occurred. + def shutdown(timeout: nil) + @mutex.synchronize do + if @stopped + OpenTelemetry.logger.warn('LoggerProvider#shutdown called multiple times.') + return OpenTelemetry::SDK::Logs::Export::FAILURE + end + + start_time = OpenTelemetry::Common::Utilities.timeout_timestamp + results = log_record_processors.map do |processor| + remaining_timeout = OpenTelemetry::Common::Utilities.maybe_timeout(timeout, start_time) + break [OpenTelemetry::SDK::Logs::Export::TIMEOUT] if remaining_timeout&.zero? + + processor.shutdown(timeout: remaining_timeout) + end + + @stopped = true + results.max || OpenTelemetry::SDK::Logs::Export::SUCCESS + end + rescue StandardError => e + OpenTelemetry.handle_error(exception: e, message: UNEXPECTED_ERROR_MESSAGE % __method__) + Export::FAILURE + end + + # Immediately export all {LogRecord}s that have not yet been exported + # for all the registered {LogRecordProcessor}s. + # + # This method should only be called in cases where it is absolutely + # necessary, such as when using some FaaS providers that may suspend + # the process after an invocation, but before the {LogRecordProcessor} + # exports the completed {LogRecord}s. + # + # @param [optional Numeric] timeout An optional timeout in seconds. + # @return [Integer] Export::SUCCESS if no error occurred, Export::FAILURE if + # a non-specific failure occurred, Export::TIMEOUT if a timeout occurred. + def force_flush(timeout: nil) + @mutex.synchronize do + return Export::SUCCESS if @stopped + + start_time = OpenTelemetry::Common::Utilities.timeout_timestamp + results = log_record_processors.map do |processor| + remaining_timeout = OpenTelemetry::Common::Utilities.maybe_timeout(timeout, start_time) + return Export::TIMEOUT if remaining_timeout&.zero? + + processor.force_flush(timeout: remaining_timeout) + end + + results.max || Export::SUCCESS + end + rescue StandardError => e + OpenTelemetry.handle_error(exception: e, message: UNEXPECTED_ERROR_MESSAGE % __method__) + Export::FAILURE + end + end + end + end +end diff --git a/logs_sdk/opentelemetry-logs-sdk.gemspec b/logs_sdk/opentelemetry-logs-sdk.gemspec index a4607ee600..29910cb296 100644 --- a/logs_sdk/opentelemetry-logs-sdk.gemspec +++ b/logs_sdk/opentelemetry-logs-sdk.gemspec @@ -24,15 +24,18 @@ Gem::Specification.new do |spec| spec.require_paths = ['lib'] spec.required_ruby_version = '>= 3.0' - spec.add_dependency 'opentelemetry-logs-api', '~> 0.1.0' + spec.add_dependency 'opentelemetry-api', '~> 1.2' + spec.add_dependency 'opentelemetry-logs-api', '~> 0.1' + spec.add_dependency 'opentelemetry-sdk', '~> 1.3' spec.add_development_dependency 'bundler', '>= 1.17' - spec.add_development_dependency 'minitest', '~> 5.0' - spec.add_development_dependency 'rake', '~> 12.0' - spec.add_development_dependency 'rubocop', '~> 1.51.0' - spec.add_development_dependency 'simplecov', '~> 0.17' + spec.add_development_dependency 'minitest', '~> 5.19' + spec.add_development_dependency 'opentelemetry-test-helpers', '~> 0.4' + spec.add_development_dependency 'rake', '~> 13.0' + spec.add_development_dependency 'rubocop', '~> 1.56' + spec.add_development_dependency 'simplecov', '~> 0.22' spec.add_development_dependency 'yard', '~> 0.9' - spec.add_development_dependency 'yard-doctest', '~> 0.1.6' + spec.add_development_dependency 'yard-doctest', '~> 0.1.17' if spec.respond_to?(:metadata) spec.metadata['changelog_uri'] = "https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-logs-sdk/v#{OpenTelemetry::SDK::Logs::VERSION}/file.CHANGELOG.html" diff --git a/logs_sdk/test/.rubocop.yml b/logs_sdk/test/.rubocop.yml index c575887d4b..dbc7df36ef 100644 --- a/logs_sdk/test/.rubocop.yml +++ b/logs_sdk/test/.rubocop.yml @@ -1,24 +1,8 @@ -# inherit_from: .rubocop_todo.yml +inherit_from: ../.rubocop.yml -AllCops: - TargetRubyVersion: '3.0' - -Lint/UnusedMethodArgument: - Enabled: false -Metrics/AbcSize: +Metrics/BlockLength: Enabled: false Metrics/LineLength: Enabled: false -Metrics/MethodLength: - Max: 50 -Metrics/PerceivedComplexity: - Max: 30 -Metrics/CyclomaticComplexity: - Max: 20 -Metrics/ParameterLists: - Enabled: false -Naming/FileName: - Exclude: - - 'lib/opentelemetry-logs-sdk.rb' -Style/ModuleFunction: +Metrics/AbcSize: Enabled: false diff --git a/logs_sdk/test/opentelemetry/sdk/logs/logger_provider_test.rb b/logs_sdk/test/opentelemetry/sdk/logs/logger_provider_test.rb new file mode 100644 index 0000000000..72aadf8b97 --- /dev/null +++ b/logs_sdk/test/opentelemetry/sdk/logs/logger_provider_test.rb @@ -0,0 +1,195 @@ +# frozen_string_literal: true + +# Copyright The OpenTelemetry Authors +# +# SPDX-License-Identifier: Apache-2.0 + +require 'test_helper' + +describe OpenTelemetry::SDK::Logs::LoggerProvider do + let(:logger_provider) { OpenTelemetry::SDK::Logs::LoggerProvider.new } + let(:mock_log_record_processor) { Minitest::Mock.new } + let(:mock_log_record_processor2) { Minitest::Mock.new } + + describe 'resource association' do + let(:resource) { OpenTelemetry::SDK::Resources::Resource.create('hi' => 1) } + let(:logger_provider) do + OpenTelemetry::SDK::Logs::LoggerProvider.new(resource: resource) + end + + it 'allows a resource to be associated with the logger provider' do + assert_instance_of( + OpenTelemetry::SDK::Resources::Resource, logger_provider.resource + ) + end + end + + describe '#add_log_record_processor' do + it "adds the processor to the logger provider's processors" do + assert_equal(0, logger_provider.log_record_processors.length) + + logger_provider.add_log_record_processor(mock_log_record_processor) + assert_equal(1, logger_provider.log_record_processors.length) + end + end + + describe '#logger' do + let(:error_text) { /LoggerProvider#logger called without providing a logger name/ } + + it 'logs a warning if name is nil' do + OpenTelemetry::TestHelpers.with_test_logger do |log_stream| + logger_provider.logger(nil) + assert_match(error_text, log_stream.string) + end + end + + it 'logs a warning if name is an empty string' do + OpenTelemetry::TestHelpers.with_test_logger do |log_stream| + logger_provider.logger('') + assert_match(error_text, log_stream.string) + end + end + + it 'sets name to an empty string if nil' do + logger = logger_provider.logger(nil) + assert_equal(logger.instrumentation_scope.name, '') + end + + it 'sets version to an empty string if nil' do + logger = logger_provider.logger('name', nil) + assert_equal(logger.instrumentation_scope.version, '') + end + + it 'creates a new logger with the passed-in name and version' do + name = 'name' + version = 'version' + logger = logger_provider.logger(name, version) + assert_equal(logger.instrumentation_scope.name, name) + assert_equal(logger.instrumentation_scope.version, version) + end + + it 'creates a new logger when name and version are missing' do + logger = logger_provider.logger + logger2 = logger_provider.logger + + refute_same(logger, logger2) + assert_instance_of(OpenTelemetry::SDK::Logs::Logger, logger) + end + end + + describe '#shutdown' do + it 'logs a warning if called twice' do + OpenTelemetry::TestHelpers.with_test_logger do |log_stream| + logger_provider.shutdown + assert logger_provider.instance_variable_get(:@stopped) + assert_empty(log_stream.string) + logger_provider.shutdown + assert_match(/.* called multiple times/, log_stream.string) + end + end + + it 'sends shutdown to the processor' do + mock_log_record_processor.expect(:shutdown, nil, timeout: nil) + logger_provider.add_log_record_processor(mock_log_record_processor) + logger_provider.shutdown + mock_log_record_processor.verify + end + + it 'sends shutdown to multiple processors' do + mock_log_record_processor.expect(:shutdown, nil, timeout: nil) + mock_log_record_processor2.expect(:shutdown, nil, timeout: nil) + + logger_provider.instance_variable_set( + :@log_record_processors, + [mock_log_record_processor, mock_log_record_processor2] + ) + logger_provider.shutdown + + mock_log_record_processor.verify + mock_log_record_processor2.verify + end + + it 'does not allow subsequent shutdown attempts to reach the processor' do + mock_log_record_processor.expect(:shutdown, nil, timeout: nil) + + logger_provider.add_log_record_processor(mock_log_record_processor) + logger_provider.shutdown + logger_provider.shutdown + + mock_log_record_processor.verify + end + + it 'returns a timeout code if the countdown reaches zero' do + OpenTelemetry::Common::Utilities.stub :maybe_timeout, 0 do + logger_provider.add_log_record_processor(mock_log_record_processor) + assert_equal(OpenTelemetry::SDK::Logs::Export::TIMEOUT, logger_provider.shutdown) + end + end + + it 'logs an error when error is raised' do + OpenTelemetry::TestHelpers.with_test_logger do |log_stream| + OpenTelemetry::Common::Utilities.stub :timeout_timestamp, -> { raise StandardError.new, 'fail' } do + logger_provider.shutdown + assert_match(/LoggerProvider#shutdown/, log_stream.string) + end + end + end + + it 'returns a failure code when an error is raised' do + OpenTelemetry::Common::Utilities.stub :timeout_timestamp, -> { raise StandardError.new, 'fail' } do + assert_equal(OpenTelemetry::SDK::Logs::Export::FAILURE, logger_provider.shutdown) + end + end + end + + describe '#force_flush' do + it 'notifies the log record processor' do + mock_log_record_processor.expect(:force_flush, nil, timeout: nil) + + logger_provider.add_log_record_processor(mock_log_record_processor) + logger_provider.force_flush + + mock_log_record_processor.verify + end + + it 'supports multiple log record processors' do + mock_log_record_processor.expect(:force_flush, nil, timeout: nil) + mock_log_record_processor2.expect(:force_flush, nil, timeout: nil) + + logger_provider.add_log_record_processor(mock_log_record_processor) + logger_provider.add_log_record_processor(mock_log_record_processor2) + logger_provider.force_flush + + mock_log_record_processor.verify + mock_log_record_processor2.verify + end + + it 'returns a success status code if called while stopped' do + logger_provider.add_log_record_processor(mock_log_record_processor) + logger_provider.instance_variable_set(:@stopped, true) + assert_equal(OpenTelemetry::SDK::Logs::Export::SUCCESS, logger_provider.force_flush) + end + + it 'returns a timeout code when the timeout countdown reaches zero' do + OpenTelemetry::Common::Utilities.stub :maybe_timeout, 0 do + logger_provider.add_log_record_processor(mock_log_record_processor) + assert_equal(OpenTelemetry::SDK::Logs::Export::TIMEOUT, logger_provider.force_flush) + end + end + + it 'returns a failure code when an error is raised' do + OpenTelemetry::Common::Utilities.stub :timeout_timestamp, -> { raise StandardError.new, 'fail' } do + assert_equal(OpenTelemetry::SDK::Logs::Export::FAILURE, logger_provider.force_flush) + end + end + + it 'logs an error when error is raised' do + OpenTelemetry::TestHelpers.with_test_logger do |log_stream| + OpenTelemetry::Common::Utilities.stub :timeout_timestamp, -> { raise StandardError.new, 'fail' } do + logger_provider.shutdown + assert_match(/LoggerProvider#shutdown/, log_stream.string) + end + end + end + end +end diff --git a/logs_sdk/test/test_helper.rb b/logs_sdk/test/test_helper.rb index 786faa1eca..59d743987f 100644 --- a/logs_sdk/test/test_helper.rb +++ b/logs_sdk/test/test_helper.rb @@ -9,6 +9,8 @@ SimpleCov.minimum_coverage 85 require 'opentelemetry-logs-api' +require 'opentelemetry-logs-sdk' +require 'opentelemetry-test-helpers' require 'minitest/autorun' OpenTelemetry.logger = Logger.new(File::NULL) From d63a4e9dc1ce01b6d63914dc7e68a235027048d3 Mon Sep 17 00:00:00 2001 From: Kayla Reopelle Date: Tue, 17 Oct 2023 15:44:23 -0700 Subject: [PATCH 02/13] Update Export module description --- logs_sdk/lib/opentelemetry/sdk/logs/export.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/logs_sdk/lib/opentelemetry/sdk/logs/export.rb b/logs_sdk/lib/opentelemetry/sdk/logs/export.rb index cb8c846eff..2a9f150d3b 100644 --- a/logs_sdk/lib/opentelemetry/sdk/logs/export.rb +++ b/logs_sdk/lib/opentelemetry/sdk/logs/export.rb @@ -7,8 +7,7 @@ module OpenTelemetry module SDK module Logs - # The export module contains result codes for LoggerProvider#force_flush - # and LoggerProvider#shutdown + # The Export module contains result codes for exporters module Export # The operation finished successfully. SUCCESS = 0 From 5528277401c8354cfab8ade8a17f4d65b20f7dd9 Mon Sep 17 00:00:00 2001 From: Kayla Reopelle Date: Tue, 17 Oct 2023 15:45:16 -0700 Subject: [PATCH 03/13] Update #on_emit context arg description --- logs_sdk/lib/opentelemetry/sdk/logs/log_record_processor.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logs_sdk/lib/opentelemetry/sdk/logs/log_record_processor.rb b/logs_sdk/lib/opentelemetry/sdk/logs/log_record_processor.rb index 4c3fa4b1fb..b60cfed2af 100644 --- a/logs_sdk/lib/opentelemetry/sdk/logs/log_record_processor.rb +++ b/logs_sdk/lib/opentelemetry/sdk/logs/log_record_processor.rb @@ -15,7 +15,7 @@ class LogRecordProcessor # Called when a {LogRecord} is emitted. Subsequent calls are not # permitted after shutdown is called. # @param [LogRecord] log_record The emitted {LogRecord} - # @param [Context] context The resolved Context + # @param [Context] context The resolved Context (the explicitly passed Context or the current Context) def on_emit(log_record, context); end # Export all log records to the configured `Exporter` that have not yet From 37befe6f0a5b0d460e368f8fcbf85f31284e384c Mon Sep 17 00:00:00 2001 From: Kayla Reopelle Date: Tue, 17 Oct 2023 15:49:22 -0700 Subject: [PATCH 04/13] Remove public reader for log_record_processors --- .../opentelemetry/sdk/logs/logger_provider.rb | 17 ++++++----------- .../sdk/logs/logger_provider_test.rb | 4 ++-- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb b/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb index f71700e5c7..1fb453cb6b 100644 --- a/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb +++ b/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb @@ -9,7 +9,7 @@ module SDK module Logs # The SDK implementation of OpenTelemetry::Logs::LoggerProvider. class LoggerProvider < OpenTelemetry::Logs::LoggerProvider - attr_reader :resource, :log_record_processors + attr_reader :resource UNEXPECTED_ERROR_MESSAGE = 'unexpected error in ' \ 'OpenTelemetry::SDK::Logs::LoggerProvider#%s' @@ -17,15 +17,10 @@ class LoggerProvider < OpenTelemetry::Logs::LoggerProvider # # @param [optional Resource] resource The resource to associate with # new LogRecords created by {Logger}s created by this LoggerProvider. - # @param [optional Array] log_record_processors The - # {LogRecordProcessor}s to associate with this LoggerProvider. # # @return [OpenTelemetry::SDK::Logs::LoggerProvider] - def initialize( - resource: OpenTelemetry::SDK::Resources::Resource.create, - log_record_processors: [] - ) - @log_record_processors = log_record_processors + def initialize(resource: OpenTelemetry::SDK::Resources::Resource.create) + @log_record_processors = [] @mutex = Mutex.new @resource = resource @stopped = false @@ -53,7 +48,7 @@ def logger(name = nil, version = nil) # {LogRecordProcessor} to add to this LoggerProvider. def add_log_record_processor(log_record_processor) @mutex.synchronize do - @log_record_processors = log_record_processors.dup.push(log_record_processor) + @log_record_processors = @log_record_processors.dup.push(log_record_processor) end end @@ -77,7 +72,7 @@ def shutdown(timeout: nil) end start_time = OpenTelemetry::Common::Utilities.timeout_timestamp - results = log_record_processors.map do |processor| + results = @log_record_processors.map do |processor| remaining_timeout = OpenTelemetry::Common::Utilities.maybe_timeout(timeout, start_time) break [OpenTelemetry::SDK::Logs::Export::TIMEOUT] if remaining_timeout&.zero? @@ -108,7 +103,7 @@ def force_flush(timeout: nil) return Export::SUCCESS if @stopped start_time = OpenTelemetry::Common::Utilities.timeout_timestamp - results = log_record_processors.map do |processor| + results = @log_record_processors.map do |processor| remaining_timeout = OpenTelemetry::Common::Utilities.maybe_timeout(timeout, start_time) return Export::TIMEOUT if remaining_timeout&.zero? diff --git a/logs_sdk/test/opentelemetry/sdk/logs/logger_provider_test.rb b/logs_sdk/test/opentelemetry/sdk/logs/logger_provider_test.rb index 72aadf8b97..b655588997 100644 --- a/logs_sdk/test/opentelemetry/sdk/logs/logger_provider_test.rb +++ b/logs_sdk/test/opentelemetry/sdk/logs/logger_provider_test.rb @@ -26,10 +26,10 @@ describe '#add_log_record_processor' do it "adds the processor to the logger provider's processors" do - assert_equal(0, logger_provider.log_record_processors.length) + assert_equal(0, logger_provider.instance_variable_get(:@log_record_processors).length) logger_provider.add_log_record_processor(mock_log_record_processor) - assert_equal(1, logger_provider.log_record_processors.length) + assert_equal(1, logger_provider.instance_variable_get(:@log_record_processors).length) end end From ca7c15f5bbb2834e339fb723bfe24667fe2035a3 Mon Sep 17 00:00:00 2001 From: Kayla Reopelle Date: Tue, 17 Oct 2023 16:39:44 -0700 Subject: [PATCH 05/13] LoggerProvider#logger: keyword args, require name --- .../opentelemetry/sdk/logs/logger_provider.rb | 10 +++++--- .../sdk/logs/logger_provider_test.rb | 25 ++++++------------- 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb b/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb index 1fb453cb6b..9fe91955c0 100644 --- a/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb +++ b/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb @@ -28,15 +28,17 @@ def initialize(resource: OpenTelemetry::SDK::Resources::Resource.create) # Creates an {OpenTelemetry::SDK::Logs::Logger} instance. # - # @param [optional String] name Instrumentation package name + # @param [String] name Instrumentation package name # @param [optional String] version Instrumentation package version # # @return [OpenTelemetry::SDK::Logs::Logger] - def logger(name = nil, version = nil) - name ||= '' + def logger(name:, version: nil) version ||= '' - OpenTelemetry.logger.warn('LoggerProvider#logger called without providing a logger name.') if name.empty? + if !name.is_a?(String) || name.empty? + OpenTelemetry.logger.warn('LoggerProvider#logger called with an ' \ + "invalid name. Name provided: #{name.inspect}") + end OpenTelemetry::SDK::Logs::Logger.new(name, version, self) end diff --git a/logs_sdk/test/opentelemetry/sdk/logs/logger_provider_test.rb b/logs_sdk/test/opentelemetry/sdk/logs/logger_provider_test.rb index b655588997..337fccc973 100644 --- a/logs_sdk/test/opentelemetry/sdk/logs/logger_provider_test.rb +++ b/logs_sdk/test/opentelemetry/sdk/logs/logger_provider_test.rb @@ -34,47 +34,36 @@ end describe '#logger' do - let(:error_text) { /LoggerProvider#logger called without providing a logger name/ } + let(:error_text) { /LoggerProvider#logger called with an invalid name/ } it 'logs a warning if name is nil' do OpenTelemetry::TestHelpers.with_test_logger do |log_stream| - logger_provider.logger(nil) + logger_provider.logger(name: nil) assert_match(error_text, log_stream.string) end end it 'logs a warning if name is an empty string' do OpenTelemetry::TestHelpers.with_test_logger do |log_stream| - logger_provider.logger('') + logger_provider.logger(name: '') assert_match(error_text, log_stream.string) end end - it 'sets name to an empty string if nil' do - logger = logger_provider.logger(nil) - assert_equal(logger.instrumentation_scope.name, '') - end - it 'sets version to an empty string if nil' do - logger = logger_provider.logger('name', nil) + # :version is nil by default, but explicitly setting it here + # to make the test easier to read + logger = logger_provider.logger(name: 'name', version: nil) assert_equal(logger.instrumentation_scope.version, '') end it 'creates a new logger with the passed-in name and version' do name = 'name' version = 'version' - logger = logger_provider.logger(name, version) + logger = logger_provider.logger(name: name, version: version) assert_equal(logger.instrumentation_scope.name, name) assert_equal(logger.instrumentation_scope.version, version) end - - it 'creates a new logger when name and version are missing' do - logger = logger_provider.logger - logger2 = logger_provider.logger - - refute_same(logger, logger2) - assert_instance_of(OpenTelemetry::SDK::Logs::Logger, logger) - end end describe '#shutdown' do From a9f9b77532552d50f9d263623c5b1fe3a8d7129e Mon Sep 17 00:00:00 2001 From: Kayla Reopelle Date: Tue, 17 Oct 2023 16:41:44 -0700 Subject: [PATCH 06/13] Remove attr_readers for scope and provider --- logs_sdk/lib/opentelemetry/sdk/logs/logger.rb | 2 -- .../test/opentelemetry/sdk/logs/logger_provider_test.rb | 7 ++++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/logs_sdk/lib/opentelemetry/sdk/logs/logger.rb b/logs_sdk/lib/opentelemetry/sdk/logs/logger.rb index 5d3707c4d4..e1b855079b 100644 --- a/logs_sdk/lib/opentelemetry/sdk/logs/logger.rb +++ b/logs_sdk/lib/opentelemetry/sdk/logs/logger.rb @@ -9,8 +9,6 @@ module SDK module Logs # The SDK implementation of OpenTelemetry::Logs::Logger class Logger < OpenTelemetry::Logs::Logger - attr_reader :instrumentation_scope, :logger_provider - # @api private # # Returns a new {OpenTelemetry::SDK::Logs::Logger} instance. This should diff --git a/logs_sdk/test/opentelemetry/sdk/logs/logger_provider_test.rb b/logs_sdk/test/opentelemetry/sdk/logs/logger_provider_test.rb index 337fccc973..6ea876145d 100644 --- a/logs_sdk/test/opentelemetry/sdk/logs/logger_provider_test.rb +++ b/logs_sdk/test/opentelemetry/sdk/logs/logger_provider_test.rb @@ -54,17 +54,18 @@ # :version is nil by default, but explicitly setting it here # to make the test easier to read logger = logger_provider.logger(name: 'name', version: nil) - assert_equal(logger.instrumentation_scope.version, '') + assert_equal(logger.instance_variable_get(:@instrumentation_scope).version, '') end it 'creates a new logger with the passed-in name and version' do name = 'name' version = 'version' logger = logger_provider.logger(name: name, version: version) - assert_equal(logger.instrumentation_scope.name, name) - assert_equal(logger.instrumentation_scope.version, version) + assert_equal(logger.instance_variable_get(:@instrumentation_scope).name, name) + assert_equal(logger.instance_variable_get(:@instrumentation_scope).version, version) end end + end describe '#shutdown' do it 'logs a warning if called twice' do From 4313b3e7b4da5d314666f2b8e13cc495762e9607 Mon Sep 17 00:00:00 2001 From: "Kayla Reopelle (she/her)" <87386821+kaylareopelle@users.noreply.github.com> Date: Tue, 17 Oct 2023 16:43:46 -0700 Subject: [PATCH 07/13] Apply suggestions from code review Co-authored-by: Francis Bogsanyi --- logs_sdk/lib/opentelemetry-logs-sdk.rb | 1 - logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/logs_sdk/lib/opentelemetry-logs-sdk.rb b/logs_sdk/lib/opentelemetry-logs-sdk.rb index 2f6b645458..32c03df1f7 100644 --- a/logs_sdk/lib/opentelemetry-logs-sdk.rb +++ b/logs_sdk/lib/opentelemetry-logs-sdk.rb @@ -4,6 +4,5 @@ # # SPDX-License-Identifier: Apache-2.0 -require 'opentelemetry' require 'opentelemetry/sdk' require 'opentelemetry/sdk/logs' diff --git a/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb b/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb index 9fe91955c0..ecf54dacd4 100644 --- a/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb +++ b/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb @@ -13,6 +13,9 @@ class LoggerProvider < OpenTelemetry::Logs::LoggerProvider UNEXPECTED_ERROR_MESSAGE = 'unexpected error in ' \ 'OpenTelemetry::SDK::Logs::LoggerProvider#%s' + + private_constant :UNEXPECTED_ERROR_MESSAGE + # Returns a new LoggerProvider instance. # # @param [optional Resource] resource The resource to associate with From a619d36d9bda299e196a7af037595055e8b0d75c Mon Sep 17 00:00:00 2001 From: Kayla Reopelle Date: Fri, 20 Oct 2023 11:45:13 -0700 Subject: [PATCH 08/13] Remove unncessary error handling --- .../opentelemetry/sdk/logs/logger_provider.rb | 6 ---- .../sdk/logs/logger_provider_test.rb | 31 ------------------- 2 files changed, 37 deletions(-) diff --git a/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb b/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb index ecf54dacd4..5a5ea3f1eb 100644 --- a/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb +++ b/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb @@ -87,9 +87,6 @@ def shutdown(timeout: nil) @stopped = true results.max || OpenTelemetry::SDK::Logs::Export::SUCCESS end - rescue StandardError => e - OpenTelemetry.handle_error(exception: e, message: UNEXPECTED_ERROR_MESSAGE % __method__) - Export::FAILURE end # Immediately export all {LogRecord}s that have not yet been exported @@ -117,9 +114,6 @@ def force_flush(timeout: nil) results.max || Export::SUCCESS end - rescue StandardError => e - OpenTelemetry.handle_error(exception: e, message: UNEXPECTED_ERROR_MESSAGE % __method__) - Export::FAILURE end end end diff --git a/logs_sdk/test/opentelemetry/sdk/logs/logger_provider_test.rb b/logs_sdk/test/opentelemetry/sdk/logs/logger_provider_test.rb index 6ea876145d..fccd5d73d4 100644 --- a/logs_sdk/test/opentelemetry/sdk/logs/logger_provider_test.rb +++ b/logs_sdk/test/opentelemetry/sdk/logs/logger_provider_test.rb @@ -65,7 +65,6 @@ assert_equal(logger.instance_variable_get(:@instrumentation_scope).version, version) end end - end describe '#shutdown' do it 'logs a warning if called twice' do @@ -115,21 +114,6 @@ assert_equal(OpenTelemetry::SDK::Logs::Export::TIMEOUT, logger_provider.shutdown) end end - - it 'logs an error when error is raised' do - OpenTelemetry::TestHelpers.with_test_logger do |log_stream| - OpenTelemetry::Common::Utilities.stub :timeout_timestamp, -> { raise StandardError.new, 'fail' } do - logger_provider.shutdown - assert_match(/LoggerProvider#shutdown/, log_stream.string) - end - end - end - - it 'returns a failure code when an error is raised' do - OpenTelemetry::Common::Utilities.stub :timeout_timestamp, -> { raise StandardError.new, 'fail' } do - assert_equal(OpenTelemetry::SDK::Logs::Export::FAILURE, logger_provider.shutdown) - end - end end describe '#force_flush' do @@ -166,20 +150,5 @@ assert_equal(OpenTelemetry::SDK::Logs::Export::TIMEOUT, logger_provider.force_flush) end end - - it 'returns a failure code when an error is raised' do - OpenTelemetry::Common::Utilities.stub :timeout_timestamp, -> { raise StandardError.new, 'fail' } do - assert_equal(OpenTelemetry::SDK::Logs::Export::FAILURE, logger_provider.force_flush) - end - end - - it 'logs an error when error is raised' do - OpenTelemetry::TestHelpers.with_test_logger do |log_stream| - OpenTelemetry::Common::Utilities.stub :timeout_timestamp, -> { raise StandardError.new, 'fail' } do - logger_provider.shutdown - assert_match(/LoggerProvider#shutdown/, log_stream.string) - end - end - end end end From 336ca7dd1b17ed4c298b601e96481531adda04c7 Mon Sep 17 00:00:00 2001 From: Kayla Reopelle Date: Fri, 20 Oct 2023 15:28:07 -0700 Subject: [PATCH 09/13] Warn #add_log_record_processor calls when stopped --- .../opentelemetry/sdk/logs/logger_provider.rb | 5 +++++ .../sdk/logs/logger_provider_test.rb | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb b/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb index 5a5ea3f1eb..dcfc9d064f 100644 --- a/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb +++ b/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb @@ -53,6 +53,11 @@ def logger(name:, version: nil) # {LogRecordProcessor} to add to this LoggerProvider. def add_log_record_processor(log_record_processor) @mutex.synchronize do + if @stopped + OpenTelemetry.logger.warn('calling LoggerProvider#' \ + 'add_log_record_processor after shutdown.') + return + end @log_record_processors = @log_record_processors.dup.push(log_record_processor) end end diff --git a/logs_sdk/test/opentelemetry/sdk/logs/logger_provider_test.rb b/logs_sdk/test/opentelemetry/sdk/logs/logger_provider_test.rb index fccd5d73d4..30313eab17 100644 --- a/logs_sdk/test/opentelemetry/sdk/logs/logger_provider_test.rb +++ b/logs_sdk/test/opentelemetry/sdk/logs/logger_provider_test.rb @@ -31,6 +31,25 @@ logger_provider.add_log_record_processor(mock_log_record_processor) assert_equal(1, logger_provider.instance_variable_get(:@log_record_processors).length) end + + describe 'when stopped' do + before { logger_provider.instance_variable_set(:@stopped, true) } + + it 'does not add the processor' do + assert_equal(0, logger_provider.instance_variable_get(:@log_record_processors).length) + + logger_provider.add_log_record_processor(mock_log_record_processor) + assert_equal(0, logger_provider.instance_variable_get(:@log_record_processors).length) + end + + it 'logs a warning' do + OpenTelemetry::TestHelpers.with_test_logger do |log_stream| + logger_provider.add_log_record_processor(mock_log_record_processor) + assert_match(/calling LoggerProvider#add_log_record_processor after shutdown/, + log_stream.string) + end + end + end end describe '#logger' do From 5e2d8a3333e449d3c4cd66784c265a02229aa943 Mon Sep 17 00:00:00 2001 From: "Kayla Reopelle (she/her)" <87386821+kaylareopelle@users.noreply.github.com> Date: Tue, 7 Nov 2023 11:39:46 -0800 Subject: [PATCH 10/13] Remove "optional" marker from type description Co-authored-by: Olle Jonsson --- logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb b/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb index dcfc9d064f..77268cc880 100644 --- a/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb +++ b/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb @@ -32,7 +32,7 @@ def initialize(resource: OpenTelemetry::SDK::Resources::Resource.create) # Creates an {OpenTelemetry::SDK::Logs::Logger} instance. # # @param [String] name Instrumentation package name - # @param [optional String] version Instrumentation package version + # @param [String] version Optional instrumentation package version # # @return [OpenTelemetry::SDK::Logs::Logger] def logger(name:, version: nil) @@ -71,7 +71,7 @@ def add_log_record_processor(log_record_processor) # # After this is called all newly created {LogRecord}s will be no-op. # - # @param [optional Numeric] timeout An optional timeout in seconds. + # @param [Numeric] timeout An optional timeout in seconds. # @return [Integer] Export::SUCCESS if no error occurred, Export::FAILURE if # a non-specific failure occurred, Export::TIMEOUT if a timeout occurred. def shutdown(timeout: nil) @@ -102,7 +102,7 @@ def shutdown(timeout: nil) # the process after an invocation, but before the {LogRecordProcessor} # exports the completed {LogRecord}s. # - # @param [optional Numeric] timeout An optional timeout in seconds. + # @param [Numeric] timeout An optional timeout in seconds. # @return [Integer] Export::SUCCESS if no error occurred, Export::FAILURE if # a non-specific failure occurred, Export::TIMEOUT if a timeout occurred. def force_flush(timeout: nil) From f2486f7313e1276b5db3eb47b987b4c85a084189 Mon Sep 17 00:00:00 2001 From: Kayla Reopelle Date: Tue, 7 Nov 2023 11:41:36 -0800 Subject: [PATCH 11/13] Remove "optional" from type documentation --- logs_sdk/lib/opentelemetry/sdk/logs/log_record_processor.rb | 4 ++-- logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/logs_sdk/lib/opentelemetry/sdk/logs/log_record_processor.rb b/logs_sdk/lib/opentelemetry/sdk/logs/log_record_processor.rb index b60cfed2af..709a006c5e 100644 --- a/logs_sdk/lib/opentelemetry/sdk/logs/log_record_processor.rb +++ b/logs_sdk/lib/opentelemetry/sdk/logs/log_record_processor.rb @@ -26,7 +26,7 @@ def on_emit(log_record, context); end # the process after an invocation, but before the `Processor` exports # the completed spans. # - # @param [optional Numeric] timeout An optional timeout in seconds. + # @param [Numeric] timeout An optional timeout in seconds. # @return [Integer] Export::SUCCESS if no error occurred, Export::FAILURE if # a non-specific failure occurred, Export::TIMEOUT if a timeout occurred. def force_flush(timeout: nil) @@ -35,7 +35,7 @@ def force_flush(timeout: nil) # Called when {LoggerProvider#shutdown} is called. # - # @param [optional Numeric] timeout An optional timeout in seconds. + # @param [Numeric] timeout An optional timeout in seconds. # @return [Integer] Export::SUCCESS if no error occurred, Export::FAILURE if # a non-specific failure occurred, Export::TIMEOUT if a timeout occurred. def shutdown(timeout: nil) diff --git a/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb b/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb index 77268cc880..11ccc0eb29 100644 --- a/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb +++ b/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb @@ -18,7 +18,7 @@ class LoggerProvider < OpenTelemetry::Logs::LoggerProvider # Returns a new LoggerProvider instance. # - # @param [optional Resource] resource The resource to associate with + # @param [Resource] resource An optional resource to associate with # new LogRecords created by {Logger}s created by this LoggerProvider. # # @return [OpenTelemetry::SDK::Logs::LoggerProvider] From aba959f2ab190c1bd477f053af052444132cd7de Mon Sep 17 00:00:00 2001 From: "Kayla Reopelle (she/her)" <87386821+kaylareopelle@users.noreply.github.com> Date: Wed, 6 Dec 2023 16:50:22 -0800 Subject: [PATCH 12/13] Apply suggestions from code review Co-authored-by: Francis Bogsanyi --- .../lib/opentelemetry/sdk/logs/log_record_processor.rb | 6 +++--- logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/logs_sdk/lib/opentelemetry/sdk/logs/log_record_processor.rb b/logs_sdk/lib/opentelemetry/sdk/logs/log_record_processor.rb index 709a006c5e..6b51b16915 100644 --- a/logs_sdk/lib/opentelemetry/sdk/logs/log_record_processor.rb +++ b/logs_sdk/lib/opentelemetry/sdk/logs/log_record_processor.rb @@ -7,15 +7,15 @@ module OpenTelemetry module SDK module Logs - # LogRecordProcessor describes a duck type and provides synchronous no-op hooks for when a - # {LogRecord} is started or when a {LogRecord} is ended. It is not required to subclass this + # LogRecordProcessor describes a duck type and provides a synchronous no-op hook for when a + # {LogRecord} is emitted. It is not required to subclass this # class to provide an implementation of LogRecordProcessor, provided the interface is # satisfied. class LogRecordProcessor # Called when a {LogRecord} is emitted. Subsequent calls are not # permitted after shutdown is called. # @param [LogRecord] log_record The emitted {LogRecord} - # @param [Context] context The resolved Context (the explicitly passed Context or the current Context) + # @param [Context] context The {Context} def on_emit(log_record, context); end # Export all log records to the configured `Exporter` that have not yet diff --git a/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb b/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb index 11ccc0eb29..74f65eb6b9 100644 --- a/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb +++ b/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb @@ -29,7 +29,7 @@ def initialize(resource: OpenTelemetry::SDK::Resources::Resource.create) @stopped = false end - # Creates an {OpenTelemetry::SDK::Logs::Logger} instance. + # Returns an {OpenTelemetry::SDK::Logs::Logger} instance. # # @param [String] name Instrumentation package name # @param [String] version Optional instrumentation package version @@ -43,7 +43,7 @@ def logger(name:, version: nil) "invalid name. Name provided: #{name.inspect}") end - OpenTelemetry::SDK::Logs::Logger.new(name, version, self) + Logger.new(name, version, self) end # Adds a new log record processor to this LoggerProvider's @@ -78,19 +78,19 @@ def shutdown(timeout: nil) @mutex.synchronize do if @stopped OpenTelemetry.logger.warn('LoggerProvider#shutdown called multiple times.') - return OpenTelemetry::SDK::Logs::Export::FAILURE + return Export::FAILURE end start_time = OpenTelemetry::Common::Utilities.timeout_timestamp results = @log_record_processors.map do |processor| remaining_timeout = OpenTelemetry::Common::Utilities.maybe_timeout(timeout, start_time) - break [OpenTelemetry::SDK::Logs::Export::TIMEOUT] if remaining_timeout&.zero? + break [Export::TIMEOUT] if remaining_timeout&.zero? processor.shutdown(timeout: remaining_timeout) end @stopped = true - results.max || OpenTelemetry::SDK::Logs::Export::SUCCESS + results.max || Export::SUCCESS end end From 5f7d6745171c344ad675dcb3324217dbd433a91a Mon Sep 17 00:00:00 2001 From: "Kayla Reopelle (she/her)" <87386821+kaylareopelle@users.noreply.github.com> Date: Tue, 12 Dec 2023 09:44:14 -0800 Subject: [PATCH 13/13] Apply suggestions from code review Co-authored-by: Francis Bogsanyi --- logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb b/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb index 74f65eb6b9..d284a634c4 100644 --- a/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb +++ b/logs_sdk/lib/opentelemetry/sdk/logs/logger_provider.rb @@ -18,7 +18,7 @@ class LoggerProvider < OpenTelemetry::Logs::LoggerProvider # Returns a new LoggerProvider instance. # - # @param [Resource] resource An optional resource to associate with + # @param [optional Resource] resource The resource to associate with # new LogRecords created by {Logger}s created by this LoggerProvider. # # @return [OpenTelemetry::SDK::Logs::LoggerProvider] @@ -32,7 +32,7 @@ def initialize(resource: OpenTelemetry::SDK::Resources::Resource.create) # Returns an {OpenTelemetry::SDK::Logs::Logger} instance. # # @param [String] name Instrumentation package name - # @param [String] version Optional instrumentation package version + # @param [optional String] version Instrumentation package version # # @return [OpenTelemetry::SDK::Logs::Logger] def logger(name:, version: nil) @@ -71,7 +71,7 @@ def add_log_record_processor(log_record_processor) # # After this is called all newly created {LogRecord}s will be no-op. # - # @param [Numeric] timeout An optional timeout in seconds. + # @param [optional Numeric] timeout An optional timeout in seconds. # @return [Integer] Export::SUCCESS if no error occurred, Export::FAILURE if # a non-specific failure occurred, Export::TIMEOUT if a timeout occurred. def shutdown(timeout: nil) @@ -102,7 +102,7 @@ def shutdown(timeout: nil) # the process after an invocation, but before the {LogRecordProcessor} # exports the completed {LogRecord}s. # - # @param [Numeric] timeout An optional timeout in seconds. + # @param [optional Numeric] timeout An optional timeout in seconds. # @return [Integer] Export::SUCCESS if no error occurred, Export::FAILURE if # a non-specific failure occurred, Export::TIMEOUT if a timeout occurred. def force_flush(timeout: nil)