-
Notifications
You must be signed in to change notification settings - Fork 500
[SDK] Add tracer scope configurator #3137
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 29 commits
ae5cdf4
9117eff
127311b
20cb4e9
df36a54
a80800e
694f9c0
f815c3e
9b89786
541c0eb
a67ea85
bcd6e94
2e2afd4
4de93cb
cfd9730
47acb3f
f7dde19
d87997d
2f1ee38
31c73a3
5f6a95f
501fa47
c2bf6f9
47dd040
98ca2c3
be16f38
cd9d360
f0e9df6
7c90e1b
4d16975
5efb9dd
8511e80
bcbcbe2
6bc257e
98ec24d
62c19d6
349c903
ad9e1e1
784b0d4
9452789
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,141 @@ | ||
// Copyright The OpenTelemetry Authors | ||
// SPDX-License-Identifier: Apache-2.0 | ||
|
||
#pragma once | ||
#include <functional> | ||
|
||
#include "opentelemetry/sdk/instrumentationscope/instrumentation_scope.h" | ||
#include "opentelemetry/version.h" | ||
|
||
OPENTELEMETRY_BEGIN_NAMESPACE | ||
namespace sdk | ||
{ | ||
namespace instrumentationscope | ||
{ | ||
/** | ||
* A scope configurator is a function that returns the scope config for a given instrumentation | ||
* scope. | ||
*/ | ||
template <typename T> | ||
class ScopeConfigurator | ||
{ | ||
public: | ||
/** | ||
* A builder class for the ScopeConfigurator that facilitates the creation of ScopeConfigurators. | ||
*/ | ||
class Builder | ||
{ | ||
public: | ||
/** | ||
* Constructor for a builder object that cam be used to create a scope configurator. A minimally | ||
* configured builder would build a ScopeConfigurator that applies the default_scope_config to | ||
* every instrumentation scope. | ||
* @param default_scope_config The default scope config that the built configurator should fall | ||
* back on. | ||
*/ | ||
explicit Builder(T default_scope_config) noexcept : default_scope_config_(default_scope_config) | ||
{} | ||
|
||
/** | ||
* Allows the user to pass a generic function that evaluates an instrumentation scope through a | ||
* boolean check. If the check passes, the provided config is applied. Conditions are evaluated | ||
* in order. | ||
* @param scope_matcher a function that returns true if the scope being evaluated matches the | ||
* criteria defined by the function. | ||
* @param scope_config the scope configuration to return for the matched scope. | ||
* @return this | ||
*/ | ||
Builder AddCondition(std::function<bool(const InstrumentationScope &)> scope_matcher, | ||
T scope_config) | ||
{ | ||
conditions_.push_back(Condition{scope_matcher, scope_config}); | ||
return *this; | ||
} | ||
|
||
/** | ||
* A convenience condition that specifically matches the scope name of the scope being | ||
* evaluated. If the scope name matches to the provided string, then the provided scope | ||
* configuration is applied to the scope. | ||
* @param scope_name The scope name to which the config needs to be applied. | ||
* @param scope_config The scope config for the matching scopes. | ||
* @return this | ||
*/ | ||
Builder AddConditionNameEquals(nostd::string_view scope_name, T scope_config) | ||
{ | ||
std::function<bool(const InstrumentationScope &)> name_equals_matcher = | ||
[scope_name](const InstrumentationScope &scope_info) { | ||
psx95 marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
return scope_info.GetName() == scope_name; | ||
}; | ||
conditions_.push_back(Condition{name_equals_matcher, scope_config}); | ||
return *this; | ||
psx95 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
} | ||
|
||
/** | ||
* Constructs the scope configurator object that can be used to retrieve scope config depending | ||
* on the instrumentation scope. | ||
* @return a configured scope configurator. | ||
*/ | ||
ScopeConfigurator<T> Build() | ||
{ | ||
if (conditions_.size() == 0) | ||
{ | ||
return ScopeConfigurator<T>( | ||
[default_scope_config_ = this->default_scope_config_](const InstrumentationScope &) { | ||
return default_scope_config_; | ||
}); | ||
} | ||
|
||
// Return a configurator that processes all the conditions | ||
return ScopeConfigurator<T>( | ||
[conditions_ = this->conditions_, default_scope_config_ = this->default_scope_config_]( | ||
const InstrumentationScope &scope_info) { | ||
for (Condition condition : conditions_) | ||
{ | ||
if (condition.scope_matcher(scope_info)) | ||
{ | ||
return condition.scope_config; | ||
} | ||
} | ||
return default_scope_config_; | ||
}); | ||
} | ||
|
||
private: | ||
/** | ||
* An internal struct to encapsulate 'conditions' that can be applied to a | ||
* ScopeConfiguratorBuilder. The applied conditions influence the behavior of the generatred | ||
* ScopeConfigurator. | ||
*/ | ||
struct Condition | ||
{ | ||
std::function<bool(const InstrumentationScope &)> scope_matcher; | ||
T scope_config; | ||
}; | ||
|
||
T default_scope_config_; | ||
std::vector<Condition> conditions_; | ||
}; | ||
|
||
// Public methods for ScopeConfigurator | ||
|
||
/** | ||
* Invokes the underlying configurator function to get a valid scope configuration. | ||
* @param scope_info The InstrumentationScope containing scope information for which configuration | ||
* needs to be retrieved. | ||
*/ | ||
T ComputeConfig(const InstrumentationScope &scope_info) const | ||
{ | ||
return this->configurator_(scope_info); | ||
} | ||
|
||
private: | ||
// Prevent direct initialization of ScopeConfigurator objects. | ||
explicit ScopeConfigurator(std::function<T(const InstrumentationScope &)> configurator) | ||
: configurator_(configurator) | ||
{} | ||
|
||
std::function<T(const InstrumentationScope &)> configurator_; | ||
}; | ||
} // namespace instrumentationscope | ||
} // namespace sdk | ||
OPENTELEMETRY_END_NAMESPACE |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
// Copyright The OpenTelemetry Authors | ||
// SPDX-License-Identifier: Apache-2.0 | ||
|
||
#pragma once | ||
|
||
#include "opentelemetry/version.h" | ||
|
||
OPENTELEMETRY_BEGIN_NAMESPACE | ||
namespace sdk | ||
{ | ||
namespace trace | ||
{ | ||
/** | ||
* TracerConfig defines various configurable aspects of a Tracer's behavior. | ||
* This class should not be used directly to configure a Tracer's behavior, instead a | ||
* ScopeConfigurator should be used to compute the desired TracerConfig which can then be used to | ||
* configure a Tracer. | ||
*/ | ||
class TracerConfig | ||
{ | ||
public: | ||
bool operator==(const TracerConfig &other) const noexcept; | ||
|
||
/** | ||
* Returns if the Tracer is enabled or disabled. Tracers are enabled by default. | ||
* @return a boolean indicating if the Tracer is enabled. Defaults to true. | ||
*/ | ||
bool IsEnabled() const noexcept; | ||
|
||
/** | ||
* Returns a TracerConfig that represents a disabled Tracer. A disabled tracer behaves like a | ||
* no-op tracer. | ||
* @return a static constant TracerConfig that represents a disabled tracer. | ||
*/ | ||
static TracerConfig Disabled(); | ||
|
||
/** | ||
* Returns a TracerConfig that represents an enabled Tracer. | ||
* @return a static constant TracerConfig that represents an enabled tracer. | ||
*/ | ||
static TracerConfig Enabled(); | ||
|
||
/** | ||
* Returns a TracerConfig that represents a Tracer configured with the default behavior. | ||
* The default behavior is guided by the OpenTelemetry specification. | ||
* @return a static constant TracerConfig that represents a tracer configured with default | ||
* behavior. | ||
*/ | ||
static TracerConfig Default(); | ||
|
||
private: | ||
explicit TracerConfig(const bool disabled = false) : disabled_(disabled) {} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Do not use default values The choice of the default value should not be nested deep in the code, but bubble up in the call stack, up to where the decision is made to use a default. This will be in the tracer provider factory, when no scope configurator is provided. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is a private constructor, so it cannot be called externally and the value of the default is dictated by the spec. |
||
bool disabled_; | ||
static const TracerConfig kDefaultConfig; | ||
static const TracerConfig kDisabledConfig; | ||
}; | ||
} // namespace trace | ||
} // namespace sdk | ||
OPENTELEMETRY_END_NAMESPACE |
Uh oh!
There was an error while loading. Please reload this page.