Skip to content

Commit 338d022

Browse files
committed
fix(tracing): record remote sample rate provenance
1 parent aadbaa0 commit 338d022

4 files changed

Lines changed: 26 additions & 11 deletions

File tree

ddtrace/_trace/product.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
from envier import En
55

6+
from ddtrace.internal.constants import REMOTE_RATE_PROVENANCE
67
from ddtrace.internal.logger import get_logger
78
from ddtrace.internal.native import RemoteConfigCapabilities
89
from ddtrace.internal.settings import env
@@ -138,7 +139,7 @@ def _convert_rc_trace_sampling_rules(lib_config) -> t.Optional[str]:
138139
rule["tags"] = {tag["key"]: tag["value_glob"] for tag in rule["tags"]}
139140

140141
if global_sample_rate is not None:
141-
rc_rules.append({"sample_rate": global_sample_rate})
142+
rc_rules.append({"sample_rate": global_sample_rate, "provenance": REMOTE_RATE_PROVENANCE})
142143

143144
if rc_rules:
144145
return json.dumps(rc_rules)

ddtrace/_trace/sampler.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
from ..constants import ENV_KEY
1616
from ..internal.constants import MAX_UINT_64BITS
17+
from ..internal.constants import REMOTE_RATE_PROVENANCE
1718
from ..internal.constants import SAMPLING_HASH_MODULO
1819
from ..internal.constants import SAMPLING_KNUTH_FACTOR
1920
from ..internal.constants import SamplingMechanism
@@ -24,7 +25,7 @@
2425
from .sampling_rule import SamplingRule
2526

2627

27-
PROVENANCE_ORDER = ["customer", "dynamic", "default"]
28+
PROVENANCE_ORDER = ["customer", "dynamic", REMOTE_RATE_PROVENANCE, "default"]
2829

2930

3031
log = get_logger(__name__)
@@ -211,7 +212,7 @@ def sample(self, span: Span) -> bool:
211212
return sampled
212213

213214
def _get_sampling_mechanism(self, matched_rule: Optional[SamplingRule], agent_service_based: bool) -> int:
214-
if matched_rule and matched_rule.provenance == "customer":
215+
if matched_rule and matched_rule.provenance in ("customer", REMOTE_RATE_PROVENANCE):
215216
return SamplingMechanism.REMOTE_USER_TRACE_SAMPLING_RULE
216217
elif matched_rule and matched_rule.provenance == "dynamic":
217218
return SamplingMechanism.REMOTE_DYNAMIC_TRACE_SAMPLING_RULE

ddtrace/internal/constants.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,8 @@ def __getitem__(self, k: str) -> Any:
158158
LOG_ATTR_VALUE_ZERO = "0"
159159
LOG_ATTR_VALUE_EMPTY = ""
160160

161+
REMOTE_RATE_PROVENANCE = "remote_rate"
162+
161163

162164
class SamplingMechanism(object):
163165
DEFAULT = 0

tests/internal/test_settings.py

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -376,25 +376,36 @@ def test_remoteconfig_global_sample_rate_and_rules(ddtrace_run_python_code_in_su
376376
with tracer.trace("sample_rate") as span:
377377
pass
378378
assert span.get_metric("_dd.rule_psr") == 0.2
379-
assert span.get_tag("_dd.p.dm") == "-3"
379+
assert span.get_tag("_dd.p.dm") == "-11"
380380
# Ensure the previous sampling rule with operation name "rules" is not used
381381
with tracer.trace("rules") as span:
382382
pass
383383
assert span.get_metric("_dd.rule_psr") == 0.2
384-
assert span.get_tag("_dd.p.dm") == "-3"
384+
assert span.get_tag("_dd.p.dm") == "-11"
385385
386-
# Set a new sampling rules via rc
387-
call_apm_tracing_rc(_base_rc_config({"tracing_sampling_rate": 0.3}), config)
386+
# Set a dynamic sampling rule and a default sampling rate via rc
387+
call_apm_tracing_rc(_base_rc_config({
388+
"tracing_sampling_rate": 0.3,
389+
"tracing_sampling_rules": [
390+
{
391+
"service": "*",
392+
"name": "rules",
393+
"resource": "*",
394+
"provenance": "dynamic",
395+
"sample_rate": 0.1,
396+
}
397+
],
398+
}), config)
388399
# Ensure that the new default sampling rate is used
389400
with tracer.trace("sample_rate") as span:
390401
pass
391402
assert span.get_metric("_dd.rule_psr") == 0.3
392-
assert span.get_tag("_dd.p.dm") == "-3"
393-
# Ensure the previous sampling rule with operation name "rules" is not used
403+
assert span.get_tag("_dd.p.dm") == "-11"
404+
# Ensure that the dynamic sampling rule takes precedence over the default rate
394405
with tracer.trace("rules") as span:
395406
pass
396-
assert span.get_metric("_dd.rule_psr") == 0.3
397-
assert span.get_tag("_dd.p.dm") == "-3"
407+
assert span.get_metric("_dd.rule_psr") == 0.1
408+
assert span.get_tag("_dd.p.dm") == "-12"
398409
399410
# Remove all sampling rules from remote config
400411
call_apm_tracing_rc(_base_rc_config({}), config)

0 commit comments

Comments
 (0)