Skip to content

Commit d09bfba

Browse files
authored
[SDK] Add logger scope configurator (open-telemetry#3282)
1 parent 148cfe9 commit d09bfba

18 files changed

+642
-28
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ Increment the:
2727
* [DEVCONTAINER] Support customization and run as non-root user
2828
[#3270](https://github.com/open-telemetry/opentelemetry-cpp/pull/3270)
2929

30+
* [SDK] Add logger scope configurator
31+
[#3282](https://github.com/open-telemetry/opentelemetry-cpp/pull/3282)
32+
3033
Important changes:
3134

3235
* [SDK] Support OTEL_SDK_DISABLED environment variable

sdk/include/opentelemetry/sdk/logs/logger.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
#include <memory>
77
#include <string>
88

9+
#include "logger_config.h"
910
#include "opentelemetry/logs/log_record.h"
1011
#include "opentelemetry/logs/logger.h"
12+
#include "opentelemetry/logs/noop.h"
1113
#include "opentelemetry/nostd/string_view.h"
1214
#include "opentelemetry/nostd/unique_ptr.h"
1315
#include "opentelemetry/sdk/instrumentationscope/instrumentation_scope.h"
@@ -65,6 +67,8 @@ class Logger final : public opentelemetry::logs::Logger
6567
// logger-context.
6668
std::unique_ptr<instrumentationscope::InstrumentationScope> instrumentation_scope_;
6769
std::shared_ptr<LoggerContext> context_;
70+
LoggerConfig logger_config_;
71+
static opentelemetry::logs::NoopLogger kNoopLogger;
6872
};
6973

7074
} // namespace logs
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#pragma once
5+
6+
#include "opentelemetry/version.h"
7+
8+
OPENTELEMETRY_BEGIN_NAMESPACE
9+
namespace sdk
10+
{
11+
namespace logs
12+
{
13+
/**
14+
* LoggerConfig defines various configurable aspects of a Logger's behavior.
15+
* This class should not be used directly to configure a Logger's behavior, instead a
16+
* ScopeConfigurator should be used to compute the desired LoggerConfig which can then be used to
17+
* configure a Logger.
18+
*/
19+
class OPENTELEMETRY_EXPORT LoggerConfig
20+
{
21+
public:
22+
bool operator==(const LoggerConfig &other) const noexcept;
23+
24+
/**
25+
* Returns if the Logger is enabled or disabled. Loggers are enabled by default.
26+
* @return a boolean indicating if the Logger is enabled. Defaults to true.
27+
*/
28+
bool IsEnabled() const noexcept;
29+
30+
/**
31+
* Returns a LoggerConfig that represents an enabled Logger.
32+
* @return a static constant LoggerConfig that represents an enabled logger.
33+
*/
34+
static LoggerConfig Enabled();
35+
36+
/**
37+
* Returns a LoggerConfig that represents a disabled Logger. A disabled logger behaves like a
38+
* no-op logger.
39+
* @return a static constant LoggerConfig that represents a disabled logger.
40+
*/
41+
static LoggerConfig Disabled();
42+
43+
/**
44+
* Returns a LoggerConfig that represents a Logger configured with the default behavior.
45+
* The default behavior is guided by the OpenTelemetry specification.
46+
* @return a static constant LoggerConfig that represents a logger configured with default
47+
* behavior.
48+
*/
49+
static LoggerConfig Default();
50+
51+
private:
52+
explicit LoggerConfig(const bool disabled = false) : disabled_(disabled) {}
53+
54+
bool disabled_;
55+
};
56+
} // namespace logs
57+
} // namespace sdk
58+
OPENTELEMETRY_END_NAMESPACE

sdk/include/opentelemetry/sdk/logs/logger_context.h

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
#include <memory>
88
#include <vector>
99

10+
#include "logger_config.h"
11+
#include "opentelemetry/sdk/instrumentationscope/scope_configurator.h"
1012
#include "opentelemetry/sdk/logs/processor.h"
1113
#include "opentelemetry/sdk/resource/resource.h"
1214
#include "opentelemetry/version.h"
@@ -33,9 +35,15 @@ namespace logs
3335
class LoggerContext
3436
{
3537
public:
36-
explicit LoggerContext(std::vector<std::unique_ptr<LogRecordProcessor>> &&processors,
37-
const opentelemetry::sdk::resource::Resource &resource =
38-
opentelemetry::sdk::resource::Resource::Create({})) noexcept;
38+
explicit LoggerContext(
39+
std::vector<std::unique_ptr<LogRecordProcessor>> &&processors,
40+
const opentelemetry::sdk::resource::Resource &resource =
41+
opentelemetry::sdk::resource::Resource::Create({}),
42+
std::unique_ptr<instrumentationscope::ScopeConfigurator<LoggerConfig>> logger_configurator =
43+
std::make_unique<instrumentationscope::ScopeConfigurator<LoggerConfig>>(
44+
instrumentationscope::ScopeConfigurator<LoggerConfig>::Builder(
45+
LoggerConfig::Default())
46+
.Build())) noexcept;
3947

4048
/**
4149
* Attaches a log processor to list of configured processors to this logger context.
@@ -61,6 +69,13 @@ class LoggerContext
6169
*/
6270
const opentelemetry::sdk::resource::Resource &GetResource() const noexcept;
6371

72+
/**
73+
* Obtain the ScopeConfigurator with this logger context.
74+
* @return The ScopeConfigurator for this logger context.
75+
*/
76+
const instrumentationscope::ScopeConfigurator<LoggerConfig> &GetLoggerConfigurator()
77+
const noexcept;
78+
6479
/**
6580
* Force all active LogProcessors to flush any buffered logs
6681
* within the given timeout.
@@ -76,6 +91,8 @@ class LoggerContext
7691
// order of declaration is important here - resource object should be destroyed after processor.
7792
opentelemetry::sdk::resource::Resource resource_;
7893
std::unique_ptr<LogRecordProcessor> processor_;
94+
95+
std::unique_ptr<instrumentationscope::ScopeConfigurator<LoggerConfig>> logger_configurator_;
7996
};
8097
} // namespace logs
8198
} // namespace sdk

sdk/include/opentelemetry/sdk/logs/logger_context_factory.h

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,36 @@ class LoggerContextFactory
2424
{
2525
public:
2626
/**
27-
* Create a LoggerContext.
27+
* Create a LoggerContext with specified LogRecordProcessors.
28+
* @param processors A vector of log processors that can parse the logs.
29+
* @return A unique pointer to the created LoggerContext object.
2830
*/
2931
static std::unique_ptr<LoggerContext> Create(
3032
std::vector<std::unique_ptr<LogRecordProcessor>> &&processors);
3133

3234
/**
33-
* Create a LoggerContext.
35+
* Create a LoggerContext with specified LogRecordProcessors and OpenTelemetry resource.
36+
* @param processors A vector of log processors that can parse the logs.
37+
* @param resource The OpenTelemetry resource responsible for generating the logs.
38+
* @return A unique pointer to the created LoggerContext object.
3439
*/
3540
static std::unique_ptr<LoggerContext> Create(
3641
std::vector<std::unique_ptr<LogRecordProcessor>> &&processors,
3742
const opentelemetry::sdk::resource::Resource &resource);
43+
44+
/**
45+
* Create a LoggerContext with specified LogRecordProcessors, OpenTelemetry resource and a logger
46+
* ScopeConfigurator.
47+
* @param processors A vector of log processors that can parse the logs.
48+
* @param resource The OpenTelemetry resource responsible for generating the logs.
49+
* @param logger_configurator A ScopeConfigurator that can be used compute the LoggerConfig for a
50+
* given InstrumentationScope.
51+
* @return A unique pointer to the created LoggerContext object.
52+
*/
53+
static std::unique_ptr<LoggerContext> Create(
54+
std::vector<std::unique_ptr<LogRecordProcessor>> &&processors,
55+
const opentelemetry::sdk::resource::Resource &resource,
56+
std::unique_ptr<instrumentationscope::ScopeConfigurator<LoggerConfig>> logger_configurator);
3857
};
3958

4059
} // namespace logs

