From 3a4c5fec540cda653b019c1ec57aa2444cffebad Mon Sep 17 00:00:00 2001 From: psx95 Date: Sat, 15 Feb 2025 23:03:11 -0500 Subject: [PATCH 01/15] [SDK] Add logger scope configurator --- sdk/include/opentelemetry/sdk/logs/logger.h | 4 ++ .../opentelemetry/sdk/logs/logger_config.h | 36 ++++++++++++++++ .../opentelemetry/sdk/logs/logger_context.h | 13 +++++- .../sdk/logs/logger_context_factory.h | 8 ++++ .../opentelemetry/sdk/logs/logger_provider.h | 8 +++- .../sdk/logs/logger_provider_factory.h | 16 +++++++ sdk/src/logs/CMakeLists.txt | 4 +- sdk/src/logs/logger.cc | 7 +++- sdk/src/logs/logger_config.cc | 42 +++++++++++++++++++ sdk/src/logs/logger_context.cc | 12 +++++- sdk/src/logs/logger_context_factory.cc | 11 ++++- sdk/src/logs/logger_provider.cc | 10 +++-- sdk/src/logs/logger_provider_factory.cc | 22 +++++++++- 13 files changed, 179 insertions(+), 14 deletions(-) create mode 100644 sdk/include/opentelemetry/sdk/logs/logger_config.h create mode 100644 sdk/src/logs/logger_config.cc diff --git a/sdk/include/opentelemetry/sdk/logs/logger.h b/sdk/include/opentelemetry/sdk/logs/logger.h index ed43d1ce55..2a36b50a03 100644 --- a/sdk/include/opentelemetry/sdk/logs/logger.h +++ b/sdk/include/opentelemetry/sdk/logs/logger.h @@ -6,8 +6,10 @@ #include #include +#include "logger_config.h" #include "opentelemetry/logs/log_record.h" #include "opentelemetry/logs/logger.h" +#include "opentelemetry/logs/noop.h" #include "opentelemetry/nostd/string_view.h" #include "opentelemetry/nostd/unique_ptr.h" #include "opentelemetry/sdk/instrumentationscope/instrumentation_scope.h" @@ -65,6 +67,8 @@ class Logger final : public opentelemetry::logs::Logger // logger-context. std::unique_ptr instrumentation_scope_; std::shared_ptr context_; + LoggerConfig logger_config_; + static const opentelemetry::logs::NoopLogger kNoopLogger; }; } // namespace logs diff --git a/sdk/include/opentelemetry/sdk/logs/logger_config.h b/sdk/include/opentelemetry/sdk/logs/logger_config.h new file mode 100644 index 0000000000..03df4fdd2b --- /dev/null +++ b/sdk/include/opentelemetry/sdk/logs/logger_config.h @@ -0,0 +1,36 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include "opentelemetry/version.h" + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace sdk +{ +namespace logs +{ +class LoggerConfig +{ +public: + bool operator==(const LoggerConfig &other) const noexcept; + + bool IsEnabled() const noexcept; + + static LoggerConfig Enabled(); + + static LoggerConfig Disabled(); + + static LoggerConfig Default(); + +private: + explicit LoggerConfig(const bool disabled = false) : disabled_(disabled) {} + + bool disabled_; + static const LoggerConfig kDisabledConfig; + static const LoggerConfig kDefaultConfig; + +}; +} // namespace logs +} // namespace sdk +OPENTELEMETRY_END_NAMESPACE diff --git a/sdk/include/opentelemetry/sdk/logs/logger_context.h b/sdk/include/opentelemetry/sdk/logs/logger_context.h index 11eca41d16..3a123247a8 100644 --- a/sdk/include/opentelemetry/sdk/logs/logger_context.h +++ b/sdk/include/opentelemetry/sdk/logs/logger_context.h @@ -7,6 +7,8 @@ #include #include +#include "logger_config.h" +#include "opentelemetry/sdk/instrumentationscope/scope_configurator.h" #include "opentelemetry/sdk/logs/processor.h" #include "opentelemetry/sdk/resource/resource.h" #include "opentelemetry/version.h" @@ -35,7 +37,12 @@ class LoggerContext public: explicit LoggerContext(std::vector> &&processors, const opentelemetry::sdk::resource::Resource &resource = - opentelemetry::sdk::resource::Resource::Create({})) noexcept; + opentelemetry::sdk::resource::Resource::Create({}), + std::unique_ptr> logger_configurator = + std::make_unique>( + instrumentationscope::ScopeConfigurator::Builder(LoggerConfig::Default()) + .Build() + )) noexcept; /** * Attaches a log processor to list of configured processors to this logger context. @@ -61,6 +68,8 @@ class LoggerContext */ const opentelemetry::sdk::resource::Resource &GetResource() const noexcept; + const instrumentationscope::ScopeConfigurator &GetLoggerConfigurator() const noexcept; + /** * Force all active LogProcessors to flush any buffered logs * within the given timeout. @@ -76,6 +85,8 @@ class LoggerContext // order of declaration is important here - resource object should be destroyed after processor. opentelemetry::sdk::resource::Resource resource_; std::unique_ptr processor_; + + std::unique_ptr> logger_configurator_; }; } // namespace logs } // namespace sdk diff --git a/sdk/include/opentelemetry/sdk/logs/logger_context_factory.h b/sdk/include/opentelemetry/sdk/logs/logger_context_factory.h index 5565be8a62..3b2e8ed944 100644 --- a/sdk/include/opentelemetry/sdk/logs/logger_context_factory.h +++ b/sdk/include/opentelemetry/sdk/logs/logger_context_factory.h @@ -35,6 +35,14 @@ class LoggerContextFactory static std::unique_ptr Create( std::vector> &&processors, const opentelemetry::sdk::resource::Resource &resource); + + /** + * Create a LoggerContext. + */ + static std::unique_ptr Create( + std::vector> &&processors, + const opentelemetry::sdk::resource::Resource &resource, + std::unique_ptr> logger_configurator); }; } // namespace logs diff --git a/sdk/include/opentelemetry/sdk/logs/logger_provider.h b/sdk/include/opentelemetry/sdk/logs/logger_provider.h index b3e217e2e8..60694d7df1 100644 --- a/sdk/include/opentelemetry/sdk/logs/logger_provider.h +++ b/sdk/include/opentelemetry/sdk/logs/logger_provider.h @@ -39,11 +39,15 @@ class OPENTELEMETRY_EXPORT LoggerProvider final : public opentelemetry::logs::Lo */ explicit LoggerProvider(std::unique_ptr &&processor, const opentelemetry::sdk::resource::Resource &resource = - opentelemetry::sdk::resource::Resource::Create({})) noexcept; + opentelemetry::sdk::resource::Resource::Create({}), + std::unique_ptr> logger_configurator = + std::make_unique>(instrumentationscope::ScopeConfigurator::Builder(LoggerConfig::Default()).Build())) noexcept; explicit LoggerProvider(std::vector> &&processors, const opentelemetry::sdk::resource::Resource &resource = - opentelemetry::sdk::resource::Resource::Create({})) noexcept; + opentelemetry::sdk::resource::Resource::Create({}), + std::unique_ptr> logger_configurator = + std::make_unique>(instrumentationscope::ScopeConfigurator::Builder(LoggerConfig::Default()).Build())) noexcept; /** * Initialize a new logger provider. A processor must later be assigned diff --git a/sdk/include/opentelemetry/sdk/logs/logger_provider_factory.h b/sdk/include/opentelemetry/sdk/logs/logger_provider_factory.h index 490393209c..6745b39cee 100644 --- a/sdk/include/opentelemetry/sdk/logs/logger_provider_factory.h +++ b/sdk/include/opentelemetry/sdk/logs/logger_provider_factory.h @@ -37,6 +37,14 @@ class OPENTELEMETRY_EXPORT LoggerProviderFactory std::unique_ptr &&processor, const opentelemetry::sdk::resource::Resource &resource); + /** + * Create a LoggerProvider. + */ + static std::unique_ptr Create( + std::unique_ptr &&processor, + const opentelemetry::sdk::resource::Resource &resource, + std::unique_ptr> logger_configurator); + /** * Create a LoggerProvider. */ @@ -50,6 +58,14 @@ class OPENTELEMETRY_EXPORT LoggerProviderFactory std::vector> &&processors, const opentelemetry::sdk::resource::Resource &resource); + /** + * Create a LoggerProvider. + */ + static std::unique_ptr Create( + std::vector> &&processors, + const opentelemetry::sdk::resource::Resource &resource, + std::unique_ptr> logger_configurator); + /** * Create a LoggerProvider. */ diff --git a/sdk/src/logs/CMakeLists.txt b/sdk/src/logs/CMakeLists.txt index 05dbab211b..13e07c148f 100644 --- a/sdk/src/logs/CMakeLists.txt +++ b/sdk/src/logs/CMakeLists.txt @@ -15,13 +15,15 @@ add_library( simple_log_record_processor_factory.cc batch_log_record_processor.cc batch_log_record_processor_factory.cc + logger_config.cc logger_context.cc logger_context_factory.cc multi_log_record_processor.cc multi_log_record_processor_factory.cc multi_recordable.cc read_write_log_record.cc - readable_log_record.cc) + readable_log_record.cc +) set_target_properties(opentelemetry_logs PROPERTIES EXPORT_NAME logs) diff --git a/sdk/src/logs/logger.cc b/sdk/src/logs/logger.cc index eca45c55fb..1192bb68f3 100644 --- a/sdk/src/logs/logger.cc +++ b/sdk/src/logs/logger.cc @@ -31,13 +31,18 @@ namespace logs namespace trace_api = opentelemetry::trace; namespace common = opentelemetry::common; +const opentelemetry::logs::NoopLogger Logger::kNoopLogger = opentelemetry::logs::NoopLogger(); + +// TODO: Implement configurator logic + Logger::Logger( opentelemetry::nostd::string_view name, std::shared_ptr context, std::unique_ptr instrumentation_scope) noexcept : logger_name_(std::string(name)), instrumentation_scope_(std::move(instrumentation_scope)), - context_(std::move(context)) + context_(std::move(context)), + logger_config_(context_->GetLoggerConfigurator().ComputeConfig(*instrumentation_scope_)) {} const opentelemetry::nostd::string_view Logger::GetName() noexcept diff --git a/sdk/src/logs/logger_config.cc b/sdk/src/logs/logger_config.cc new file mode 100644 index 0000000000..a277bba9c2 --- /dev/null +++ b/sdk/src/logs/logger_config.cc @@ -0,0 +1,42 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#include "opentelemetry/sdk/logs/logger_config.h" + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace sdk +{ +namespace logs +{ + +const LoggerConfig LoggerConfig::kDefaultConfig = LoggerConfig(); +const LoggerConfig LoggerConfig::kDisabledConfig = LoggerConfig(true); + +bool LoggerConfig::operator==(const LoggerConfig &other) const noexcept +{ + return disabled_ == other.disabled_; +} + +bool LoggerConfig::IsEnabled() const noexcept +{ + return !disabled_; +} + +LoggerConfig LoggerConfig::Enabled() +{ + return kDefaultConfig; +} + +LoggerConfig LoggerConfig::Disabled() +{ + return kDisabledConfig; +} + +LoggerConfig LoggerConfig::Default() +{ + return kDefaultConfig; +} + +} // namespace logs +} // namespace sdk +OPENTELEMETRY_END_NAMESPACE diff --git a/sdk/src/logs/logger_context.cc b/sdk/src/logs/logger_context.cc index a6eb063661..d37df88390 100644 --- a/sdk/src/logs/logger_context.cc +++ b/sdk/src/logs/logger_context.cc @@ -19,10 +19,12 @@ namespace logs { LoggerContext::LoggerContext(std::vector> &&processors, - const opentelemetry::sdk::resource::Resource &resource) noexcept + const opentelemetry::sdk::resource::Resource &resource, + std::unique_ptr> logger_configurator) noexcept : resource_(resource), processor_( - std::unique_ptr(new MultiLogRecordProcessor(std::move(processors)))) + std::unique_ptr(new MultiLogRecordProcessor(std::move(processors)))), + logger_configurator_(std::move(logger_configurator)) {} void LoggerContext::AddProcessor(std::unique_ptr processor) noexcept @@ -41,6 +43,12 @@ const opentelemetry::sdk::resource::Resource &LoggerContext::GetResource() const return resource_; } +const instrumentationscope::ScopeConfigurator &LoggerContext::GetLoggerConfigurator() + const noexcept +{ + return *logger_configurator_; +} + bool LoggerContext::ForceFlush(std::chrono::microseconds timeout) noexcept { return processor_->ForceFlush(timeout); diff --git a/sdk/src/logs/logger_context_factory.cc b/sdk/src/logs/logger_context_factory.cc index f11852be7f..cbe065a31e 100644 --- a/sdk/src/logs/logger_context_factory.cc +++ b/sdk/src/logs/logger_context_factory.cc @@ -28,7 +28,16 @@ std::unique_ptr LoggerContextFactory::Create( std::vector> &&processors, const opentelemetry::sdk::resource::Resource &resource) { - std::unique_ptr context(new LoggerContext(std::move(processors), resource)); + auto logger_configurator = std::make_unique>(instrumentationscope::ScopeConfigurator::Builder(LoggerConfig::Default()).Build()); + return Create(std::move(processors), resource, std::move(logger_configurator)); +} + +std::unique_ptr LoggerContextFactory::Create( + std::vector> &&processors, + const resource::Resource &resource, + std::unique_ptr> logger_configurator) +{ + std::unique_ptr context(new LoggerContext(std::move(processors), resource, std::move(logger_configurator))); return context; } diff --git a/sdk/src/logs/logger_provider.cc b/sdk/src/logs/logger_provider.cc index da282ab655..ffc7ec2f01 100644 --- a/sdk/src/logs/logger_provider.cc +++ b/sdk/src/logs/logger_provider.cc @@ -27,17 +27,19 @@ namespace logs { LoggerProvider::LoggerProvider(std::unique_ptr &&processor, - const opentelemetry::sdk::resource::Resource &resource) noexcept + const opentelemetry::sdk::resource::Resource &resource, + std::unique_ptr> logger_configurator) noexcept { std::vector> processors; processors.emplace_back(std::move(processor)); - context_ = std::make_shared(std::move(processors), resource); + context_ = std::make_shared(std::move(processors), resource, std::move(logger_configurator)); OTEL_INTERNAL_LOG_DEBUG("[LoggerProvider] LoggerProvider created."); } LoggerProvider::LoggerProvider(std::vector> &&processors, - const opentelemetry::sdk::resource::Resource &resource) noexcept - : context_{std::make_shared(std::move(processors), resource)} + const opentelemetry::sdk::resource::Resource &resource, + std::unique_ptr> logger_configurator) noexcept + : context_{std::make_shared(std::move(processors), resource, std::move(logger_configurator))} {} LoggerProvider::LoggerProvider() noexcept diff --git a/sdk/src/logs/logger_provider_factory.cc b/sdk/src/logs/logger_provider_factory.cc index 530d1c2db4..a9631a0fed 100644 --- a/sdk/src/logs/logger_provider_factory.cc +++ b/sdk/src/logs/logger_provider_factory.cc @@ -28,9 +28,18 @@ std::unique_ptr LoggerProviderFactory: std::unique_ptr LoggerProviderFactory::Create( std::unique_ptr &&processor, const opentelemetry::sdk::resource::Resource &resource) +{ + auto logger_configurator = std::make_unique>(instrumentationscope::ScopeConfigurator::Builder(LoggerConfig::Default()).Build()); + return Create(std::move(processor), resource, std::move(logger_configurator)); +} + +std::unique_ptr LoggerProviderFactory::Create( + std::unique_ptr &&processor, + const resource::Resource &resource, + std::unique_ptr> logger_configurator) { std::unique_ptr provider( - new LoggerProvider(std::move(processor), resource)); + new LoggerProvider(std::move(processor), resource, std::move(logger_configurator))); return provider; } @@ -44,9 +53,18 @@ std::unique_ptr LoggerProviderFactory: std::unique_ptr LoggerProviderFactory::Create( std::vector> &&processors, const opentelemetry::sdk::resource::Resource &resource) +{ + auto logger_configurator = std::make_unique>(instrumentationscope::ScopeConfigurator::Builder(LoggerConfig::Default()).Build()); + return Create(std::move(processors), resource, std::move(logger_configurator)); +} + +std::unique_ptr LoggerProviderFactory::Create( + std::vector> &&processors, + const resource::Resource &resource, + std::unique_ptr> logger_configurator) { std::unique_ptr provider( - new LoggerProvider(std::move(processors), resource)); + new LoggerProvider(std::move(processors), resource, std::move(logger_configurator))); return provider; } From 23e7fbff283aa0f46a4eacf53da5f4cecd527ed3 Mon Sep 17 00:00:00 2001 From: psx95 Date: Wed, 26 Feb 2025 23:21:01 -0500 Subject: [PATCH 02/15] Implement logger configurator logic --- sdk/include/opentelemetry/sdk/logs/logger.h | 2 +- sdk/src/logs/logger.cc | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/sdk/include/opentelemetry/sdk/logs/logger.h b/sdk/include/opentelemetry/sdk/logs/logger.h index 2a36b50a03..cb8ff6ab35 100644 --- a/sdk/include/opentelemetry/sdk/logs/logger.h +++ b/sdk/include/opentelemetry/sdk/logs/logger.h @@ -68,7 +68,7 @@ class Logger final : public opentelemetry::logs::Logger std::unique_ptr instrumentation_scope_; std::shared_ptr context_; LoggerConfig logger_config_; - static const opentelemetry::logs::NoopLogger kNoopLogger; + static opentelemetry::logs::NoopLogger kNoopLogger; }; } // namespace logs diff --git a/sdk/src/logs/logger.cc b/sdk/src/logs/logger.cc index 1192bb68f3..a08f77430d 100644 --- a/sdk/src/logs/logger.cc +++ b/sdk/src/logs/logger.cc @@ -31,9 +31,7 @@ namespace logs namespace trace_api = opentelemetry::trace; namespace common = opentelemetry::common; -const opentelemetry::logs::NoopLogger Logger::kNoopLogger = opentelemetry::logs::NoopLogger(); - -// TODO: Implement configurator logic +opentelemetry::logs::NoopLogger Logger::kNoopLogger = opentelemetry::logs::NoopLogger(); Logger::Logger( opentelemetry::nostd::string_view name, @@ -47,11 +45,18 @@ Logger::Logger( const opentelemetry::nostd::string_view Logger::GetName() noexcept { + if (!logger_config_.IsEnabled()) { + return kNoopLogger.GetName(); + } return logger_name_; } opentelemetry::nostd::unique_ptr Logger::CreateLogRecord() noexcept { + if (!logger_config_.IsEnabled()) { + return kNoopLogger.CreateLogRecord(); + } + auto recordable = context_->GetProcessor().MakeRecordable(); recordable->SetObservedTimestamp(std::chrono::system_clock::now()); @@ -95,6 +100,10 @@ opentelemetry::nostd::unique_ptr Logger::CreateL void Logger::EmitLogRecord( opentelemetry::nostd::unique_ptr &&log_record) noexcept { + if (!logger_config_.IsEnabled()) { + return kNoopLogger.EmitLogRecord(std::move(log_record)); + } + if (!log_record) { return; From 4952e0804981bd3f75c7392f552c16975af7ec91 Mon Sep 17 00:00:00 2001 From: psx95 Date: Wed, 26 Feb 2025 23:41:34 -0500 Subject: [PATCH 03/15] Add logger config tests --- sdk/test/logs/BUILD | 15 +++++ sdk/test/logs/CMakeLists.txt | 2 +- sdk/test/logs/logger_config_test.cc | 95 +++++++++++++++++++++++++++++ 3 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 sdk/test/logs/logger_config_test.cc diff --git a/sdk/test/logs/BUILD b/sdk/test/logs/BUILD index e47cceca74..26c837ea89 100644 --- a/sdk/test/logs/BUILD +++ b/sdk/test/logs/BUILD @@ -93,3 +93,18 @@ cc_test( "@com_google_googletest//:gtest_main", ], ) + +cc_test( + name = "logger_config_test", + srcs = [ + "logger_config_test.cc", + ], + tags = [ + "logs", + "test", + ], + deps = [ + "//sdk/src/logs", + "@com_google_googletest//:gtest_main", + ], +) diff --git a/sdk/test/logs/CMakeLists.txt b/sdk/test/logs/CMakeLists.txt index 1164e8b5b7..c4f5b91ed8 100644 --- a/sdk/test/logs/CMakeLists.txt +++ b/sdk/test/logs/CMakeLists.txt @@ -5,7 +5,7 @@ foreach( testname logger_provider_set_test logger_provider_sdk_test logger_sdk_test log_record_test simple_log_record_processor_test - batch_log_record_processor_test) + batch_log_record_processor_test logger_config_test) add_executable(${testname} "${testname}.cc") target_link_libraries( ${testname} ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} diff --git a/sdk/test/logs/logger_config_test.cc b/sdk/test/logs/logger_config_test.cc new file mode 100644 index 0000000000..624b63dc9a --- /dev/null +++ b/sdk/test/logs/logger_config_test.cc @@ -0,0 +1,95 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#include "opentelemetry/sdk/logs/logger_config.h" +#include +#include +#include +#include +#include +#include +#include "opentelemetry/common/attribute_value.h" +#include "opentelemetry/nostd/string_view.h" +#include "opentelemetry/sdk/instrumentationscope/instrumentation_scope.h" +#include "opentelemetry/sdk/instrumentationscope/scope_configurator.h" + +namespace logs_sdk = opentelemetry::sdk::logs; +namespace instrumentation_scope = opentelemetry::sdk::instrumentationscope; + +/** Test to verify the basic behavior of logs_sdk::LoggerConfig */ + +TEST(LoggerConfig, CheckDisabledWorksAsExpected) +{ + logs_sdk::LoggerConfig disabled_config = logs_sdk::LoggerConfig::Disabled(); + ASSERT_FALSE(disabled_config.IsEnabled()); +} + +TEST(LoggerConfig, CheckEnabledWorksAsExpected) +{ + logs_sdk::LoggerConfig enabled_config = logs_sdk::LoggerConfig::Enabled(); + ASSERT_TRUE(enabled_config.IsEnabled()); +} + +TEST(LoggerConfig, CheckDefaultConfigWorksAccToSpec) +{ + logs_sdk::LoggerConfig default_config = logs_sdk::LoggerConfig::Default(); + ASSERT_TRUE(default_config.IsEnabled()); +} + +/** Tests to verify the behavior of logs_sdk::LoggerConfig::Default */ + +static std::pair attr1 = { + "accept_single_attr", true}; +static std::pair attr2 = { + "accept_second_attr", "some other attr"}; +static std::pair attr3 = { + "accept_third_attr", 3}; + +static instrumentation_scope::InstrumentationScope test_scope_1 = + *instrumentation_scope::InstrumentationScope::Create("test_scope_1"); +static instrumentation_scope::InstrumentationScope test_scope_2 = + *instrumentation_scope::InstrumentationScope::Create("test_scope_2", "1.0"); +static instrumentation_scope::InstrumentationScope test_scope_3 = + *instrumentation_scope::InstrumentationScope::Create( + "test_scope_3", + "0", + "https://opentelemetry.io/schemas/v1.18.0"); +static instrumentation_scope::InstrumentationScope test_scope_4 = + *instrumentation_scope::InstrumentationScope::Create("test_scope_4", + "0", + "https://opentelemetry.io/schemas/v1.18.0", + {attr1}); +static instrumentation_scope::InstrumentationScope test_scope_5 = + *instrumentation_scope::InstrumentationScope::Create("test_scope_5", + "0", + "https://opentelemetry.io/schemas/v1.18.0", + {attr1, attr2, attr3}); + +// This array could also directly contain the reference types, but that leads to 'uninitialized +// value was created by heap allocation' errors in Valgrind memcheck. This is a bug in Googletest +// library, see https://github.com/google/googletest/issues/3805#issuecomment-1397301790 for more +// details. Using pointers is a workaround to prevent the Valgrind warnings. +const std::array instrumentation_scopes = { + &test_scope_1, &test_scope_2, &test_scope_3, &test_scope_4, &test_scope_5, +}; + +// Test fixture for VerifyDefaultConfiguratorBehavior +class DefaultLoggerConfiguratorTestFixture + : public ::testing::TestWithParam +{}; + +// verifies that the default configurator always returns the default meter config +TEST_P(DefaultLoggerConfiguratorTestFixture, VerifyDefaultConfiguratorBehavior) +{ + instrumentation_scope::InstrumentationScope *scope = GetParam(); + instrumentation_scope::ScopeConfigurator default_configurator = + instrumentation_scope::ScopeConfigurator::Builder( + logs_sdk::LoggerConfig::Default()) + .Build(); + + ASSERT_EQ(default_configurator.ComputeConfig(*scope), logs_sdk::LoggerConfig::Default()); +} + +INSTANTIATE_TEST_SUITE_P(InstrumentationScopes, + DefaultLoggerConfiguratorTestFixture, + ::testing::ValuesIn(instrumentation_scopes)); From b8d0b0129ecfd1e8933227d46567be7fd17686b5 Mon Sep 17 00:00:00 2001 From: Pranav Sharma Date: Tue, 11 Mar 2025 21:58:03 +0000 Subject: [PATCH 04/15] Add sdk logger tests --- sdk/src/logs/logger.cc | 12 +- sdk/test/logs/logger_sdk_test.cc | 238 +++++++++++++++++++++++++++++++ 2 files changed, 247 insertions(+), 3 deletions(-) diff --git a/sdk/src/logs/logger.cc b/sdk/src/logs/logger.cc index a08f77430d..3e617502ba 100644 --- a/sdk/src/logs/logger.cc +++ b/sdk/src/logs/logger.cc @@ -15,6 +15,9 @@ #include "opentelemetry/nostd/variant.h" #include "opentelemetry/sdk/instrumentationscope/instrumentation_scope.h" #include "opentelemetry/sdk/logs/logger.h" + +#include + #include "opentelemetry/sdk/logs/logger_context.h" #include "opentelemetry/sdk/logs/processor.h" #include "opentelemetry/sdk/logs/recordable.h" @@ -45,7 +48,8 @@ Logger::Logger( const opentelemetry::nostd::string_view Logger::GetName() noexcept { - if (!logger_config_.IsEnabled()) { + if (!logger_config_.IsEnabled()) + { return kNoopLogger.GetName(); } return logger_name_; @@ -53,7 +57,8 @@ const opentelemetry::nostd::string_view Logger::GetName() noexcept opentelemetry::nostd::unique_ptr Logger::CreateLogRecord() noexcept { - if (!logger_config_.IsEnabled()) { + if (!logger_config_.IsEnabled()) + { return kNoopLogger.CreateLogRecord(); } @@ -100,7 +105,8 @@ opentelemetry::nostd::unique_ptr Logger::CreateL void Logger::EmitLogRecord( opentelemetry::nostd::unique_ptr &&log_record) noexcept { - if (!logger_config_.IsEnabled()) { + if (!logger_config_.IsEnabled()) + { return kNoopLogger.EmitLogRecord(std::move(log_record)); } diff --git a/sdk/test/logs/logger_sdk_test.cc b/sdk/test/logs/logger_sdk_test.cc index 53f9cf4638..0015e6bde8 100644 --- a/sdk/test/logs/logger_sdk_test.cc +++ b/sdk/test/logs/logger_sdk_test.cc @@ -38,6 +38,7 @@ #include "opentelemetry/trace/tracer.h" using namespace opentelemetry::sdk::logs; +using namespace opentelemetry::sdk::instrumentationscope; namespace logs_api = opentelemetry::logs; namespace nostd = opentelemetry::nostd; @@ -275,6 +276,243 @@ TEST(LoggerSDK, LogToAProcessor) now); } +TEST(LoggerSDK, LoggerWithDisabledConfig) +{ + ScopeConfigurator disabled_all_scopes = + ScopeConfigurator::Builder(LoggerConfig::Disabled()).Build(); + // Set a processor for the LoggerProvider + auto shared_recordable = std::shared_ptr(new MockLogRecordable()); + auto log_processor = std::unique_ptr(new MockProcessor(shared_recordable)); + + // Create an API LoggerProvider and logger + const auto resource = opentelemetry::sdk::resource::Resource::Create({}); + const std::string schema_url{"https://opentelemetry.io/schemas/1.11.0"}; + auto api_lp = std::shared_ptr( + new LoggerProvider(std::move(log_processor), resource, + std::make_unique>(disabled_all_scopes))); + auto logger = api_lp->GetLogger("logger", "opentelelemtry_library", "", schema_url); + + auto noop_logger = logs_api::NoopLogger(); + + // Test Logger functions for the constructed logger + // This logger should behave like a noop logger + ASSERT_EQ(logger->GetName(), noop_logger.GetName()); + + // Since the logger is disabled, when creating a LogRecord, the observed timestamp will not be + // set in the underlying LogRecordable + auto log_record = logger->CreateLogRecord(); + logger->EmitLogRecord(std::move(log_record)); + ASSERT_EQ(shared_recordable->GetObservedTimestamp(), std::chrono::system_clock::from_time_t(0)); + + // Since this logger should behave like a noop logger, no values within the recordable would be + // set. + logger->EmitLogRecord(logs_api::Severity::kWarn, "Log Message"); + ASSERT_EQ(shared_recordable->GetBody(), ""); + ASSERT_EQ(shared_recordable->GetSeverity(), opentelemetry::logs::Severity::kInvalid); + ASSERT_EQ(shared_recordable->GetObservedTimestamp(), std::chrono::system_clock::from_time_t(0)); +} + +TEST(LoggerSDK, LoggerWithEnabledConfig) +{ + ScopeConfigurator enabled_all_scopes = + ScopeConfigurator::Builder(LoggerConfig::Enabled()).Build(); + // Set a processor for the LoggerProvider + auto shared_recordable = std::shared_ptr(new MockLogRecordable()); + auto log_processor = std::unique_ptr(new MockProcessor(shared_recordable)); + + // Create an API LoggerProvider and logger + const auto resource = opentelemetry::sdk::resource::Resource::Create({}); + const std::string schema_url{"https://opentelemetry.io/schemas/1.11.0"}; + auto api_lp = std::shared_ptr( + new LoggerProvider(std::move(log_processor), resource, + std::make_unique>(enabled_all_scopes))); + auto logger = api_lp->GetLogger("test-logger", "opentelemetry_library", "", schema_url); + + // Test Logger functions for the constructed logger + ASSERT_EQ(logger->GetName(), "test-logger"); + + // Since the logger is enabled, when creating a LogRecord, the observed timestamp will be set + // in the underlying LogRecordable. + auto reference_ts = std::chrono::duration_cast( + std::chrono::system_clock::now().time_since_epoch()); + auto log_record = logger->CreateLogRecord(); + logger->EmitLogRecord(std::move(log_record)); + // Since log_record was created after recording reference timestamp, expect that observed + // timestamp is greater + ASSERT_GT(shared_recordable->GetObservedTimestamp().time_since_epoch().count(), + reference_ts.count()); + + // Since this logger should behave like a noop logger, no values within the recordable would be + // set. + logger->EmitLogRecord(logs_api::Severity::kWarn, "Log Message"); + ASSERT_EQ(shared_recordable->GetBody(), "Log Message"); + ASSERT_EQ(shared_recordable->GetSeverity(), opentelemetry::logs::Severity::kWarn); + ASSERT_GT(shared_recordable->GetObservedTimestamp().time_since_epoch().count(), + reference_ts.count()); +} + +static MockLogRecordable &create_mock_log_recordable(const std::string &body, + opentelemetry::logs::Severity severity) +{ + auto mock_log_recordable = new MockLogRecordable(); + mock_log_recordable->SetBody(body); + mock_log_recordable->SetSeverity(severity); + return *mock_log_recordable; +} + +class CustomLogConfiguratorTestData +{ +public: + InstrumentationScope instrumentation_scope_; + MockLogRecordable test_log_recordable_; + MockLogRecordable expected_log_recordable_; + bool expected_disabled_for_scope_; + + CustomLogConfiguratorTestData(const InstrumentationScope &instrumentation_scope, + const MockLogRecordable &test_log_recordable, + const MockLogRecordable &expected_log_recordable, + const bool expected_disabled_for_scope) + : instrumentation_scope_(instrumentation_scope), + test_log_recordable_(test_log_recordable), + expected_log_recordable_(expected_log_recordable), + expected_disabled_for_scope_(expected_disabled_for_scope) + {} +}; + +// constants used in VerifyCustomConfiguratorBehavior test +static auto noop_logger = logs_api::NoopLogger(); +const std::string schema_url{"https://opentelemetry.io/schemas/1.11.0"}; + +// Generate test case data +// Test Case 1 +static auto instrumentation_scope_1 = + *InstrumentationScope::Create("opentelemetry_library", "1.0.0", schema_url); +static auto test_log_recordable_1 = + create_mock_log_recordable("Log Message", opentelemetry::logs::Severity::kWarn); +static auto expected_log_recordable_1 = + create_mock_log_recordable("Log Message", opentelemetry::logs::Severity::kWarn); +static auto custom_log_configurator_test_data_1 = + CustomLogConfiguratorTestData(instrumentation_scope_1, + test_log_recordable_1, + expected_log_recordable_1, + false); +// Test Case 2 +static auto instrumentation_scope_2 = + *InstrumentationScope::Create("bar_library", "1.0.0", schema_url); +static auto test_log_recordable_2 = + create_mock_log_recordable("", opentelemetry::logs::Severity::kDebug); +static auto expected_log_recordable_2 = + create_mock_log_recordable("", opentelemetry::logs::Severity::kDebug); +static auto custom_log_configurator_test_data_2 = + CustomLogConfiguratorTestData(instrumentation_scope_2, + test_log_recordable_2, + expected_log_recordable_2, + false); +// Test Case 3 +static auto instrumentation_scope_3 = + *InstrumentationScope::Create("foo_library", "", schema_url); +static auto test_log_recordable_3 = + create_mock_log_recordable("Info message", opentelemetry::logs::Severity::kInfo); +static auto expected_log_recordable_3 = + create_mock_log_recordable("", opentelemetry::logs::Severity::kInvalid); +static auto custom_log_configurator_test_data_3 = + CustomLogConfiguratorTestData(instrumentation_scope_3, + test_log_recordable_3, + expected_log_recordable_3, + true); +// Test Case 4 +static auto instrumentation_scope_4 = + *InstrumentationScope::Create("allowed_library", "", schema_url); +static auto test_log_recordable_4 = + create_mock_log_recordable("Scope version missing", opentelemetry::logs::Severity::kInfo); +static auto expected_log_recordable_4 = + create_mock_log_recordable("", opentelemetry::logs::Severity::kInvalid); +static auto custom_log_configurator_test_data_4 = + CustomLogConfiguratorTestData(instrumentation_scope_4, + test_log_recordable_4, + expected_log_recordable_4, + true); + +// This array could also directly contain the reference types, but that leads to 'uninitialized +// value was created by heap allocation' errors in Valgrind memcheck. This is a bug in Googletest +// library, see https://github.com/google/googletest/issues/3805#issuecomment-1397301790 for more +// details. Using pointers is a workaround to prevent the Valgrind warnings. +constexpr std::array log_configurator_test_cases = { + &custom_log_configurator_test_data_1, + &custom_log_configurator_test_data_2, + &custom_log_configurator_test_data_3, + &custom_log_configurator_test_data_4 +}; + +// Test fixture for VerifyCustomConfiguratorBehavior +class CustomLoggerConfiguratorTestFixture + : public ::testing::TestWithParam +{}; + +TEST_P(CustomLoggerConfiguratorTestFixture, VerifyCustomConfiguratorBehavior) +{ + // lambda checks if version is present in scope information + auto check_if_version_present = [](const InstrumentationScope &scope_info) { + return !scope_info.GetVersion().empty(); + }; + // custom scope configurator that only disables loggers for library name "foo_library" or do not + // have version information + auto test_scope_configurator = ScopeConfigurator( + ScopeConfigurator::Builder(LoggerConfig::Disabled()) + .AddConditionNameEquals("foo_library", LoggerConfig::Disabled()) + .AddCondition(check_if_version_present, LoggerConfig::Enabled()) + .Build()); + + // Get the test case data from fixture + CustomLogConfiguratorTestData *test_case = GetParam(); + auto test_instrumentation_scope = test_case->instrumentation_scope_; + auto test_log_recordable = test_case->test_log_recordable_; + + // Set a processor for the LoggerProvider + auto shared_recordable_under_test = std::shared_ptr(new MockLogRecordable()); + auto log_processor_test = + std::unique_ptr(new MockProcessor(shared_recordable_under_test)); + + // Create an API LoggerProvider and logger + const auto resource = opentelemetry::sdk::resource::Resource::Create({}); + auto api_lp = std::shared_ptr(new LoggerProvider( + std::move(log_processor_test), resource, + std::make_unique>(test_scope_configurator))); + + // Create logger and make assertions + auto logger_under_test = api_lp->GetLogger("test-logger", test_instrumentation_scope.GetName(), + test_instrumentation_scope.GetVersion(), + test_instrumentation_scope.GetSchemaURL()); + auto reference_ts = std::chrono::duration_cast( + std::chrono::system_clock::now().time_since_epoch()); + auto log_record = logger_under_test->CreateLogRecord(); + logger_under_test->EmitLogRecord(std::move(log_record)); + + // Test Logger functions for the constructed logger + if (test_case->expected_disabled_for_scope_) + { + ASSERT_EQ(logger_under_test->GetName(), noop_logger.GetName()); + ASSERT_EQ(shared_recordable_under_test->GetObservedTimestamp(), + std::chrono::system_clock::from_time_t(0)); + } + else + { + ASSERT_EQ(logger_under_test->GetName(), "test-logger"); + ASSERT_GT(shared_recordable_under_test->GetObservedTimestamp().time_since_epoch().count(), + reference_ts.count()); + } + + logger_under_test->EmitLogRecord(test_log_recordable.GetBody(), + test_log_recordable.GetSeverity()); + ASSERT_EQ(shared_recordable_under_test->GetBody(), test_case->expected_log_recordable_.GetBody()); + ASSERT_EQ(shared_recordable_under_test->GetSeverity(), + test_case->expected_log_recordable_.GetSeverity()); +} + +INSTANTIATE_TEST_SUITE_P(CustomLogConfiguratorTestData, + CustomLoggerConfiguratorTestFixture, + ::testing::ValuesIn(log_configurator_test_cases)); + #if OPENTELEMETRY_ABI_VERSION_NO < 2 TEST(LoggerSDK, EventLog) { From 18ca192c9ab52cb3164284ee346de5a1d8602d5b Mon Sep 17 00:00:00 2001 From: Pranav Sharma Date: Wed, 12 Mar 2025 01:24:12 +0000 Subject: [PATCH 05/15] Fix file formatting --- .../opentelemetry/sdk/logs/logger_config.h | 5 ++-- .../opentelemetry/sdk/logs/logger_context.h | 20 +++++++------ .../opentelemetry/sdk/logs/logger_provider.h | 30 ++++++++++++------- sdk/src/logs/logger_config.cc | 6 ++-- sdk/src/logs/logger_context.cc | 3 +- sdk/src/logs/logger_context_factory.cc | 8 +++-- sdk/src/logs/logger_provider.cc | 23 +++++++++----- sdk/src/logs/logger_provider_factory.cc | 10 +++++-- sdk/test/logs/logger_config_test.cc | 2 +- sdk/test/logs/logger_sdk_test.cc | 20 +++++-------- 10 files changed, 75 insertions(+), 52 deletions(-) diff --git a/sdk/include/opentelemetry/sdk/logs/logger_config.h b/sdk/include/opentelemetry/sdk/logs/logger_config.h index 03df4fdd2b..8eeeff9a4e 100644 --- a/sdk/include/opentelemetry/sdk/logs/logger_config.h +++ b/sdk/include/opentelemetry/sdk/logs/logger_config.h @@ -29,8 +29,7 @@ class LoggerConfig bool disabled_; static const LoggerConfig kDisabledConfig; static const LoggerConfig kDefaultConfig; - }; -} // namespace logs -} // namespace sdk +} // namespace logs +} // namespace sdk OPENTELEMETRY_END_NAMESPACE diff --git a/sdk/include/opentelemetry/sdk/logs/logger_context.h b/sdk/include/opentelemetry/sdk/logs/logger_context.h index 3a123247a8..b3222b0f26 100644 --- a/sdk/include/opentelemetry/sdk/logs/logger_context.h +++ b/sdk/include/opentelemetry/sdk/logs/logger_context.h @@ -35,14 +35,15 @@ namespace logs class LoggerContext { public: - explicit LoggerContext(std::vector> &&processors, - const opentelemetry::sdk::resource::Resource &resource = - opentelemetry::sdk::resource::Resource::Create({}), - std::unique_ptr> logger_configurator = - std::make_unique>( - instrumentationscope::ScopeConfigurator::Builder(LoggerConfig::Default()) - .Build() - )) noexcept; + explicit LoggerContext( + std::vector> &&processors, + const opentelemetry::sdk::resource::Resource &resource = + opentelemetry::sdk::resource::Resource::Create({}), + std::unique_ptr> logger_configurator = + std::make_unique>( + instrumentationscope::ScopeConfigurator::Builder( + LoggerConfig::Default()) + .Build())) noexcept; /** * Attaches a log processor to list of configured processors to this logger context. @@ -68,7 +69,8 @@ class LoggerContext */ const opentelemetry::sdk::resource::Resource &GetResource() const noexcept; - const instrumentationscope::ScopeConfigurator &GetLoggerConfigurator() const noexcept; + const instrumentationscope::ScopeConfigurator &GetLoggerConfigurator() + const noexcept; /** * Force all active LogProcessors to flush any buffered logs diff --git a/sdk/include/opentelemetry/sdk/logs/logger_provider.h b/sdk/include/opentelemetry/sdk/logs/logger_provider.h index 60694d7df1..d70b2d1f4e 100644 --- a/sdk/include/opentelemetry/sdk/logs/logger_provider.h +++ b/sdk/include/opentelemetry/sdk/logs/logger_provider.h @@ -37,17 +37,25 @@ class OPENTELEMETRY_EXPORT LoggerProvider final : public opentelemetry::logs::Lo * not be a nullptr. * @param resource The resources for this logger provider. */ - explicit LoggerProvider(std::unique_ptr &&processor, - const opentelemetry::sdk::resource::Resource &resource = - opentelemetry::sdk::resource::Resource::Create({}), - std::unique_ptr> logger_configurator = - std::make_unique>(instrumentationscope::ScopeConfigurator::Builder(LoggerConfig::Default()).Build())) noexcept; - - explicit LoggerProvider(std::vector> &&processors, - const opentelemetry::sdk::resource::Resource &resource = - opentelemetry::sdk::resource::Resource::Create({}), - std::unique_ptr> logger_configurator = - std::make_unique>(instrumentationscope::ScopeConfigurator::Builder(LoggerConfig::Default()).Build())) noexcept; + explicit LoggerProvider( + std::unique_ptr &&processor, + const opentelemetry::sdk::resource::Resource &resource = + opentelemetry::sdk::resource::Resource::Create({}), + std::unique_ptr> logger_configurator = + std::make_unique>( + instrumentationscope::ScopeConfigurator::Builder( + LoggerConfig::Default()) + .Build())) noexcept; + + explicit LoggerProvider( + std::vector> &&processors, + const opentelemetry::sdk::resource::Resource &resource = + opentelemetry::sdk::resource::Resource::Create({}), + std::unique_ptr> logger_configurator = + std::make_unique>( + instrumentationscope::ScopeConfigurator::Builder( + LoggerConfig::Default()) + .Build())) noexcept; /** * Initialize a new logger provider. A processor must later be assigned diff --git a/sdk/src/logs/logger_config.cc b/sdk/src/logs/logger_config.cc index a277bba9c2..e63bc65dcc 100644 --- a/sdk/src/logs/logger_config.cc +++ b/sdk/src/logs/logger_config.cc @@ -9,7 +9,7 @@ namespace sdk namespace logs { -const LoggerConfig LoggerConfig::kDefaultConfig = LoggerConfig(); +const LoggerConfig LoggerConfig::kDefaultConfig = LoggerConfig(); const LoggerConfig LoggerConfig::kDisabledConfig = LoggerConfig(true); bool LoggerConfig::operator==(const LoggerConfig &other) const noexcept @@ -37,6 +37,6 @@ LoggerConfig LoggerConfig::Default() return kDefaultConfig; } -} // namespace logs -} // namespace sdk +} // namespace logs +} // namespace sdk OPENTELEMETRY_END_NAMESPACE diff --git a/sdk/src/logs/logger_context.cc b/sdk/src/logs/logger_context.cc index d37df88390..afb6eb7307 100644 --- a/sdk/src/logs/logger_context.cc +++ b/sdk/src/logs/logger_context.cc @@ -20,7 +20,8 @@ namespace logs LoggerContext::LoggerContext(std::vector> &&processors, const opentelemetry::sdk::resource::Resource &resource, - std::unique_ptr> logger_configurator) noexcept + std::unique_ptr> + logger_configurator) noexcept : resource_(resource), processor_( std::unique_ptr(new MultiLogRecordProcessor(std::move(processors)))), diff --git a/sdk/src/logs/logger_context_factory.cc b/sdk/src/logs/logger_context_factory.cc index cbe065a31e..e9445bd409 100644 --- a/sdk/src/logs/logger_context_factory.cc +++ b/sdk/src/logs/logger_context_factory.cc @@ -28,7 +28,10 @@ std::unique_ptr LoggerContextFactory::Create( std::vector> &&processors, const opentelemetry::sdk::resource::Resource &resource) { - auto logger_configurator = std::make_unique>(instrumentationscope::ScopeConfigurator::Builder(LoggerConfig::Default()).Build()); + auto logger_configurator = + std::make_unique>( + instrumentationscope::ScopeConfigurator::Builder(LoggerConfig::Default()) + .Build()); return Create(std::move(processors), resource, std::move(logger_configurator)); } @@ -37,7 +40,8 @@ std::unique_ptr LoggerContextFactory::Create( const resource::Resource &resource, std::unique_ptr> logger_configurator) { - std::unique_ptr context(new LoggerContext(std::move(processors), resource, std::move(logger_configurator))); + std::unique_ptr context( + new LoggerContext(std::move(processors), resource, std::move(logger_configurator))); return context; } diff --git a/sdk/src/logs/logger_provider.cc b/sdk/src/logs/logger_provider.cc index ffc7ec2f01..b2617c9cdb 100644 --- a/sdk/src/logs/logger_provider.cc +++ b/sdk/src/logs/logger_provider.cc @@ -26,20 +26,27 @@ namespace sdk namespace logs { -LoggerProvider::LoggerProvider(std::unique_ptr &&processor, - const opentelemetry::sdk::resource::Resource &resource, - std::unique_ptr> logger_configurator) noexcept +LoggerProvider::LoggerProvider( + std::unique_ptr &&processor, + const opentelemetry::sdk::resource::Resource &resource, + std::unique_ptr> + logger_configurator) noexcept { std::vector> processors; processors.emplace_back(std::move(processor)); - context_ = std::make_shared(std::move(processors), resource, std::move(logger_configurator)); + context_ = std::make_shared(std::move(processors), resource, + std::move(logger_configurator)); OTEL_INTERNAL_LOG_DEBUG("[LoggerProvider] LoggerProvider created."); } -LoggerProvider::LoggerProvider(std::vector> &&processors, - const opentelemetry::sdk::resource::Resource &resource, - std::unique_ptr> logger_configurator) noexcept - : context_{std::make_shared(std::move(processors), resource, std::move(logger_configurator))} +LoggerProvider::LoggerProvider( + std::vector> &&processors, + const opentelemetry::sdk::resource::Resource &resource, + std::unique_ptr> + logger_configurator) noexcept + : context_{std::make_shared(std::move(processors), + resource, + std::move(logger_configurator))} {} LoggerProvider::LoggerProvider() noexcept diff --git a/sdk/src/logs/logger_provider_factory.cc b/sdk/src/logs/logger_provider_factory.cc index a9631a0fed..eae6e8a5d5 100644 --- a/sdk/src/logs/logger_provider_factory.cc +++ b/sdk/src/logs/logger_provider_factory.cc @@ -29,7 +29,10 @@ std::unique_ptr LoggerProviderFactory: std::unique_ptr &&processor, const opentelemetry::sdk::resource::Resource &resource) { - auto logger_configurator = std::make_unique>(instrumentationscope::ScopeConfigurator::Builder(LoggerConfig::Default()).Build()); + auto logger_configurator = + std::make_unique>( + instrumentationscope::ScopeConfigurator::Builder(LoggerConfig::Default()) + .Build()); return Create(std::move(processor), resource, std::move(logger_configurator)); } @@ -54,7 +57,10 @@ std::unique_ptr LoggerProviderFactory: std::vector> &&processors, const opentelemetry::sdk::resource::Resource &resource) { - auto logger_configurator = std::make_unique>(instrumentationscope::ScopeConfigurator::Builder(LoggerConfig::Default()).Build()); + auto logger_configurator = + std::make_unique>( + instrumentationscope::ScopeConfigurator::Builder(LoggerConfig::Default()) + .Build()); return Create(std::move(processors), resource, std::move(logger_configurator)); } diff --git a/sdk/test/logs/logger_config_test.cc b/sdk/test/logs/logger_config_test.cc index 624b63dc9a..f9fd21ac5c 100644 --- a/sdk/test/logs/logger_config_test.cc +++ b/sdk/test/logs/logger_config_test.cc @@ -13,7 +13,7 @@ #include "opentelemetry/sdk/instrumentationscope/instrumentation_scope.h" #include "opentelemetry/sdk/instrumentationscope/scope_configurator.h" -namespace logs_sdk = opentelemetry::sdk::logs; +namespace logs_sdk = opentelemetry::sdk::logs; namespace instrumentation_scope = opentelemetry::sdk::instrumentationscope; /** Test to verify the basic behavior of logs_sdk::LoggerConfig */ diff --git a/sdk/test/logs/logger_sdk_test.cc b/sdk/test/logs/logger_sdk_test.cc index 0015e6bde8..7fd948ac63 100644 --- a/sdk/test/logs/logger_sdk_test.cc +++ b/sdk/test/logs/logger_sdk_test.cc @@ -409,8 +409,7 @@ static auto custom_log_configurator_test_data_2 = expected_log_recordable_2, false); // Test Case 3 -static auto instrumentation_scope_3 = - *InstrumentationScope::Create("foo_library", "", schema_url); +static auto instrumentation_scope_3 = *InstrumentationScope::Create("foo_library", "", schema_url); static auto test_log_recordable_3 = create_mock_log_recordable("Info message", opentelemetry::logs::Severity::kInfo); static auto expected_log_recordable_3 = @@ -438,11 +437,8 @@ static auto custom_log_configurator_test_data_4 = // library, see https://github.com/google/googletest/issues/3805#issuecomment-1397301790 for more // details. Using pointers is a workaround to prevent the Valgrind warnings. constexpr std::array log_configurator_test_cases = { - &custom_log_configurator_test_data_1, - &custom_log_configurator_test_data_2, - &custom_log_configurator_test_data_3, - &custom_log_configurator_test_data_4 -}; + &custom_log_configurator_test_data_1, &custom_log_configurator_test_data_2, + &custom_log_configurator_test_data_3, &custom_log_configurator_test_data_4}; // Test fixture for VerifyCustomConfiguratorBehavior class CustomLoggerConfiguratorTestFixture @@ -457,11 +453,11 @@ TEST_P(CustomLoggerConfiguratorTestFixture, VerifyCustomConfiguratorBehavior) }; // custom scope configurator that only disables loggers for library name "foo_library" or do not // have version information - auto test_scope_configurator = ScopeConfigurator( - ScopeConfigurator::Builder(LoggerConfig::Disabled()) - .AddConditionNameEquals("foo_library", LoggerConfig::Disabled()) - .AddCondition(check_if_version_present, LoggerConfig::Enabled()) - .Build()); + auto test_scope_configurator = ScopeConfigurator( + ScopeConfigurator::Builder(LoggerConfig::Disabled()) + .AddConditionNameEquals("foo_library", LoggerConfig::Disabled()) + .AddCondition(check_if_version_present, LoggerConfig::Enabled()) + .Build()); // Get the test case data from fixture CustomLogConfiguratorTestData *test_case = GetParam(); From 83897ea95f214950e60d265dc82a9374d1798bb2 Mon Sep 17 00:00:00 2001 From: Pranav Sharma Date: Wed, 12 Mar 2025 01:31:14 +0000 Subject: [PATCH 06/15] Fix valgrind memory leaks --- sdk/test/logs/logger_sdk_test.cc | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/sdk/test/logs/logger_sdk_test.cc b/sdk/test/logs/logger_sdk_test.cc index 7fd948ac63..f7a52be6ae 100644 --- a/sdk/test/logs/logger_sdk_test.cc +++ b/sdk/test/logs/logger_sdk_test.cc @@ -351,13 +351,14 @@ TEST(LoggerSDK, LoggerWithEnabledConfig) reference_ts.count()); } -static MockLogRecordable &create_mock_log_recordable(const std::string &body, - opentelemetry::logs::Severity severity) +static std::unique_ptr create_mock_log_recordable( + const std::string &body, + opentelemetry::logs::Severity severity) { - auto mock_log_recordable = new MockLogRecordable(); + auto mock_log_recordable = std::make_unique(); mock_log_recordable->SetBody(body); mock_log_recordable->SetSeverity(severity); - return *mock_log_recordable; + return mock_log_recordable; } class CustomLogConfiguratorTestData @@ -393,8 +394,8 @@ static auto expected_log_recordable_1 = create_mock_log_recordable("Log Message", opentelemetry::logs::Severity::kWarn); static auto custom_log_configurator_test_data_1 = CustomLogConfiguratorTestData(instrumentation_scope_1, - test_log_recordable_1, - expected_log_recordable_1, + *test_log_recordable_1, + *expected_log_recordable_1, false); // Test Case 2 static auto instrumentation_scope_2 = @@ -405,8 +406,8 @@ static auto expected_log_recordable_2 = create_mock_log_recordable("", opentelemetry::logs::Severity::kDebug); static auto custom_log_configurator_test_data_2 = CustomLogConfiguratorTestData(instrumentation_scope_2, - test_log_recordable_2, - expected_log_recordable_2, + *test_log_recordable_2, + *expected_log_recordable_2, false); // Test Case 3 static auto instrumentation_scope_3 = *InstrumentationScope::Create("foo_library", "", schema_url); @@ -416,8 +417,8 @@ static auto expected_log_recordable_3 = create_mock_log_recordable("", opentelemetry::logs::Severity::kInvalid); static auto custom_log_configurator_test_data_3 = CustomLogConfiguratorTestData(instrumentation_scope_3, - test_log_recordable_3, - expected_log_recordable_3, + *test_log_recordable_3, + *expected_log_recordable_3, true); // Test Case 4 static auto instrumentation_scope_4 = @@ -428,8 +429,8 @@ static auto expected_log_recordable_4 = create_mock_log_recordable("", opentelemetry::logs::Severity::kInvalid); static auto custom_log_configurator_test_data_4 = CustomLogConfiguratorTestData(instrumentation_scope_4, - test_log_recordable_4, - expected_log_recordable_4, + *test_log_recordable_4, + *expected_log_recordable_4, true); // This array could also directly contain the reference types, but that leads to 'uninitialized From 7290f73b62633784f0628fffb0b027164821084d Mon Sep 17 00:00:00 2001 From: Pranav Sharma Date: Wed, 12 Mar 2025 01:38:41 +0000 Subject: [PATCH 07/15] Fix CMakeLists formatting --- sdk/src/logs/CMakeLists.txt | 3 +-- sdk/test/logs/CMakeLists.txt | 10 +++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/sdk/src/logs/CMakeLists.txt b/sdk/src/logs/CMakeLists.txt index 13e07c148f..178b28f830 100644 --- a/sdk/src/logs/CMakeLists.txt +++ b/sdk/src/logs/CMakeLists.txt @@ -22,8 +22,7 @@ add_library( multi_log_record_processor_factory.cc multi_recordable.cc read_write_log_record.cc - readable_log_record.cc -) + readable_log_record.cc) set_target_properties(opentelemetry_logs PROPERTIES EXPORT_NAME logs) diff --git a/sdk/test/logs/CMakeLists.txt b/sdk/test/logs/CMakeLists.txt index c4f5b91ed8..8ef79df68f 100644 --- a/sdk/test/logs/CMakeLists.txt +++ b/sdk/test/logs/CMakeLists.txt @@ -3,9 +3,13 @@ foreach( testname - logger_provider_set_test logger_provider_sdk_test logger_sdk_test - log_record_test simple_log_record_processor_test - batch_log_record_processor_test logger_config_test) + logger_provider_set_test + logger_provider_sdk_test + logger_sdk_test + log_record_test + simple_log_record_processor_test + batch_log_record_processor_test + logger_config_test) add_executable(${testname} "${testname}.cc") target_link_libraries( ${testname} ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} From f86e8b8df3e41e9d0a0dc7e3ea1122a82319f7c1 Mon Sep 17 00:00:00 2001 From: Pranav Sharma Date: Wed, 12 Mar 2025 01:46:55 +0000 Subject: [PATCH 08/15] Update CHANGELOG --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c51a88bb02..0664817783 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,9 @@ Increment the: * [DEVCONTAINER] Support customization and run as non-root user [#3270](https://github.com/open-telemetry/opentelemetry-cpp/pull/3270) +* [SDK] Add logger scope configurator + [#3282](https://github.com/open-telemetry/opentelemetry-cpp/pull/3282) + Important changes: * [SDK] Support OTEL_SDK_DISABLED environment variable From 3e8861d7943b7cc9be6847c5cfdf4e750ff0c6d3 Mon Sep 17 00:00:00 2001 From: Pranav Sharma Date: Wed, 12 Mar 2025 02:52:48 +0000 Subject: [PATCH 09/15] Fix iwyu warnings --- sdk/src/logs/logger.cc | 6 +++--- sdk/src/logs/logger_context.cc | 2 ++ sdk/src/logs/logger_context_factory.cc | 2 ++ sdk/src/logs/logger_provider.cc | 2 ++ sdk/src/logs/logger_provider_factory.cc | 2 ++ sdk/test/logs/logger_sdk_test.cc | 7 +++++++ 6 files changed, 18 insertions(+), 3 deletions(-) diff --git a/sdk/src/logs/logger.cc b/sdk/src/logs/logger.cc index 3e617502ba..1c0ce3ab26 100644 --- a/sdk/src/logs/logger.cc +++ b/sdk/src/logs/logger.cc @@ -9,15 +9,15 @@ #include "opentelemetry/context/context_value.h" #include "opentelemetry/context/runtime_context.h" #include "opentelemetry/logs/log_record.h" +#include "opentelemetry/logs/noop.h" #include "opentelemetry/nostd/shared_ptr.h" #include "opentelemetry/nostd/string_view.h" #include "opentelemetry/nostd/unique_ptr.h" #include "opentelemetry/nostd/variant.h" #include "opentelemetry/sdk/instrumentationscope/instrumentation_scope.h" +#include "opentelemetry/sdk/instrumentationscope/scope_configurator.h" #include "opentelemetry/sdk/logs/logger.h" - -#include - +#include "opentelemetry/sdk/logs/logger_config.h" #include "opentelemetry/sdk/logs/logger_context.h" #include "opentelemetry/sdk/logs/processor.h" #include "opentelemetry/sdk/logs/recordable.h" diff --git a/sdk/src/logs/logger_context.cc b/sdk/src/logs/logger_context.cc index afb6eb7307..f7ad9db0c6 100644 --- a/sdk/src/logs/logger_context.cc +++ b/sdk/src/logs/logger_context.cc @@ -6,6 +6,8 @@ #include #include +#include "opentelemetry/sdk/instrumentationscope/scope_configurator.h" +#include "opentelemetry/sdk/logs/logger_config.h" #include "opentelemetry/sdk/logs/logger_context.h" #include "opentelemetry/sdk/logs/multi_log_record_processor.h" #include "opentelemetry/sdk/logs/processor.h" diff --git a/sdk/src/logs/logger_context_factory.cc b/sdk/src/logs/logger_context_factory.cc index e9445bd409..ccdfe87e8d 100644 --- a/sdk/src/logs/logger_context_factory.cc +++ b/sdk/src/logs/logger_context_factory.cc @@ -5,6 +5,8 @@ #include #include +#include "opentelemetry/sdk/instrumentationscope/scope_configurator.h" +#include "opentelemetry/sdk/logs/logger_config.h" #include "opentelemetry/sdk/logs/logger_context.h" #include "opentelemetry/sdk/logs/logger_context_factory.h" #include "opentelemetry/sdk/logs/processor.h" diff --git a/sdk/src/logs/logger_provider.cc b/sdk/src/logs/logger_provider.cc index b2617c9cdb..159fd2b165 100644 --- a/sdk/src/logs/logger_provider.cc +++ b/sdk/src/logs/logger_provider.cc @@ -13,7 +13,9 @@ #include "opentelemetry/nostd/string_view.h" #include "opentelemetry/sdk/common/global_log_handler.h" #include "opentelemetry/sdk/instrumentationscope/instrumentation_scope.h" +#include "opentelemetry/sdk/instrumentationscope/scope_configurator.h" #include "opentelemetry/sdk/logs/logger.h" +#include "opentelemetry/sdk/logs/logger_config.h" #include "opentelemetry/sdk/logs/logger_context.h" #include "opentelemetry/sdk/logs/logger_provider.h" #include "opentelemetry/sdk/logs/processor.h" diff --git a/sdk/src/logs/logger_provider_factory.cc b/sdk/src/logs/logger_provider_factory.cc index eae6e8a5d5..f80dd43b5d 100644 --- a/sdk/src/logs/logger_provider_factory.cc +++ b/sdk/src/logs/logger_provider_factory.cc @@ -5,6 +5,8 @@ #include #include +#include "opentelemetry/sdk/instrumentationscope/scope_configurator.h" +#include "opentelemetry/sdk/logs/logger_config.h" #include "opentelemetry/sdk/logs/logger_context.h" #include "opentelemetry/sdk/logs/logger_provider.h" #include "opentelemetry/sdk/logs/logger_provider_factory.h" diff --git a/sdk/test/logs/logger_sdk_test.cc b/sdk/test/logs/logger_sdk_test.cc index f7a52be6ae..4748edb012 100644 --- a/sdk/test/logs/logger_sdk_test.cc +++ b/sdk/test/logs/logger_sdk_test.cc @@ -3,7 +3,10 @@ #include #include +#include +#include #include +#include #include #include #include @@ -12,16 +15,20 @@ #include "opentelemetry/common/timestamp.h" #include "opentelemetry/logs/event_logger.h" #include "opentelemetry/logs/event_logger_provider.h" +#include "opentelemetry/logs/log_record.h" #include "opentelemetry/logs/logger.h" #include "opentelemetry/logs/logger_provider.h" +#include "opentelemetry/logs/noop.h" #include "opentelemetry/logs/severity.h" #include "opentelemetry/nostd/shared_ptr.h" #include "opentelemetry/nostd/span.h" #include "opentelemetry/nostd/string_view.h" #include "opentelemetry/nostd/variant.h" #include "opentelemetry/sdk/instrumentationscope/instrumentation_scope.h" +#include "opentelemetry/sdk/instrumentationscope/scope_configurator.h" #include "opentelemetry/sdk/logs/event_logger_provider.h" #include "opentelemetry/sdk/logs/logger.h" +#include "opentelemetry/sdk/logs/logger_config.h" #include "opentelemetry/sdk/logs/logger_provider.h" #include "opentelemetry/sdk/logs/processor.h" #include "opentelemetry/sdk/logs/recordable.h" From 4b9cfe1f573fd253f639e63751809e7df267e14f Mon Sep 17 00:00:00 2001 From: Pranav Sharma Date: Wed, 12 Mar 2025 16:11:48 +0000 Subject: [PATCH 10/15] Fix MSVC maintainer mode CI checks --- sdk/test/logs/logger_sdk_test.cc | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/sdk/test/logs/logger_sdk_test.cc b/sdk/test/logs/logger_sdk_test.cc index 4748edb012..91cc701c6a 100644 --- a/sdk/test/logs/logger_sdk_test.cc +++ b/sdk/test/logs/logger_sdk_test.cc @@ -389,12 +389,12 @@ class CustomLogConfiguratorTestData // constants used in VerifyCustomConfiguratorBehavior test static auto noop_logger = logs_api::NoopLogger(); -const std::string schema_url{"https://opentelemetry.io/schemas/1.11.0"}; +const std::string schema{"https://opentelemetry.io/schemas/1.11.0"}; // Generate test case data // Test Case 1 static auto instrumentation_scope_1 = - *InstrumentationScope::Create("opentelemetry_library", "1.0.0", schema_url); + *InstrumentationScope::Create("opentelemetry_library", "1.0.0", schema); static auto test_log_recordable_1 = create_mock_log_recordable("Log Message", opentelemetry::logs::Severity::kWarn); static auto expected_log_recordable_1 = @@ -405,8 +405,7 @@ static auto custom_log_configurator_test_data_1 = *expected_log_recordable_1, false); // Test Case 2 -static auto instrumentation_scope_2 = - *InstrumentationScope::Create("bar_library", "1.0.0", schema_url); +static auto instrumentation_scope_2 = *InstrumentationScope::Create("bar_library", "1.0.0", schema); static auto test_log_recordable_2 = create_mock_log_recordable("", opentelemetry::logs::Severity::kDebug); static auto expected_log_recordable_2 = @@ -417,7 +416,7 @@ static auto custom_log_configurator_test_data_2 = *expected_log_recordable_2, false); // Test Case 3 -static auto instrumentation_scope_3 = *InstrumentationScope::Create("foo_library", "", schema_url); +static auto instrumentation_scope_3 = *InstrumentationScope::Create("foo_library", "", schema); static auto test_log_recordable_3 = create_mock_log_recordable("Info message", opentelemetry::logs::Severity::kInfo); static auto expected_log_recordable_3 = @@ -428,8 +427,7 @@ static auto custom_log_configurator_test_data_3 = *expected_log_recordable_3, true); // Test Case 4 -static auto instrumentation_scope_4 = - *InstrumentationScope::Create("allowed_library", "", schema_url); +static auto instrumentation_scope_4 = *InstrumentationScope::Create("allowed_library", "", schema); static auto test_log_recordable_4 = create_mock_log_recordable("Scope version missing", opentelemetry::logs::Severity::kInfo); static auto expected_log_recordable_4 = From b1f0fe9c0083cfa3d05a81ae6542c83d41b436d9 Mon Sep 17 00:00:00 2001 From: Pranav Sharma Date: Wed, 12 Mar 2025 16:46:43 +0000 Subject: [PATCH 11/15] Update assertion comparison to be more robust Comparison of timestamps has been moved from GT to GE since depending on the machine, the operations may execute within 1 ns, which is lower than the resolution of time being captured. --- sdk/test/logs/logger_sdk_test.cc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/sdk/test/logs/logger_sdk_test.cc b/sdk/test/logs/logger_sdk_test.cc index 91cc701c6a..b4bdf2f420 100644 --- a/sdk/test/logs/logger_sdk_test.cc +++ b/sdk/test/logs/logger_sdk_test.cc @@ -346,15 +346,14 @@ TEST(LoggerSDK, LoggerWithEnabledConfig) logger->EmitLogRecord(std::move(log_record)); // Since log_record was created after recording reference timestamp, expect that observed // timestamp is greater - ASSERT_GT(shared_recordable->GetObservedTimestamp().time_since_epoch().count(), + ASSERT_GE(shared_recordable->GetObservedTimestamp().time_since_epoch().count(), reference_ts.count()); - // Since this logger should behave like a noop logger, no values within the recordable would be - // set. + // Since this logger should behave like a valid logger, values within the recordable would be set. logger->EmitLogRecord(logs_api::Severity::kWarn, "Log Message"); ASSERT_EQ(shared_recordable->GetBody(), "Log Message"); ASSERT_EQ(shared_recordable->GetSeverity(), opentelemetry::logs::Severity::kWarn); - ASSERT_GT(shared_recordable->GetObservedTimestamp().time_since_epoch().count(), + ASSERT_GE(shared_recordable->GetObservedTimestamp().time_since_epoch().count(), reference_ts.count()); } @@ -500,7 +499,7 @@ TEST_P(CustomLoggerConfiguratorTestFixture, VerifyCustomConfiguratorBehavior) else { ASSERT_EQ(logger_under_test->GetName(), "test-logger"); - ASSERT_GT(shared_recordable_under_test->GetObservedTimestamp().time_since_epoch().count(), + ASSERT_GE(shared_recordable_under_test->GetObservedTimestamp().time_since_epoch().count(), reference_ts.count()); } From 07daca3a158087cd83d84eb823ce308c1f61dee1 Mon Sep 17 00:00:00 2001 From: Pranav Sharma Date: Wed, 12 Mar 2025 20:22:07 +0000 Subject: [PATCH 12/15] Add documentation for header files --- .../opentelemetry/sdk/logs/logger_config.h | 25 +++++++++++++++++++ .../opentelemetry/sdk/logs/logger_context.h | 4 +++ .../sdk/logs/logger_context_factory.h | 17 ++++++++++--- .../opentelemetry/sdk/logs/logger_provider.h | 11 ++++++-- 4 files changed, 52 insertions(+), 5 deletions(-) diff --git a/sdk/include/opentelemetry/sdk/logs/logger_config.h b/sdk/include/opentelemetry/sdk/logs/logger_config.h index 8eeeff9a4e..f6188200a1 100644 --- a/sdk/include/opentelemetry/sdk/logs/logger_config.h +++ b/sdk/include/opentelemetry/sdk/logs/logger_config.h @@ -10,17 +10,42 @@ namespace sdk { namespace logs { +/** + * LoggerConfig defines various configurable aspects of a Logger's behavior. + * This class should not be used directly to configure a Logger's behavior, instead a + * ScopeConfigurator should be used to compute the desired LoggerConfig which can then be used to + * configure a Logger. + */ class LoggerConfig { public: bool operator==(const LoggerConfig &other) const noexcept; + /** + * Returns if the Logger is enabled or disabled. Loggers are enabled by default. + * @return a boolean indicating if the Logger is enabled. Defaults to true. + */ bool IsEnabled() const noexcept; + /** + * Returns a LoggerConfig that represents an enabled Logger. + * @return a static constant LoggerConfig that represents an enabled logger. + */ static LoggerConfig Enabled(); + /** + * Returns a LoggerConfig that represents a disabled Logger. A disabled logger behaves like a + * no-op logger. + * @return a static constant LoggerConfig that represents a disabled logger. + */ static LoggerConfig Disabled(); + /** + * Returns a LoggerConfig that represents a Logger configured with the default behavior. + * The default behavior is guided by the OpenTelemetry specification. + * @return a static constant LoggerConfig that represents a logger configured with default + * behavior. + */ static LoggerConfig Default(); private: diff --git a/sdk/include/opentelemetry/sdk/logs/logger_context.h b/sdk/include/opentelemetry/sdk/logs/logger_context.h index b3222b0f26..038da2d948 100644 --- a/sdk/include/opentelemetry/sdk/logs/logger_context.h +++ b/sdk/include/opentelemetry/sdk/logs/logger_context.h @@ -69,6 +69,10 @@ class LoggerContext */ const opentelemetry::sdk::resource::Resource &GetResource() const noexcept; + /** + * Obtain the ScopeConfigurator with this logger context. + * @return The ScopeConfigurator for this logger context. + */ const instrumentationscope::ScopeConfigurator &GetLoggerConfigurator() const noexcept; diff --git a/sdk/include/opentelemetry/sdk/logs/logger_context_factory.h b/sdk/include/opentelemetry/sdk/logs/logger_context_factory.h index 3b2e8ed944..333c76f511 100644 --- a/sdk/include/opentelemetry/sdk/logs/logger_context_factory.h +++ b/sdk/include/opentelemetry/sdk/logs/logger_context_factory.h @@ -24,20 +24,31 @@ class LoggerContextFactory { public: /** - * Create a LoggerContext. + * Create a LoggerContext with specified LogRecordProcessors. + * @param processors A vector of log processors that can parse the logs. + * @return A unique pointer to the created LoggerContext object. */ static std::unique_ptr Create( std::vector> &&processors); /** - * Create a LoggerContext. + * Create a LoggerContext with specified LogRecordProcessors and OpenTelemetry resource. + * @param processors A vector of log processors that can parse the logs. + * @param resource The OpenTelemetry resource responsible for generating the logs. + * @return A unique pointer to the created LoggerContext object. */ static std::unique_ptr Create( std::vector> &&processors, const opentelemetry::sdk::resource::Resource &resource); /** - * Create a LoggerContext. + * Create a LoggerContext with specified LogRecordProcessors, OpenTelemetry resource and a logger + * ScopeConfigurator. + * @param processors A vector of log processors that can parse the logs. + * @param resource The OpenTelemetry resource responsible for generating the logs. + * @param logger_configurator A ScopeConfigurator that can be used compute the LoggerConfig for a + * given InstrumentationScope. + * @return A unique pointer to the created LoggerContext object. */ static std::unique_ptr Create( std::vector> &&processors, diff --git a/sdk/include/opentelemetry/sdk/logs/logger_provider.h b/sdk/include/opentelemetry/sdk/logs/logger_provider.h index d70b2d1f4e..ee5165ebd2 100644 --- a/sdk/include/opentelemetry/sdk/logs/logger_provider.h +++ b/sdk/include/opentelemetry/sdk/logs/logger_provider.h @@ -32,8 +32,8 @@ class OPENTELEMETRY_EXPORT LoggerProvider final : public opentelemetry::logs::Lo { public: /** - * Initialize a new logger provider - * @param processor The span processor for this logger provider. This must + * Initialize a new logger provider. + * @param processor The log record processor for this logger provider. This must * not be a nullptr. * @param resource The resources for this logger provider. */ @@ -47,6 +47,13 @@ class OPENTELEMETRY_EXPORT LoggerProvider final : public opentelemetry::logs::Lo LoggerConfig::Default()) .Build())) noexcept; + /** + * Initialize a new logger provider. + * @param processors A list of log record processors for this logger provider. + * @param resource The resources for this logger provider. + * @param logger_configurator The scope configurator used to determine the configs for loggers + * created using this logger provider. + */ explicit LoggerProvider( std::vector> &&processors, const opentelemetry::sdk::resource::Resource &resource = From 49a30ab2e3cc5ce01594a5326268e55db6e974b2 Mon Sep 17 00:00:00 2001 From: Pranav Sharma Date: Mon, 17 Mar 2025 21:16:24 +0000 Subject: [PATCH 13/15] Use static local variables for logger configs --- sdk/include/opentelemetry/sdk/logs/logger_config.h | 2 -- sdk/src/logs/logger_config.cc | 7 +++---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/sdk/include/opentelemetry/sdk/logs/logger_config.h b/sdk/include/opentelemetry/sdk/logs/logger_config.h index f6188200a1..26f8f636f2 100644 --- a/sdk/include/opentelemetry/sdk/logs/logger_config.h +++ b/sdk/include/opentelemetry/sdk/logs/logger_config.h @@ -52,8 +52,6 @@ class LoggerConfig explicit LoggerConfig(const bool disabled = false) : disabled_(disabled) {} bool disabled_; - static const LoggerConfig kDisabledConfig; - static const LoggerConfig kDefaultConfig; }; } // namespace logs } // namespace sdk diff --git a/sdk/src/logs/logger_config.cc b/sdk/src/logs/logger_config.cc index e63bc65dcc..bd6f8dfa0e 100644 --- a/sdk/src/logs/logger_config.cc +++ b/sdk/src/logs/logger_config.cc @@ -9,9 +9,6 @@ namespace sdk namespace logs { -const LoggerConfig LoggerConfig::kDefaultConfig = LoggerConfig(); -const LoggerConfig LoggerConfig::kDisabledConfig = LoggerConfig(true); - bool LoggerConfig::operator==(const LoggerConfig &other) const noexcept { return disabled_ == other.disabled_; @@ -24,16 +21,18 @@ bool LoggerConfig::IsEnabled() const noexcept LoggerConfig LoggerConfig::Enabled() { - return kDefaultConfig; + return Default(); } LoggerConfig LoggerConfig::Disabled() { + static const auto kDisabledConfig = LoggerConfig(true); return kDisabledConfig; } LoggerConfig LoggerConfig::Default() { + static const auto kDefaultConfig = LoggerConfig(); return kDefaultConfig; } From ed51800526637cacc161636cd1c62683370cd01d Mon Sep 17 00:00:00 2001 From: Pranav Sharma Date: Mon, 17 Mar 2025 23:38:29 +0000 Subject: [PATCH 14/15] empty commit re-run CI From 511f7a111d8713443968a29c26d160d7729b97d9 Mon Sep 17 00:00:00 2001 From: Pranav Sharma Date: Tue, 18 Mar 2025 19:27:11 +0000 Subject: [PATCH 15/15] Add OPENTELEMETRY_EXPORT to member functions of logger_config --- sdk/include/opentelemetry/sdk/logs/logger_config.h | 2 +- sdk/src/logs/logger_config.cc | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/sdk/include/opentelemetry/sdk/logs/logger_config.h b/sdk/include/opentelemetry/sdk/logs/logger_config.h index 26f8f636f2..6504102995 100644 --- a/sdk/include/opentelemetry/sdk/logs/logger_config.h +++ b/sdk/include/opentelemetry/sdk/logs/logger_config.h @@ -16,7 +16,7 @@ namespace logs * ScopeConfigurator should be used to compute the desired LoggerConfig which can then be used to * configure a Logger. */ -class LoggerConfig +class OPENTELEMETRY_EXPORT LoggerConfig { public: bool operator==(const LoggerConfig &other) const noexcept; diff --git a/sdk/src/logs/logger_config.cc b/sdk/src/logs/logger_config.cc index bd6f8dfa0e..2bc8aeb5f4 100644 --- a/sdk/src/logs/logger_config.cc +++ b/sdk/src/logs/logger_config.cc @@ -9,28 +9,28 @@ namespace sdk namespace logs { -bool LoggerConfig::operator==(const LoggerConfig &other) const noexcept +OPENTELEMETRY_EXPORT bool LoggerConfig::operator==(const LoggerConfig &other) const noexcept { return disabled_ == other.disabled_; } -bool LoggerConfig::IsEnabled() const noexcept +OPENTELEMETRY_EXPORT bool LoggerConfig::IsEnabled() const noexcept { return !disabled_; } -LoggerConfig LoggerConfig::Enabled() +OPENTELEMETRY_EXPORT LoggerConfig LoggerConfig::Enabled() { return Default(); } -LoggerConfig LoggerConfig::Disabled() +OPENTELEMETRY_EXPORT LoggerConfig LoggerConfig::Disabled() { static const auto kDisabledConfig = LoggerConfig(true); return kDisabledConfig; } -LoggerConfig LoggerConfig::Default() +OPENTELEMETRY_EXPORT LoggerConfig LoggerConfig::Default() { static const auto kDefaultConfig = LoggerConfig(); return kDefaultConfig;