Skip to content

Commit ddd7851

Browse files
committed
Merge branch 'partial-granularity-type-support' of github.com:newrelic/newrelic-python-agent into partial-granularity-type-support
2 parents 63696fc + a58975e commit ddd7851

File tree

14 files changed

+308
-119
lines changed

14 files changed

+308
-119
lines changed

newrelic/api/transaction.py

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ def __init__(self, application, enabled=None, source=None):
285285
self.tracestate = ""
286286
self._priority = None
287287
self._sampled = None
288+
# Remote parent sampled is set from the W3C parent header or the Newrelic header if no W3C parent header is present.
288289
self._remote_parent_sampled = None
289290

290291
self._distributed_trace_state = 0
@@ -1020,18 +1021,36 @@ def sampling_algo_compute_sampled_and_priority(self, priority, sampled):
10201021
priority += 1
10211022
return priority, sampled
10221023

1023-
def _compute_sampled_and_priority(self, priority, sampled, remote_parent_sampled_path, remote_parent_sampled_setting, remote_parent_not_sampled_path, remote_parent_not_sampled_setting):
1024+
def _compute_sampled_and_priority(
1025+
self,
1026+
priority,
1027+
sampled,
1028+
remote_parent_sampled_path,
1029+
remote_parent_sampled_setting,
1030+
remote_parent_not_sampled_path,
1031+
remote_parent_not_sampled_setting,
1032+
):
10241033
if self._remote_parent_sampled is None:
10251034
config = "default" # Use sampling algo.
10261035
_logger.debug("Sampling decision made based on no remote parent sampling decision present.")
10271036
elif self._remote_parent_sampled:
10281037
setting_path = remote_parent_sampled_path
10291038
config = remote_parent_sampled_setting
1030-
_logger.debug("Sampling decision made based on remote_parent_sampled=%s and %s=%s.", self._remote_parent_sampled, setting_path, config)
1039+
_logger.debug(
1040+
"Sampling decision made based on remote_parent_sampled=%s and %s=%s.",
1041+
self._remote_parent_sampled,
1042+
setting_path,
1043+
config,
1044+
)
10311045
else: # self._remote_parent_sampled is False.
10321046
setting_path = remote_parent_not_sampled_path
10331047
config = remote_parent_not_sampled_setting
1034-
_logger.debug("Sampling decision made based on remote_parent_sampled=%s and %s=%s.", self._remote_parent_sampled, setting_path, config)
1048+
_logger.debug(
1049+
"Sampling decision made based on remote_parent_sampled=%s and %s=%s.",
1050+
self._remote_parent_sampled,
1051+
setting_path,
1052+
config,
1053+
)
10351054
if config == "always_on":
10361055
sampled = True
10371056
priority = 2.0
@@ -1042,7 +1061,9 @@ def _compute_sampled_and_priority(self, priority, sampled, remote_parent_sampled
10421061
if config not in ("default", "adaptive"):
10431062
_logger.warning("%s=%s is not a recognized value. Using 'default' instead.", setting_path, config)
10441063

1045-
_logger.debug("Let adaptive sampler algorithm decide based on sampled=%s and priority=%s.", sampled, priority)
1064+
_logger.debug(
1065+
"Let adaptive sampler algorithm decide based on sampled=%s and priority=%s.", sampled, priority
1066+
)
10461067
priority, sampled = self.sampling_algo_compute_sampled_and_priority(priority, sampled)
10471068
return priority, sampled
10481069

@@ -1055,14 +1076,18 @@ def _make_sampling_decision(self):
10551076
sampled = self._sampled
10561077
# Compute sampling decision for full granularity.
10571078
if self.settings.distributed_tracing.sampler.full_granularity.enabled:
1058-
_logger.debug("Full granularity tracing is enabled. Asking if full granularity wants to sample. priority=%s, sampled=%s", priority, sampled)
1079+
_logger.debug(
1080+
"Full granularity tracing is enabled. Asking if full granularity wants to sample. priority=%s, sampled=%s",
1081+
priority,
1082+
sampled,
1083+
)
10591084
computed_priority, computed_sampled = self._compute_sampled_and_priority(
10601085
priority,
10611086
sampled,
1062-
remote_parent_sampled_path = "distributed_tracing.sampler.full_granularity.remote_parent_sampled",
1063-
remote_parent_sampled_setting = self.settings.distributed_tracing.sampler.full_granularity.remote_parent_sampled,
1064-
remote_parent_not_sampled_path = "distributed_tracing.sampler.full_granularity.remote_parent_not_sampled",
1065-
remote_parent_not_sampled_setting = self.settings.distributed_tracing.sampler.full_granularity.remote_parent_not_sampled,
1087+
remote_parent_sampled_path="distributed_tracing.sampler.full_granularity.remote_parent_sampled",
1088+
remote_parent_sampled_setting=self.settings.distributed_tracing.sampler.full_granularity.remote_parent_sampled,
1089+
remote_parent_not_sampled_path="distributed_tracing.sampler.full_granularity.remote_parent_not_sampled",
1090+
remote_parent_not_sampled_setting=self.settings.distributed_tracing.sampler.full_granularity.remote_parent_not_sampled,
10661091
)
10671092
_logger.debug("Full granularity sampling decision was %s with priority=%s.", sampled, priority)
10681093
if computed_sampled or not self.settings.distributed_tracing.sampler.partial_granularity.enabled:
@@ -1077,12 +1102,14 @@ def _make_sampling_decision(self):
10771102
self._priority, self._sampled = self._compute_sampled_and_priority(
10781103
priority,
10791104
sampled,
1080-
remote_parent_sampled_path = "distributed_tracing.sampler.partial_granularity.remote_parent_sampled",
1081-
remote_parent_sampled_setting = self.settings.distributed_tracing.sampler.partial_granularity.remote_parent_sampled,
1082-
remote_parent_not_sampled_path = "distributed_tracing.sampler.partial_granularity.remote_parent_not_sampled",
1083-
remote_parent_not_sampled_setting = self.settings.distributed_tracing.sampler.partial_granularity.remote_parent_not_sampled,
1105+
remote_parent_sampled_path="distributed_tracing.sampler.partial_granularity.remote_parent_sampled",
1106+
remote_parent_sampled_setting=self.settings.distributed_tracing.sampler.partial_granularity.remote_parent_sampled,
1107+
remote_parent_not_sampled_path="distributed_tracing.sampler.partial_granularity.remote_parent_not_sampled",
1108+
remote_parent_not_sampled_setting=self.settings.distributed_tracing.sampler.partial_granularity.remote_parent_not_sampled,
1109+
)
1110+
_logger.debug(
1111+
"Partial granularity sampling decision was %s with priority=%s.", self._sampled, self._priority
10841112
)
1085-
_logger.debug("Partial granularity sampling decision was %s with priority=%s.", self._sampled, self._priority)
10861113
self._sampling_decision_made = True
10871114
if self._sampled:
10881115
self.partial_granularity_sampled = True

newrelic/core/agent_protocol.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,9 @@ def _connect_payload(app_name, linked_applications, environment, settings):
297297
connect_settings["browser_monitoring.loader"] = settings["browser_monitoring.loader"]
298298
connect_settings["browser_monitoring.debug"] = settings["browser_monitoring.debug"]
299299
connect_settings["ai_monitoring.enabled"] = settings["ai_monitoring.enabled"]
300-
connect_settings["distributed_tracing.sampler.adaptive_sampling_target"] = settings["distributed_tracing.sampler.adaptive_sampling_target"]
300+
connect_settings["distributed_tracing.sampler.adaptive_sampling_target"] = settings[
301+
"distributed_tracing.sampler.adaptive_sampling_target"
302+
]
301303

302304
security_settings = {}
303305
security_settings["capture_params"] = settings["capture_params"]

newrelic/core/config.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -856,14 +856,18 @@ def default_otlp_host(host):
856856
_settings.distributed_tracing.sampler.remote_parent_not_sampled = os.environ.get(
857857
"NEW_RELIC_DISTRIBUTED_TRACING_SAMPLER_REMOTE_PARENT_NOT_SAMPLED", "default"
858858
)
859-
_settings.distributed_tracing.sampler.full_granularity.enabled = _environ_as_bool("NEW_RELIC_DISTRIBUTED_TRACING_SAMPLER_FULL_GRANULARITY_ENABLED", default=True)
859+
_settings.distributed_tracing.sampler.full_granularity.enabled = _environ_as_bool(
860+
"NEW_RELIC_DISTRIBUTED_TRACING_SAMPLER_FULL_GRANULARITY_ENABLED", default=True
861+
)
860862
_settings.distributed_tracing.sampler.full_granularity.remote_parent_sampled = os.environ.get(
861863
"NEW_RELIC_DISTRIBUTED_TRACING_SAMPLER_FULL_GRANULARITY_REMOTE_PARENT_SAMPLED", None
862864
)
863865
_settings.distributed_tracing.sampler.full_granularity.remote_parent_not_sampled = os.environ.get(
864866
"NEW_RELIC_DISTRIBUTED_TRACING_SAMPLER_FULL_GRANULARITY_REMOTE_PARENT_NOT_SAMPLED", None
865867
)
866-
_settings.distributed_tracing.sampler.partial_granularity.enabled = _environ_as_bool("NEW_RELIC_DISTRIBUTED_TRACING_SAMPLER_PARTIAL_GRANULARITY_ENABLED", default=False)
868+
_settings.distributed_tracing.sampler.partial_granularity.enabled = _environ_as_bool(
869+
"NEW_RELIC_DISTRIBUTED_TRACING_SAMPLER_PARTIAL_GRANULARITY_ENABLED", default=False
870+
)
867871
_settings.distributed_tracing.sampler.partial_granularity.type = os.environ.get(
868872
"NEW_RELIC_DISTRIBUTED_TRACING_SAMPLER_PARTIAL_GRANULARITY_TYPE", "essential"
869873
)
@@ -1412,16 +1416,21 @@ def simplify_distributed_tracing_sampler_granularity_settings(settings):
14121416
# To simplify logic in the code that uses these settings, store the values that
14131417
# should be used at the `distributed_tracing.sampler.full_granularity` path.
14141418
if not settings.distributed_tracing.sampler.full_granularity.remote_parent_sampled:
1415-
settings.distributed_tracing.sampler.full_granularity.remote_parent_sampled = settings.distributed_tracing.sampler.remote_parent_sampled
1419+
settings.distributed_tracing.sampler.full_granularity.remote_parent_sampled = (
1420+
settings.distributed_tracing.sampler.remote_parent_sampled
1421+
)
14161422
if not settings.distributed_tracing.sampler.full_granularity.remote_parent_not_sampled:
1417-
settings.distributed_tracing.sampler.full_granularity.remote_parent_not_sampled = settings.distributed_tracing.sampler.remote_parent_not_sampled
1423+
settings.distributed_tracing.sampler.full_granularity.remote_parent_not_sampled = (
1424+
settings.distributed_tracing.sampler.remote_parent_not_sampled
1425+
)
14181426
# Partial granularity tracing is not available in infinite tracing mode.
14191427
if settings.infinite_tracing.enabled and settings.distributed_tracing.sampler.partial_granularity.enabled:
14201428
_logger.warning(
14211429
"Improper configuration. Infinite tracing cannot be enabled at the same time as partial granularity tracing. Setting distributed_tracing.sampler.partial_granularity.enabled=False."
14221430
)
14231431
settings.distributed_tracing.sampler.partial_granularity.enabled = False
14241432

1433+
14251434
def _remove_ignored_configs(server_settings):
14261435
if not server_settings.get("agent_config"):
14271436
return server_settings

newrelic/core/database_node.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,15 @@ def trace_node(self, stats, root, connections):
279279
start_time=start_time, end_time=end_time, name=name, params=params, children=children, label=None
280280
)
281281