sdk/include/opentelemetry/sdk/logs/logger_provider.h

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,37 @@ class OPENTELEMETRY_EXPORT LoggerProvider final : public opentelemetry::logs::Lo
3232
{
3333
public:
3434
/**
35-
* Initialize a new logger provider
36-
* @param processor The span processor for this logger provider. This must
35+
* Initialize a new logger provider.
36+
* @param processor The log record processor for this logger provider. This must
3737
* not be a nullptr.
3838
* @param resource The resources for this logger provider.
3939
*/
40-
explicit LoggerProvider(std::unique_ptr<LogRecordProcessor> &&processor,
41-
const opentelemetry::sdk::resource::Resource &resource =
42-
opentelemetry::sdk::resource::Resource::Create({})) noexcept;
40+
explicit LoggerProvider(
41+
std::unique_ptr<LogRecordProcessor> &&processor,
42+
const opentelemetry::sdk::resource::Resource &resource =
43+
opentelemetry::sdk::resource::Resource::Create({}),
44+
std::unique_ptr<instrumentationscope::ScopeConfigurator<LoggerConfig>> logger_configurator =
45+
std::make_unique<instrumentationscope::ScopeConfigurator<LoggerConfig>>(
46+
instrumentationscope::ScopeConfigurator<LoggerConfig>::Builder(
47+
LoggerConfig::Default())
48+
.Build())) noexcept;
4349

44-
explicit LoggerProvider(std::vector<std::unique_ptr<LogRecordProcessor>> &&processors,
45-
const opentelemetry::sdk::resource::Resource &resource =
46-
opentelemetry::sdk::resource::Resource::Create({})) noexcept;
50+
/**
51+
* Initialize a new logger provider.
52+
* @param processors A list of log record processors for this logger provider.
53+
* @param resource The resources for this logger provider.
54+
* @param logger_configurator The scope configurator used to determine the configs for loggers
55+
* created using this logger provider.
56+
*/
57+
explicit LoggerProvider(
58+
std::vector<std::unique_ptr<LogRecordProcessor>> &&processors,
59+
const opentelemetry::sdk::resource::Resource &resource =
60+
opentelemetry::sdk::resource::Resource::Create({}),
61+
std::unique_ptr<instrumentationscope::ScopeConfigurator<LoggerConfig>> logger_configurator =
62+
std::make_unique<instrumentationscope::ScopeConfigurator<LoggerConfig>>(
63+
instrumentationscope::ScopeConfigurator<LoggerConfig>::Builder(
64+
LoggerConfig::Default())
65+
.Build())) noexcept;
4766

4867
/**
4968
* Initialize a new logger provider. A processor must later be assigned

sdk/include/opentelemetry/sdk/logs/logger_provider_factory.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,14 @@ class OPENTELEMETRY_EXPORT LoggerProviderFactory
3737
std::unique_ptr<LogRecordProcessor> &&processor,
3838
const opentelemetry::sdk::resource::Resource &resource);
3939

40+
/**
41+
* Create a LoggerProvider.
42+
*/
43+
static std::unique_ptr<opentelemetry::sdk::logs::LoggerProvider> Create(
44+
std::unique_ptr<LogRecordProcessor> &&processor,
45+
const opentelemetry::sdk::resource::Resource &resource,
46+
std::unique_ptr<instrumentationscope::ScopeConfigurator<LoggerConfig>> logger_configurator);
47+
4048
/**
4149
* Create a LoggerProvider.
4250
*/
@@ -50,6 +58,14 @@ class OPENTELEMETRY_EXPORT LoggerProviderFactory
5058
std::vector<std::unique_ptr<LogRecordProcessor>> &&processors,
5159
const opentelemetry::sdk::resource::Resource &resource);
5260

