Skip to content

Commit 7934833

Browse files
committed
3
1 parent 0743ebf commit 7934833

File tree

3 files changed

+103
-102
lines changed

3 files changed

+103
-102
lines changed

include/datadog/config.h

Lines changed: 30 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#pragma once
22

33
#include <string>
4-
#include <tuple>
54
#include <type_traits>
65
#include <unordered_map>
76
#include <utility>
@@ -72,13 +71,16 @@ struct ConfigMetadata {
7271
// metadata[config_name] using the stringified value, avoiding duplicate
7372
// string computations. Both telemetry_configs and config_name are required.
7473
// Returns the chosen value directly (no origin needed since it's in metadata).
75-
template <typename Value, typename DefaultValue, typename Stringifier = std::nullptr_t>
74+
//
75+
// The fallback parameter accepts both raw values (e.g., true, 42, "hello")
76+
// and Optional<Value>. It defaults to nullptr (converted to nullopt internally).
77+
template <typename Value, typename Stringifier = std::nullptr_t, typename DefaultValue = std::nullptr_t>
7678
Value pick(
7779
const Optional<Value>& from_env, const Optional<Value>& from_user,
78-
DefaultValue fallback,
7980
std::unordered_map<ConfigName, std::vector<ConfigMetadata>>* telemetry_configs,
8081
std::unordered_map<ConfigName, ConfigMetadata>* metadata,
8182
ConfigName config_name,
83+
DefaultValue fallback = nullptr,
8284
Stringifier to_string_fn = nullptr) {
8385

8486
auto stringify = [&](const Value& v) -> std::string {
@@ -92,17 +94,21 @@ Value pick(
9294
return ""; // unreachable
9395
}
9496
};
95-
97+
9698
std::vector<ConfigMetadata> telemetry_entries;
97-
Value chosen_value = fallback;
99+
Optional<Value> chosen_value;
98100

99101
auto add_entry = [&](ConfigMetadata::Origin origin, const Value& val) {
100102
std::string val_str = stringify(val);
101103
telemetry_entries.emplace_back(ConfigMetadata{config_name, val_str, origin});
102104
chosen_value = val;
103105
};
104106

105-
add_entry(ConfigMetadata::Origin::DEFAULT, fallback);
107+
// Add DEFAULT entry if fallback was provided (known at compile time)
108+
if constexpr (!std::is_same_v<DefaultValue, std::nullptr_t>) {
109+
Value fallback_value = fallback; // Implicit conversion for raw values
110+
add_entry(ConfigMetadata::Origin::DEFAULT, fallback_value);
111+
}
106112

107113
if (from_user) {
108114
add_entry(ConfigMetadata::Origin::CODE, *from_user);
@@ -115,47 +121,31 @@ Value pick(
115121
(*telemetry_configs)[config_name] = std::move(telemetry_entries);
116122
(*metadata)[config_name] = (*telemetry_configs)[config_name].back();
117123

118-
return chosen_value;
119-
}
120-
121-
// Overload without telemetry - for simpler use cases where telemetry
122-
// population is not needed.
123-
template <typename Value, typename DefaultValue, typename Stringifier = std::nullptr_t>
124-
std::vector<std::tuple<ConfigMetadata::Origin, Value, std::string>> pick(
125-
const Optional<Value>& from_env, const Optional<Value>& from_user,
126-
DefaultValue fallback, Stringifier to_string_fn = nullptr) {
127-
128-
auto stringify = [&](const Value& v) -> std::string {
129-
if constexpr (!std::is_same_v<Stringifier, std::nullptr_t>) {
130-
return to_string_fn(v); // use provided function
131-
} else if constexpr (std::is_constructible_v<std::string, Value>) {
132-
return std::string(v); // default behaviour (works for string-like types)
133-
} else {
134-
static_assert(!std::is_same_v<Value, Value>,
135-
"Non-string types require a stringifier function");
136-
return ""; // unreachable
137-
}
138-
};
124+
return chosen_value.value_or(Value{});
125+
}
126+
127+
// Overload without telemetry - returns a pair for backward compatibility
128+
// with std::tie usage pattern (used in telemetry/configuration.cpp).
129+
template <typename Value, typename DefaultValue = Value>
130+
std::pair<ConfigMetadata::Origin, Value> pick(
131+
const Optional<Value>& from_env,
132+
const Optional<Value>& from_user,
133+
DefaultValue fallback = DefaultValue{}) {
139134

140-
std::vector<std::tuple<ConfigMetadata::Origin, Value, std::string>> result;
141-
142-
auto add_entry = [&](ConfigMetadata::Origin origin, const Value& val) {
143-
std::string val_str = stringify(val);
144-
result.emplace_back(origin, val, val_str);
145-
};
146-
147-
add_entry(ConfigMetadata::Origin::DEFAULT, fallback);
135+
ConfigMetadata::Origin chosen_origin = ConfigMetadata::Origin::DEFAULT;
136+
Value chosen_value = Value(fallback);
148137

149138
if (from_user) {
150-
add_entry(ConfigMetadata::Origin::CODE, *from_user);
139+
chosen_origin = ConfigMetadata::Origin::CODE;
140+
chosen_value = *from_user;
151141
}
152142

153143
if (from_env) {
154-
add_entry(ConfigMetadata::Origin::ENVIRONMENT_VARIABLE, *from_env);
144+
chosen_origin = ConfigMetadata::Origin::ENVIRONMENT_VARIABLE;
145+
chosen_value = *from_env;
155146
}
156147

157-
return result;
158-
}
159-
148+
return {chosen_origin, chosen_value};
149+
}
160150
} // namespace tracing
161151
} // namespace datadog