282-
def span_event(self, settings, base_attrs=None, parent_guid=None, attr_class=dict, partial_granularity_sampled=False, ct_exit_spans=None):
282+
def span_event(
283+
self,
284+
settings,
285+
base_attrs=None,
286+
parent_guid=None,
287+
attr_class=dict,
288+
partial_granularity_sampled=False,
289+
ct_exit_spans=None,
290+
):
283291
sql = self.formatted
284292

285293
if sql:
@@ -288,4 +296,11 @@ def span_event(self, settings, base_attrs=None, parent_guid=None, attr_class=dic
288296

289297
self.agent_attributes["db.statement"] = sql
290298

291-
return super().span_event(settings, base_attrs=base_attrs, parent_guid=parent_guid, attr_class=attr_class, partial_granularity_sampled=partial_granularity_sampled, ct_exit_spans=ct_exit_spans)
299+
return super().span_event(
300+
settings,
301+
base_attrs=base_attrs,
302+
parent_guid=parent_guid,
303+
attr_class=attr_class,
304+
partial_granularity_sampled=partial_granularity_sampled,
305+
ct_exit_spans=ct_exit_spans,
306+
)

newrelic/core/external_node.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,15 @@ def trace_node(self, stats, root, connections):
169169
start_time=start_time, end_time=end_time, name=name, params=params, children=children, label=None
170170
)
171171

