|
1 | 1 | #include "config_manager.h" |
2 | 2 |
|
| 3 | +#include "parse_util.h" |
| 4 | +#include "string_util.h" |
3 | 5 | #include "trace_sampler.h" |
4 | 6 |
|
5 | 7 | namespace datadog { |
6 | 8 | namespace tracing { |
7 | 9 |
|
8 | 10 | ConfigManager::ConfigManager(const FinalizedTracerConfig& config) |
9 | 11 | : clock_(config.clock), |
10 | | - default_trace_sampler_( |
| 12 | + default_metadata_(config.metadata), |
| 13 | + trace_sampler_( |
11 | 14 | std::make_shared<TraceSampler>(config.trace_sampler, clock_)), |
12 | | - current_trace_sampler_(default_trace_sampler_), |
13 | | - default_span_defaults_(std::make_shared<SpanDefaults>(config.defaults)), |
14 | | - current_span_defaults_(default_span_defaults_), |
15 | | - default_report_traces_(config.report_traces), |
16 | | - current_report_traces_(default_report_traces_) {} |
| 15 | + span_defaults_(std::make_shared<SpanDefaults>(config.defaults)), |
| 16 | + report_traces_(config.report_traces) {} |
17 | 17 |
|
18 | 18 | std::shared_ptr<TraceSampler> ConfigManager::trace_sampler() { |
19 | 19 | std::lock_guard<std::mutex> lock(mutex_); |
20 | | - return current_trace_sampler_; |
| 20 | + return trace_sampler_.value(); |
21 | 21 | } |
22 | 22 |
|
23 | 23 | std::shared_ptr<const SpanDefaults> ConfigManager::span_defaults() { |
24 | 24 | std::lock_guard<std::mutex> lock(mutex_); |
25 | | - return current_span_defaults_; |
| 25 | + return span_defaults_.value(); |
26 | 26 | } |
27 | 27 |
|
28 | 28 | bool ConfigManager::report_traces() { |
29 | 29 | std::lock_guard<std::mutex> lock(mutex_); |
30 | | - return current_report_traces_; |
| 30 | + return report_traces_.value(); |
31 | 31 | } |
32 | 32 |
|
33 | | -void ConfigManager::update(const ConfigUpdate& conf) { |
| 33 | +std::vector<ConfigMetadata> ConfigManager::update(const ConfigUpdate& conf) { |
| 34 | + std::vector<ConfigMetadata> metadata; |
| 35 | + |
34 | 36 | std::lock_guard<std::mutex> lock(mutex_); |
35 | 37 |
|
36 | | - if (conf.trace_sampler) { |
37 | | - if (auto finalized_trace_sampler_cfg = |
38 | | - finalize_config(*conf.trace_sampler)) { |
39 | | - current_trace_sampler_ = |
40 | | - std::make_shared<TraceSampler>(*finalized_trace_sampler_cfg, clock_); |
41 | | - } else { |
42 | | - // TODO: report error |
43 | | - } |
| 38 | + if (!conf.trace_sampling_rate) { |
| 39 | + reset_config(ConfigName::TRACE_SAMPLING_RATE, trace_sampler_, metadata); |
44 | 40 | } else { |
45 | | - current_trace_sampler_ = default_trace_sampler_; |
46 | | - } |
| 41 | + ConfigMetadata trace_sampling_metadata( |
| 42 | + ConfigName::TRACE_SAMPLING_RATE, |
| 43 | + to_string(*conf.trace_sampling_rate, 1), |
| 44 | + ConfigMetadata::Origin::REMOTE_CONFIG); |
47 | 45 |
|
48 | | - if (conf.tags) { |
49 | | - auto new_span_defaults = |
50 | | - std::make_shared<SpanDefaults>(*current_span_defaults_); |
51 | | - new_span_defaults->tags = std::move(*conf.tags); |
| 46 | + TraceSamplerConfig trace_sampler_cfg; |
| 47 | + trace_sampler_cfg.sample_rate = *conf.trace_sampling_rate; |
| 48 | + |
| 49 | + auto finalized_trace_sampler_cfg = finalize_config(trace_sampler_cfg); |
| 50 | + if (auto error = finalized_trace_sampler_cfg.if_error()) { |
| 51 | + trace_sampling_metadata.error = *error; |
| 52 | + } |
52 | 53 |
|
53 | | - current_span_defaults_ = new_span_defaults; |
| 54 | + auto trace_sampler = |
| 55 | + std::make_shared<TraceSampler>(*finalized_trace_sampler_cfg, clock_); |
| 56 | + |
| 57 | + // This reset rate limiting and `TraceSampler` has no `operator==`. |
| 58 | + // TODO: Instead of creating another `TraceSampler`, we should |
| 59 | + // update the default sampling rate. |
| 60 | + trace_sampler_ = std::move(trace_sampler); |
| 61 | + metadata.emplace_back(std::move(trace_sampling_metadata)); |
| 62 | + } |
| 63 | + |
| 64 | + if (!conf.tags) { |
| 65 | + reset_config(ConfigName::TAGS, span_defaults_, metadata); |
54 | 66 | } else { |
55 | | - current_span_defaults_ = default_span_defaults_; |
| 67 | + ConfigMetadata tags_metadata(ConfigName::TAGS, join(*conf.tags, ","), |
| 68 | + ConfigMetadata::Origin::REMOTE_CONFIG); |
| 69 | + |
| 70 | + auto parsed_tags = parse_tags(*conf.tags); |
| 71 | + if (auto error = parsed_tags.if_error()) { |
| 72 | + tags_metadata.error = *error; |
| 73 | + } |
| 74 | + |
| 75 | + if (*parsed_tags != span_defaults_.value()->tags) { |
| 76 | + auto new_span_defaults = |
| 77 | + std::make_shared<SpanDefaults>(*span_defaults_.value()); |
| 78 | + new_span_defaults->tags = std::move(*parsed_tags); |
| 79 | + |
| 80 | + span_defaults_ = new_span_defaults; |
| 81 | + metadata.emplace_back(std::move(tags_metadata)); |
| 82 | + } |
56 | 83 | } |
57 | 84 |
|
58 | | - if (conf.report_traces) { |
59 | | - current_report_traces_ = *conf.report_traces; |
| 85 | + if (!conf.report_traces) { |
| 86 | + reset_config(ConfigName::REPORT_TRACES, report_traces_, metadata); |
60 | 87 | } else { |
61 | | - current_report_traces_ = default_report_traces_; |
| 88 | + if (conf.report_traces != report_traces_.value()) { |
| 89 | + report_traces_ = *conf.report_traces; |
| 90 | + metadata.emplace_back(ConfigName::REPORT_TRACES, |
| 91 | + to_string(*conf.report_traces), |
| 92 | + ConfigMetadata::Origin::REMOTE_CONFIG); |
| 93 | + } |
62 | 94 | } |
| 95 | + |
| 96 | + return metadata; |
63 | 97 | } |
64 | 98 |
|
65 | | -void ConfigManager::reset() { |
66 | | - std::lock_guard<std::mutex> lock(mutex_); |
67 | | - current_trace_sampler_ = default_trace_sampler_; |
68 | | - current_span_defaults_ = default_span_defaults_; |
69 | | - current_report_traces_ = default_report_traces_; |
| 99 | +template <typename T> |
| 100 | +void ConfigManager::reset_config(ConfigName name, T& conf, |
| 101 | + std::vector<ConfigMetadata>& metadata) { |
| 102 | + if (conf.is_original_value()) return; |
| 103 | + |
| 104 | + conf.reset(); |
| 105 | + metadata.emplace_back(default_metadata_[name]); |
70 | 106 | } |
71 | 107 |
|
| 108 | +std::vector<ConfigMetadata> ConfigManager::reset() { return update({}); } |
| 109 | + |
72 | 110 | nlohmann::json ConfigManager::config_json() const { |
73 | 111 | std::lock_guard<std::mutex> lock(mutex_); |
74 | 112 | return nlohmann::json{ |
75 | | - {"defaults", to_json(*current_span_defaults_)}, |
76 | | - {"trace_sampler", current_trace_sampler_->config_json()}, |
77 | | - {"report_traces", current_report_traces_}}; |
| 113 | + {"defaults", to_json(*span_defaults_.value())}, |
| 114 | + {"trace_sampler", trace_sampler_.value()->config_json()}, |
| 115 | + {"report_traces", report_traces_.value()}}; |
78 | 116 | } |
79 | 117 |
|
80 | 118 | } // namespace tracing |
|
0 commit comments