src/datadog/trace_sampler_config.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -225,10 +225,11 @@ Expected<FinalizedTraceSamplerConfig> finalize_config(
225225
result.rules.emplace_back(std::move(finalized_rule));
226226
}
227227

228-
const auto [origin, max_per_second, max_per_second_string] =
229-
pick(env_config->max_per_second, config.max_per_second, 100).back();
230-
result.metadata[ConfigName::TRACE_SAMPLING_LIMIT] = ConfigMetadata(
231-
ConfigName::TRACE_SAMPLING_LIMIT, max_per_second_string, origin);
228+
std::unordered_map<ConfigName, std::vector<ConfigMetadata>> telemetry_configs_tmp;
229+
double max_per_second = pick(env_config->max_per_second, config.max_per_second,
230+
&telemetry_configs_tmp, &result.metadata,
231+
ConfigName::TRACE_SAMPLING_LIMIT, 100.0,
232+
[](const double& d) { return std::to_string(d); });
232233

233234
const auto allowed_types = {FP_NORMAL, FP_SUBNORMAL};
234235
if (!(max_per_second > 0) ||

src/datadog/tracer_config.cpp

Lines changed: 68 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <unordered_map>
99
#include <vector>
1010

11+
#include "datadog/optional.h"
1112
#include "datadog_agent.h"
1213
#include "json.hpp"
1314
#include "null_logger.h"
@@ -286,73 +287,78 @@ Expected<FinalizedTracerConfig> finalize_config(const TracerConfig& user_config,
286287
std::unordered_map<ConfigName, std::vector<ConfigMetadata>> telemetry_configs;
287288

288289
// DD_SERVICE
289-
final_config.defaults.service = pick(env_config->service, user_config.service, get_process_name(),
290-
&telemetry_configs, &final_config.metadata,
291-
ConfigName::SERVICE_NAME);
290+
final_config.defaults.service =
291+
pick(env_config->service, user_config.service,
292+
&telemetry_configs, &final_config.metadata, ConfigName::SERVICE_NAME,
293+
Optional<std::string>(get_process_name()));
292294

293295
// Service type
294296
final_config.defaults.service_type =
295297
value_or(env_config->service_type, user_config.service_type, "web");
296298

297299
// DD_ENV
298-
final_config.defaults.environment = pick(env_config->environment, user_config.environment, "",
299-
&telemetry_configs, &final_config.metadata,
300-
ConfigName::SERVICE_ENV);
300+
final_config.defaults.environment =
301+
pick(env_config->environment, user_config.environment,
302+
&telemetry_configs, &final_config.metadata, ConfigName::SERVICE_ENV);
301303

302304
// DD_VERSION
303-
final_config.defaults.version = pick(env_config->version, user_config.version, "",
304-
&telemetry_configs, &final_config.metadata,
305-
ConfigName::SERVICE_VERSION);
305+
final_config.defaults.version =
306+
pick(env_config->version, user_config.version,
307+
&telemetry_configs, &final_config.metadata, ConfigName::SERVICE_VERSION);
306308

307309
// Span name
308310
final_config.defaults.name = value_or(env_config->name, user_config.name, "");
309311

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

317319
// Extraction Styles
318320
const std::vector<PropagationStyle> default_propagation_styles{
319321
PropagationStyle::DATADOG, PropagationStyle::W3C,
320322
PropagationStyle::BAGGAGE};
321323

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

328332
if (final_config.extraction_styles.empty()) {
329333
return Error{Error::MISSING_SPAN_EXTRACTION_STYLE,
330334
"At least one extraction style must be specified."};
331335
}
332336

333337
// Injection Styles
334-
final_config.injection_styles = pick(env_config->injection_styles, user_config.injection_styles,
335-
default_propagation_styles,
336-
&telemetry_configs, &final_config.metadata,
337-
ConfigName::INJECTION_STYLES,
338-
[](const std::vector<PropagationStyle>& styles) { return join_propagation_styles(styles); });
338+
final_config.injection_styles =
339+
pick(env_config->injection_styles, user_config.injection_styles,
340+
&telemetry_configs, &final_config.metadata, ConfigName::INJECTION_STYLES,
341+
default_propagation_styles,
342+
[](const std::vector<PropagationStyle>& styles) {
343+
return join_propagation_styles(styles);
344+
});
339345

340346
if (final_config.injection_styles.empty()) {
341347
return Error{Error::MISSING_SPAN_INJECTION_STYLE,
342348
"At least one injection style must be specified."};
343349
}
344350

345351
// Startup Logs
346-
final_config.log_on_startup = pick(env_config->log_on_startup, user_config.log_on_startup, true,
347-
&telemetry_configs, &final_config.metadata,
348-
ConfigName::STARTUP_LOGS,
349-
[](const bool& b) { return to_string(b); });
352+
final_config.log_on_startup =
353+
pick(env_config->log_on_startup, user_config.log_on_startup,
354+
&telemetry_configs, &final_config.metadata, ConfigName::STARTUP_LOGS,
355+
true, [](const bool& b) { return to_string(b); });
350356

351357
// Report traces
352-
final_config.report_traces = pick(env_config->report_traces, user_config.report_traces, true,
353-
&telemetry_configs, &final_config.metadata,
354-
ConfigName::REPORT_TRACES,
355-
[](const bool& b) { return to_string(b); });
358+
final_config.report_traces = pick(
359+
env_config->report_traces, user_config.report_traces,
360+
&telemetry_configs, &final_config.metadata, ConfigName::REPORT_TRACES,
361+
true, [](const bool& b) { return to_string(b); });
356362

357363
// Report hostname
358364
final_config.report_hostname =
@@ -363,11 +369,11 @@ Expected<FinalizedTracerConfig> finalize_config(const TracerConfig& user_config,
363369
env_config->max_tags_header_size, user_config.max_tags_header_size, 512);
364370

365371
// 128b Trace IDs
366-
final_config.generate_128bit_trace_ids = pick(env_config->generate_128bit_trace_ids,
367-
user_config.generate_128bit_trace_ids, true,
368-
&telemetry_configs, &final_config.metadata,
369-
ConfigName::GENEREATE_128BIT_TRACE_IDS,
370-
[](const bool& b) { return to_string(b); });
372+
final_config.generate_128bit_trace_ids =
373+
pick(env_config->generate_128bit_trace_ids,
374+
user_config.generate_128bit_trace_ids,
375+
&telemetry_configs, &final_config.metadata, ConfigName::GENEREATE_128BIT_TRACE_IDS,
376+
true, [](const bool& b) { return to_string(b); });
371377

372378
// Integration name & version
373379
final_config.integration_name = value_or(
@@ -377,16 +383,18 @@ Expected<FinalizedTracerConfig> finalize_config(const TracerConfig& user_config,
377383
tracer_version);
378384

379385
// Baggage - max items
380-
final_config.baggage_opts.max_items = pick(env_config->baggage_max_items, user_config.baggage_max_items, 64,
381-
&telemetry_configs, &final_config.metadata,
382-
ConfigName::TRACE_BAGGAGE_MAX_ITEMS,
383-
[](const int& i) { return std::to_string(i); });
386+
final_config.baggage_opts.max_items =
387+
pick(env_config->baggage_max_items, user_config.baggage_max_items,
388+
&telemetry_configs, &final_config.metadata,
389+
ConfigName::TRACE_BAGGAGE_MAX_ITEMS,
390+
64, [](const int& i) { return std::to_string(i); });
384391

385392
// Baggage - max bytes
386-
final_config.baggage_opts.max_bytes = pick(env_config->baggage_max_bytes, user_config.baggage_max_bytes, 8192,
387-
&telemetry_configs, &final_config.metadata,
388-
ConfigName::TRACE_BAGGAGE_MAX_BYTES,
389-
[](const int& i) { return std::to_string(i); });
393+
final_config.baggage_opts.max_bytes =
394+
pick(env_config->baggage_max_bytes, user_config.baggage_max_bytes,
395+
&telemetry_configs, &final_config.metadata,
396+
ConfigName::TRACE_BAGGAGE_MAX_BYTES,
397+
8192, [](const int& i) { return std::to_string(i); });
390398

391399
if (final_config.baggage_opts.max_items <= 0 ||
392400
final_config.baggage_opts.max_bytes < 3) {
@@ -451,26 +459,28 @@ Expected<FinalizedTracerConfig> finalize_config(const TracerConfig& user_config,
451459
}
452460

453461
// APM Tracing Enabled
454-
final_config.tracing_enabled = pick(env_config->tracing_enabled, user_config.tracing_enabled, true,
455-
&telemetry_configs, &final_config.metadata,
456-
ConfigName::APM_TRACING_ENABLED,
457-
[](const bool& b) { return to_string(b); });
462+
final_config.tracing_enabled =
463+
pick(env_config->tracing_enabled, user_config.tracing_enabled,
464+
&telemetry_configs, &final_config.metadata,
465+
ConfigName::APM_TRACING_ENABLED,
466+
true, [](const bool& b) { return to_string(b); });
458467

459468
{
460469
// Resource Renaming Enabled
461-
const bool resource_renaming_enabled = pick(env_config->resource_renaming_enabled,
462-
user_config.resource_renaming_enabled, false,
463-
&telemetry_configs, &final_config.metadata,
464-
ConfigName::TRACE_RESOURCE_RENAMING_ENABLED,
465-
[](const bool& b) { return to_string(b); });
470+
const bool resource_renaming_enabled = pick(
471+
env_config->resource_renaming_enabled,
472+
user_config.resource_renaming_enabled,
473+
&telemetry_configs, &final_config.metadata,
474+
ConfigName::TRACE_RESOURCE_RENAMING_ENABLED,
475+
false, [](const bool& b) { return to_string(b); });
466476

467477
// Resource Renaming Always Simplified Endpoint
468-
const bool resource_renaming_always_simplified_endpoint =
478+
const bool resource_renaming_always_simplified_endpoint =
469479
pick(env_config->resource_renaming_always_simplified_endpoint,
470-
user_config.resource_renaming_always_simplified_endpoint, false,
471-
&telemetry_configs, &final_config.metadata,
480+
user_config.resource_renaming_always_simplified_endpoint,
481+
&telemetry_configs, &final_config.metadata,
472482
ConfigName::TRACE_RESOURCE_RENAMING_ALWAYS_SIMPLIFIED_ENDPOINT,
473-
[](const bool& b) { return to_string(b); });
483+
false, [](const bool& b) { return to_string(b); });
474484

475485
if (!resource_renaming_enabled) {
476486
final_config.resource_renaming_mode =

0 commit comments

Comments
 (0)