172-
def span_event(self, settings, base_attrs=None, parent_guid=None, attr_class=dict, partial_granularity_sampled=False, ct_exit_spans=None):
172+
def span_event(
173+
self,
174+
settings,
175+
base_attrs=None,
176+
parent_guid=None,
177+
attr_class=dict,
178+
partial_granularity_sampled=False,
179+
ct_exit_spans=None,
180+
):
173181
self.agent_attributes["http.url"] = self.http_url
174182

175183
i_attrs = (base_attrs and base_attrs.copy()) or attr_class()
@@ -180,4 +188,11 @@ def span_event(self, settings, base_attrs=None, parent_guid=None, attr_class=dic
180188
if self.method:
181189
i_attrs["http.method"] = self.method
182190

183-
return super().span_event(settings, base_attrs=i_attrs, parent_guid=parent_guid, attr_class=attr_class, partial_granularity_sampled=partial_granularity_sampled, ct_exit_spans=ct_exit_spans)
191+
return super().span_event(
192+
settings,
193+
base_attrs=i_attrs,
194+
parent_guid=parent_guid,
195+
attr_class=attr_class,
196+
partial_granularity_sampled=partial_granularity_sampled,
197+
ct_exit_spans=ct_exit_spans,
198+
)

newrelic/core/function_node.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,23 @@ def trace_node(self, stats, root, connections):
114114
start_time=start_time, end_time=end_time, name=name, params=params, children=children, label=self.label
115115
)
116116