61+
/**
62+
* Create a LoggerProvider.
63+
*/
64+
static std::unique_ptr<opentelemetry::sdk::logs::LoggerProvider> Create(
65+
std::vector<std::unique_ptr<LogRecordProcessor>> &&processors,
66+
const opentelemetry::sdk::resource::Resource &resource,
67+
std::unique_ptr<instrumentationscope::ScopeConfigurator<LoggerConfig>> logger_configurator);
68+
5369
/**
5470
* Create a LoggerProvider.
5571
*/

sdk/src/logs/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ add_library(
1515
simple_log_record_processor_factory.cc
1616
batch_log_record_processor.cc
1717
batch_log_record_processor_factory.cc
18+
logger_config.cc
1819
logger_context.cc
1920
logger_context_factory.cc
2021
multi_log_record_processor.cc

sdk/src/logs/logger.cc

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,15 @@
99
#include "opentelemetry/context/context_value.h"
1010
#include "opentelemetry/context/runtime_context.h"
1111
#include "opentelemetry/logs/log_record.h"
12+
#include "opentelemetry/logs/noop.h"
1213
#include "opentelemetry/nostd/shared_ptr.h"
1314
#include "opentelemetry/nostd/string_view.h"
1415
#include "opentelemetry/nostd/unique_ptr.h"
1516
#include "opentelemetry/nostd/variant.h"
1617
#include "opentelemetry/sdk/instrumentationscope/instrumentation_scope.h"
18+
#include "opentelemetry/sdk/instrumentationscope/scope_configurator.h"
1719
#include "opentelemetry/sdk/logs/logger.h"
20+
#include "opentelemetry/sdk/logs/logger_config.h"
1821
#include "opentelemetry/sdk/logs/logger_context.h"
1922
#include "opentelemetry/sdk/logs/processor.h"
2023
#include "opentelemetry/sdk/logs/recordable.h"
@@ -31,22 +34,34 @@ namespace logs
3134
namespace trace_api = opentelemetry::trace;
3235
namespace common = opentelemetry::common;
3336

37+
opentelemetry::logs::NoopLogger Logger::kNoopLogger = opentelemetry::logs::NoopLogger();
38+
3439
Logger::Logger(
3540
opentelemetry::nostd::string_view name,
3641
std::shared_ptr<LoggerContext> context,
3742
std::unique_ptr<instrumentationscope::InstrumentationScope> instrumentation_scope) noexcept
3843
: logger_name_(std::string(name)),
3944
instrumentation_scope_(std::move(instrumentation_scope)),
40-
context_(std::move(context))
45+
context_(std::move(context)),
46+
logger_config_(context_->GetLoggerConfigurator().ComputeConfig(*instrumentation_scope_))
4147
{}
4248

4349
const opentelemetry::nostd::string_view Logger::GetName() noexcept
4450
{
51+
if (!logger_config_.IsEnabled())
52+
{
53+
return kNoopLogger.GetName();
54+
}
4555
return logger_name_;
4656
}
4757

4858
opentelemetry::nostd::unique_ptr<opentelemetry::logs::LogRecord> Logger::CreateLogRecord() noexcept
4959
{
60+
if (!logger_config_.IsEnabled())
61+
{
62+
return kNoopLogger.CreateLogRecord();
63+
}
64+
5065
auto recordable = context_->GetProcessor().MakeRecordable();
5166

5267
recordable->SetObservedTimestamp(std::chrono::system_clock::now());
@@ -90,6 +105,11 @@ opentelemetry::nostd::unique_ptr<opentelemetry::logs::LogRecord> Logger::CreateL
90105
void Logger::EmitLogRecord(
91106
opentelemetry::nostd::unique_ptr<opentelemetry::logs::LogRecord> &&log_record) noexcept
92107
{
108+
if (!logger_config_.IsEnabled())
109+
{
110+
return kNoopLogger.EmitLogRecord(std::move(log_record));
111+
}
112+
93113
if (!log_record)
94114
{
95115
return;

sdk/src/logs/logger_config.cc

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#include "opentelemetry/sdk/logs/logger_config.h"
5+
6+
OPENTELEMETRY_BEGIN_NAMESPACE
7+
namespace sdk
8+
{
9+
namespace logs
10+
{
11+
12+
OPENTELEMETRY_EXPORT bool LoggerConfig::operator==(const LoggerConfig &other) const noexcept
13+
{
14+
return disabled_ == other.disabled_;
15+
}
16+
17+
OPENTELEMETRY_EXPORT bool LoggerConfig::IsEnabled() const noexcept
18+
{
19+
return !disabled_;
20+
}
21+
22+
OPENTELEMETRY_EXPORT LoggerConfig LoggerConfig::Enabled()
23+
{
24+
return Default();
25+
}
26+
27+
OPENTELEMETRY_EXPORT LoggerConfig LoggerConfig::Disabled()
28+
{
29+
static const auto kDisabledConfig = LoggerConfig(true);
30+
return kDisabledConfig;
31+
}
32+
33+
OPENTELEMETRY_EXPORT LoggerConfig LoggerConfig::Default()
34+
{
35+
static const auto kDefaultConfig = LoggerConfig();
36+
return kDefaultConfig;
37+
}
38+
39+
} // namespace logs
40+
} // namespace sdk
41+
OPENTELEMETRY_END_NAMESPACE

0 commit comments

Comments
 (0)