Skip to content

Commit 382e80f

Browse files
committed
Answer to comments
1 parent 8e33b54 commit 382e80f

4 files changed

Lines changed: 88 additions & 66 deletions

File tree

bin/format

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ docker_clang_format() {
6464
process_arg "$arg"
6565
done | xargs -0 \
6666
docker run \
67-
--platform linux/amd64 \
6867
--interactive \
6968
--rm \
7069
--volume /etc/passwd:/etc/passwd:ro \

include/datadog/config.h

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -62,21 +62,43 @@ struct ConfigMetadata {
6262
: name(n), value(std::move(v)), origin(orig), error(std::move(err)) {}
6363
};
6464

65-
// Return the chosen configuration value, in order of precedence: `from_env`,
66-
// `from_user`, and `fallback`.
67-
// This overload directly populates both telemetry_configs[config_name] and
68-
// metadata[config_name] using the stringified value, with all values found,
69-
// from lowest to highest precedence. Returns the chosen value directly.
65+
// Returns the final configuration value using the following
66+
// precedence order: environment > user code > default, and populates two maps:
67+
// 1. `telemetry_configs`: Records ALL configuration sources that were provided,
68+
// ordered from lowest to highest precedence.
69+
// 2. `metadata`: Records ONLY the winning configuration value (highest
70+
// precedence). Template Parameters:
71+
// Value: The type of the configuration value
72+
// Stringifier: Optional function type to convert Value to string
73+
// (defaults to std::nullptr_t, which uses string construction)
74+
// DefaultValue: Type of the fallback value (defaults to std::nullptr_t)
7075
//
71-
// The fallback parameter is optional and defaults to nullptr.
76+
// Parameters:
77+
// from_env: Optional value from environment variables (highest precedence)
78+
// from_user: Optional value from user code (middle precedence)
79+
// telemetry_configs: Output map that will be populated with all config
80+
// sources found for this config_name, in precedence order
81+
// metadata: Output map that will be populated with the winning config value
82+
// for this config_name
83+
// config_name: The configuration parameter name identifier
84+
// fallback: Optional default value (lowest precedence). Pass nullptr to
85+
// indicate no default.
86+
// to_string_fn: Optional custom function to convert Value to string.
87+
// Required for non-string types. For string-like types, uses
88+
// default string construction if not provided.
89+
//
90+
// Returns:
91+
// The chosen configuration value based on precedence, or Value{} if no value
92+
// was provided.
7293
template <typename Value, typename Stringifier = std::nullptr_t,
7394
typename DefaultValue = std::nullptr_t>
74-
Value pick(const Optional<Value>& from_env, const Optional<Value>& from_user,
75-
std::unordered_map<ConfigName, std::vector<ConfigMetadata>>*
76-
telemetry_configs,
77-
std::unordered_map<ConfigName, ConfigMetadata>* metadata,
78-
ConfigName config_name, DefaultValue fallback = nullptr,
79-
Stringifier to_string_fn = nullptr) {
95+
Value resolve_and_record_config(
96+
const Optional<Value>& from_env, const Optional<Value>& from_user,
97+
std::unordered_map<ConfigName, std::vector<ConfigMetadata>>*
98+
telemetry_configs,
99+
std::unordered_map<ConfigName, ConfigMetadata>* metadata,
100+
ConfigName config_name, DefaultValue fallback = nullptr,
101+
Stringifier to_string_fn = nullptr) {
80102
auto stringify = [&](const Value& v) -> std::string {
81103
if constexpr (!std::is_same_v<Stringifier, std::nullptr_t>) {
82104
return to_string_fn(v); // use provided function

src/datadog/trace_sampler_config.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ Expected<FinalizedTraceSamplerConfig> finalize_config(
227227

228228
std::unordered_map<ConfigName, std::vector<ConfigMetadata>>
229229
telemetry_configs_tmp;
230-
double max_per_second = pick(
230+
double max_per_second = resolve_and_record_config(
231231
env_config->max_per_second, config.max_per_second, &telemetry_configs_tmp,
232232
&result.metadata, ConfigName::TRACE_SAMPLING_LIMIT, 100.0,
233233
[](const double &d) { return std::to_string(d); });

src/datadog/tracer_config.cpp

Lines changed: 53 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ Expected<FinalizedTracerConfig> finalize_config(const TracerConfig &user_config,
288288
all_sources_configs;
289289

290290
// DD_SERVICE
291-
final_config.defaults.service = pick(
291+
final_config.defaults.service = resolve_and_record_config(
292292
env_config->service, user_config.service, &all_sources_configs,
293293
&final_config.metadata, ConfigName::SERVICE_NAME, get_process_name());
294294

@@ -297,65 +297,65 @@ Expected<FinalizedTracerConfig> finalize_config(const TracerConfig &user_config,
297297
value_or(env_config->service_type, user_config.service_type, "web");
298298

299299
// DD_ENV
300-
final_config.defaults.environment = pick(
300+
final_config.defaults.environment = resolve_and_record_config(
301301
env_config->environment, user_config.environment, &all_sources_configs,
302302
&final_config.metadata, ConfigName::SERVICE_ENV);
303303

304304
// DD_VERSION
305-
final_config.defaults.version =
306-
pick(env_config->version, user_config.version, &all_sources_configs,
307-
&final_config.metadata, ConfigName::SERVICE_VERSION);
305+
final_config.defaults.version = resolve_and_record_config(
306+
env_config->version, user_config.version, &all_sources_configs,
307+
&final_config.metadata, ConfigName::SERVICE_VERSION);
308308

309309
// Span name
310310
final_config.defaults.name = value_or(env_config->name, user_config.name, "");
311311

312312
// DD_TAGS
313-
final_config.defaults.tags =
314-
pick(env_config->tags, user_config.tags, &all_sources_configs,
315-
&final_config.metadata, ConfigName::TAGS,
316-
std::unordered_map<std::string, std::string>{},
317-
[](const auto &tags) { return join_tags(tags); });
313+
final_config.defaults.tags = resolve_and_record_config(
314+
env_config->tags, user_config.tags, &all_sources_configs,
315+
&final_config.metadata, ConfigName::TAGS,
316+
std::unordered_map<std::string, std::string>{},
317+
[](const auto &tags) { return join_tags(tags); });
318318

319319
// Extraction Styles
320320
const std::vector<PropagationStyle> default_propagation_styles{
321321
PropagationStyle::DATADOG, PropagationStyle::W3C,
322322
PropagationStyle::BAGGAGE};
323323

324-
final_config.extraction_styles =
325-
pick(env_config->extraction_styles, user_config.extraction_styles,
326-
&all_sources_configs, &final_config.metadata,
327-
ConfigName::EXTRACTION_STYLES, default_propagation_styles,
328-
[](const std::vector<PropagationStyle> &styles) {
329-
return join_propagation_styles(styles);
330-
});
324+
final_config.extraction_styles = resolve_and_record_config(
325+
env_config->extraction_styles, user_config.extraction_styles,
326+
&all_sources_configs, &final_config.metadata,
327+
ConfigName::EXTRACTION_STYLES, default_propagation_styles,
328+
[](const std::vector<PropagationStyle> &styles) {
329+
return join_propagation_styles(styles);
330+
});
331331

332332
if (final_config.extraction_styles.empty()) {
333333
return Error{Error::MISSING_SPAN_EXTRACTION_STYLE,
334334
"At least one extraction style must be specified."};
335335
}
336336

337337
// Injection Styles
338-
final_config.injection_styles =
339-
pick(env_config->injection_styles, user_config.injection_styles,
340-
&all_sources_configs, &final_config.metadata,
341-
ConfigName::INJECTION_STYLES, default_propagation_styles,
342-
[](const std::vector<PropagationStyle> &styles) {
343-
return join_propagation_styles(styles);
344-
});
338+
final_config.injection_styles = resolve_and_record_config(
339+
env_config->injection_styles, user_config.injection_styles,
340+
&all_sources_configs, &final_config.metadata,
341+
ConfigName::INJECTION_STYLES, default_propagation_styles,
342+
[](const std::vector<PropagationStyle> &styles) {
343+
return join_propagation_styles(styles);
344+
});
345345

346346
if (final_config.injection_styles.empty()) {
347347
return Error{Error::MISSING_SPAN_INJECTION_STYLE,
348348
"At least one injection style must be specified."};
349349
}
350350

351351
// Startup Logs
352-
final_config.log_on_startup = pick(
352+
final_config.log_on_startup = resolve_and_record_config(
353353
env_config->log_on_startup, user_config.log_on_startup,
354354
&all_sources_configs, &final_config.metadata, ConfigName::STARTUP_LOGS,
355355
true, [](const bool &b) { return to_string(b); });
356356

357357
// Report traces
358-
final_config.report_traces = pick(
358+
final_config.report_traces = resolve_and_record_config(
359359
env_config->report_traces, user_config.report_traces,
360360
&all_sources_configs, &final_config.metadata, ConfigName::REPORT_TRACES,
361361
true, [](const bool &b) { return to_string(b); });
@@ -369,11 +369,11 @@ Expected<FinalizedTracerConfig> finalize_config(const TracerConfig &user_config,
369369
env_config->max_tags_header_size, user_config.max_tags_header_size, 512);
370370

371371
// 128b Trace IDs
372-
final_config.generate_128bit_trace_ids =
373-
pick(env_config->generate_128bit_trace_ids,
374-
user_config.generate_128bit_trace_ids, &all_sources_configs,
375-
&final_config.metadata, ConfigName::GENEREATE_128BIT_TRACE_IDS, true,
376-
[](const bool &b) { return to_string(b); });
372+
final_config.generate_128bit_trace_ids = resolve_and_record_config(
373+
env_config->generate_128bit_trace_ids,
374+
user_config.generate_128bit_trace_ids, &all_sources_configs,
375+
&final_config.metadata, ConfigName::GENEREATE_128BIT_TRACE_IDS, true,
376+
[](const bool &b) { return to_string(b); });
377377

378378
// Integration name & version
379379
final_config.integration_name = value_or(
@@ -383,18 +383,18 @@ Expected<FinalizedTracerConfig> finalize_config(const TracerConfig &user_config,
383383
tracer_version);
384384

385385
// Baggage - max items
386-
final_config.baggage_opts.max_items =
387-
pick(env_config->baggage_max_items, user_config.baggage_max_items,
388-
&all_sources_configs, &final_config.metadata,
389-
ConfigName::TRACE_BAGGAGE_MAX_ITEMS, 64UL,
390-
[](const size_t &i) { return std::to_string(i); });
386+
final_config.baggage_opts.max_items = resolve_and_record_config(
387+
env_config->baggage_max_items, user_config.baggage_max_items,
388+
&all_sources_configs, &final_config.metadata,
389+
ConfigName::TRACE_BAGGAGE_MAX_ITEMS, 64UL,
390+
[](const size_t &i) { return std::to_string(i); });
391391

392392
// Baggage - max bytes
393-
final_config.baggage_opts.max_bytes =
394-
pick(env_config->baggage_max_bytes, user_config.baggage_max_bytes,
395-
&all_sources_configs, &final_config.metadata,
396-
ConfigName::TRACE_BAGGAGE_MAX_BYTES, 8192UL,
397-
[](const size_t &i) { return std::to_string(i); });
393+
final_config.baggage_opts.max_bytes = resolve_and_record_config(
394+
env_config->baggage_max_bytes, user_config.baggage_max_bytes,
395+
&all_sources_configs, &final_config.metadata,
396+
ConfigName::TRACE_BAGGAGE_MAX_BYTES, 8192UL,
397+
[](const size_t &i) { return std::to_string(i); });
398398

399399
if (final_config.baggage_opts.max_items <= 0 ||
400400
final_config.baggage_opts.max_bytes < 3) {
@@ -459,27 +459,28 @@ Expected<FinalizedTracerConfig> finalize_config(const TracerConfig &user_config,
459459
}
460460

461461
// APM Tracing Enabled
462-
final_config.tracing_enabled =
463-
pick(env_config->tracing_enabled, user_config.tracing_enabled,
464-
&all_sources_configs, &final_config.metadata,
465-
ConfigName::APM_TRACING_ENABLED, true,
466-
[](const bool &b) { return to_string(b); });
462+
final_config.tracing_enabled = resolve_and_record_config(
463+
env_config->tracing_enabled, user_config.tracing_enabled,
464+
&all_sources_configs, &final_config.metadata,
465+
ConfigName::APM_TRACING_ENABLED, true,
466+
[](const bool &b) { return to_string(b); });
467467

468468
{
469469
// Resource Renaming Enabled
470-
const bool resource_renaming_enabled = pick(
470+
const bool resource_renaming_enabled = resolve_and_record_config(
471471
env_config->resource_renaming_enabled,
472472
user_config.resource_renaming_enabled, &all_sources_configs,
473473
&final_config.metadata, ConfigName::TRACE_RESOURCE_RENAMING_ENABLED,
474474
false, [](const bool &b) { return to_string(b); });
475475

476476
// Resource Renaming Always Simplified Endpoint
477477
const bool resource_renaming_always_simplified_endpoint =
478-
pick(env_config->resource_renaming_always_simplified_endpoint,
479-
user_config.resource_renaming_always_simplified_endpoint,
480-
&all_sources_configs, &final_config.metadata,
481-
ConfigName::TRACE_RESOURCE_RENAMING_ALWAYS_SIMPLIFIED_ENDPOINT,
482-
false, [](const bool &b) { return to_string(b); });
478+
resolve_and_record_config(
479+
env_config->resource_renaming_always_simplified_endpoint,
480+
user_config.resource_renaming_always_simplified_endpoint,
481+
&all_sources_configs, &final_config.metadata,
482+
ConfigName::TRACE_RESOURCE_RENAMING_ALWAYS_SIMPLIFIED_ENDPOINT,
483+
false, [](const bool &b) { return to_string(b); });
483484

484485
if (!resource_renaming_enabled) {
485486
final_config.resource_renaming_mode =

0 commit comments

Comments
 (0)