117-
def span_event(self, settings, base_attrs=None, parent_guid=None, attr_class=dict, partial_granularity_sampled=False, ct_exit_spans=None):
117+
def span_event(
118+
self,
119+
settings,
120+
base_attrs=None,
121+
parent_guid=None,
122+
attr_class=dict,
123+
partial_granularity_sampled=False,
124+
ct_exit_spans=None,
125+
):
118126
i_attrs = (base_attrs and base_attrs.copy()) or attr_class()
119127
i_attrs["name"] = f"{self.group}/{self.name}"
120128

121-
return super().span_event(settings, base_attrs=i_attrs, parent_guid=parent_guid, attr_class=attr_class, partial_granularity_sampled=partial_granularity_sampled, ct_exit_spans=ct_exit_spans)
129+
return super().span_event(
130+
settings,
131+
base_attrs=i_attrs,
132+
parent_guid=parent_guid,
133+
attr_class=attr_class,
134+
partial_granularity_sampled=partial_granularity_sampled,
135+
ct_exit_spans=ct_exit_spans,
136+
)

newrelic/core/loop_node.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,23 @@ def trace_node(self, stats, root, connections):
7979
start_time=start_time, end_time=end_time, name=name, params=params, children=children, label=None
8080
)
8181

82-
def span_event(self, settings, base_attrs=None, parent_guid=None, attr_class=dict, partial_granularity_sampled=False, ct_exit_spans=None):
82+
def span_event(
83+
self,
84+
settings,
85+
base_attrs=None,
86+
parent_guid=None,
87+
attr_class=dict,
88+
partial_granularity_sampled=False,
89+
ct_exit_spans=None,
90+
):
8391
i_attrs = (base_attrs and base_attrs.copy()) or attr_class()
8492
i_attrs["name"] = f"EventLoop/Wait/{self.name}"
8593

86-
return super().span_event(settings, base_attrs=i_attrs, parent_guid=parent_guid, attr_class=attr_class, partial_granularity_sampled=partial_granularity_sampled, ct_exit_spans=ct_exit_spans)
94+
return super().span_event(
95+
settings,
96+
base_attrs=i_attrs,
97+
parent_guid=parent_guid,
98+
attr_class=attr_class,
99+
partial_granularity_sampled=partial_granularity_sampled,
100+
ct_exit_spans=ct_exit_spans,
101+
)

0 commit comments

Comments
 (0)