Skip to content

Commit d4321b2

Browse files
committed
Add TraceIdRatioBasedSampler, config, & tests
1 parent 7dad3bb commit d4321b2

File tree

7 files changed

+579
-63
lines changed

7 files changed

+579
-63
lines changed

newrelic/api/transaction.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1067,6 +1067,13 @@ def _compute_sampled_and_priority(
10671067
elif config == "always_off":
10681068
sampled = False
10691069
priority = 0
1070+
elif config == "trace_id_ratio_based":
1071+
_logger.debug(
1072+
"Let trace id ratio based sampler algorithm decide based on trace_id = %s.", self._trace_id
1073+
)
1074+
priority, sampled = self.sampling_algo_compute_sampled_and_priority(
1075+
priority, sampled, {"full_granularity": full_granularity, "section": section, "trace_id": int(self._trace_id.lower().zfill(32), 16)},
1076+
)
10701077
else:
10711078
if config not in ("default", "adaptive"):
10721079
_logger.warning("%s=%s is not a recognized value. Using 'default' instead.", setting_path, config)

newrelic/config.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,15 @@ def _map_aws_account_id(s):
9595
# modules to look up customised settings defined in the loaded
9696
# configuration file.
9797

98-
_config_object = configparser.RawConfigParser()
98+
def ratio(value):
99+
try:
100+
val = float(value)
101+
if 0 < val <= 1:
102+
return val
103+
except ValueError:
104+
pass
105+
106+
_config_object = configparser.RawConfigParser(converters={"ratio": ratio})
99107

100108
# Cache of the parsed global settings found in the configuration
101109
# file. We cache these so can dump them out to the log file once
@@ -378,6 +386,8 @@ def _process_dt_hidden_setting(section, option, getter):
378386
target = _settings
379387
fields = option.split(".", 1)
380388

389+
if value == "trace_id_ratio_based":
390+
raise configparser.NoOptionError("trace_id_ratio_sampler option can only be set by configuring the ratio")
381391
while True:
382392
if len(fields) == 1:
383393
value = value or "default"
@@ -538,6 +548,9 @@ def _process_configuration(section):
538548
_process_dt_sampler_setting(
539549
section, "distributed_tracing.sampler.full_granularity.root.adaptive.sampling_target", "getint"
540550
)
551+
_process_dt_sampler_setting(
552+
section, "distributed_tracing.sampler.full_granularity.root.trace_id_ratio_based.ratio", "getratio"
553+
)
541554
_process_dt_setting(
542555
section,
543556
"distributed_tracing.sampler.full_granularity.remote_parent_sampled",
@@ -547,6 +560,9 @@ def _process_configuration(section):
547560
_process_dt_sampler_setting(
548561
section, "distributed_tracing.sampler.full_granularity.remote_parent_sampled.adaptive.sampling_target", "getint"
549562
)
563+
_process_dt_sampler_setting(
564+
section, "distributed_tracing.sampler.full_granularity.remote_parent_sampled.trace_id_ratio_based.ratio", "getratio"
565+
)
550566
_process_dt_setting(
551567
section,
552568
"distributed_tracing.sampler.full_granularity.remote_parent_not_sampled",
@@ -558,19 +574,32 @@ def _process_configuration(section):
558574
"distributed_tracing.sampler.full_granularity.remote_parent_not_sampled.adaptive.sampling_target",
559575
"getint",
560576
)
577+
_process_dt_sampler_setting(
578+
section,
579+
"distributed_tracing.sampler.full_granularity.remote_parent_not_sampled.trace_id_ratio_based.ratio",
580+
"getratio",
581+
)
561582
_process_setting(section, "distributed_tracing.sampler.full_granularity.enabled", "getboolean", None)
562583
_process_setting(section, "distributed_tracing.sampler.partial_granularity.enabled", "getboolean", None)
563584
_process_setting(section, "distributed_tracing.sampler.partial_granularity.type", "get", None)
564585
_process_dt_hidden_setting(section, "distributed_tracing.sampler.partial_granularity.root", "get")
565586
_process_dt_sampler_setting(
566587
section, "distributed_tracing.sampler.partial_granularity.root.adaptive.sampling_target", "getint"
567588
)
589+
_process_dt_sampler_setting(
590+
section, "distributed_tracing.sampler.partial_granularity.root.trace_id_ratio_based.ratio", "getratio"
591+
)
568592
_process_dt_hidden_setting(section, "distributed_tracing.sampler.partial_granularity.remote_parent_sampled", "get")
569593
_process_dt_sampler_setting(
570594
section,
571595
"distributed_tracing.sampler.partial_granularity.remote_parent_sampled.adaptive.sampling_target",
572596
"getint",
573597
)
598+
_process_dt_sampler_setting(
599+
section,
600+
"distributed_tracing.sampler.partial_granularity.remote_parent_sampled.trace_id_ratio_based.ratio",
601+
"getratio",
602+
)
574603
_process_dt_hidden_setting(
575604
section, "distributed_tracing.sampler.partial_granularity.remote_parent_not_sampled", "get"
576605
)
@@ -579,6 +608,11 @@ def _process_configuration(section):
579608
"distributed_tracing.sampler.partial_granularity.remote_parent_not_sampled.adaptive.sampling_target",
580609
"getint",
581610
)
611+
_process_dt_sampler_setting(
612+
section,
613+
"distributed_tracing.sampler.partial_granularity.remote_parent_not_sampled.trace_id_ratio_based.ratio",
614+
"getratio",
615+
)
582616
_process_setting(section, "span_events.enabled", "getboolean", None)
583617
_process_setting(section, "span_events.max_samples_stored", "getint", None)
584618
_process_setting(section, "span_events.attributes.enabled", "getboolean", None)

0 commit comments

Comments
 (0)