Skip to content

Commit

Permalink
Merge branch 'potel-base' into ivana/potel/custom-sampling-context-gcp
Browse files Browse the repository at this point in the history
  • Loading branch information
sentrivana authored Nov 28, 2024
2 parents 0c4bfbb + 7c2d770 commit 60a6b92
Show file tree
Hide file tree
Showing 9 changed files with 191 additions and 200 deletions.
53 changes: 30 additions & 23 deletions sentry_sdk/integrations/opentelemetry/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -161,36 +161,43 @@ def span_data_for_http_method(span):
# type: (ReadableSpan) -> OtelExtractedSpanData
span_attributes = span.attributes or {}

op = "http"
op = span_attributes.get(SentrySpanAttribute.OP)
if op is None:
op = "http"

if span.kind == SpanKind.SERVER:
op += ".server"
elif span.kind == SpanKind.CLIENT:
op += ".client"
if span.kind == SpanKind.SERVER:
op += ".server"
elif span.kind == SpanKind.CLIENT:
op += ".client"

http_method = span_attributes.get(SpanAttributes.HTTP_METHOD)
route = span_attributes.get(SpanAttributes.HTTP_ROUTE)
target = span_attributes.get(SpanAttributes.HTTP_TARGET)
peer_name = span_attributes.get(SpanAttributes.NET_PEER_NAME)

description = f"{http_method}"

if route:
description = f"{http_method} {route}"
elif target:
description = f"{http_method} {target}"
elif peer_name:
description = f"{http_method} {peer_name}"
else:
url = span_attributes.get(SpanAttributes.HTTP_URL)
url = cast("Optional[str]", url)

if url:
parsed_url = urlparse(url)
url = "{}://{}{}".format(
parsed_url.scheme, parsed_url.netloc, parsed_url.path
)
description = f"{http_method} {url}"
# TODO-neel-potel remove description completely
description = span_attributes.get(
SentrySpanAttribute.DESCRIPTION
) or span_attributes.get(SentrySpanAttribute.NAME)
if description is None:
description = f"{http_method}"

if route:
description = f"{http_method} {route}"
elif target:
description = f"{http_method} {target}"
elif peer_name:
description = f"{http_method} {peer_name}"
else:
url = span_attributes.get(SpanAttributes.HTTP_URL)
url = cast("Optional[str]", url)

if url:
parsed_url = urlparse(url)
url = "{}://{}{}".format(
parsed_url.scheme, parsed_url.netloc, parsed_url.path
)
description = f"{http_method} {url}"

status, http_status = extract_span_status(span)

Expand Down
69 changes: 27 additions & 42 deletions sentry_sdk/integrations/rust_tracing.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,9 @@
import sentry_sdk
from sentry_sdk.integrations import Integration
from sentry_sdk.scope import should_send_default_pii
from sentry_sdk.tracing import Span as SentrySpan
from sentry_sdk.tracing import POTelSpan as SentrySpan
from sentry_sdk.utils import SENSITIVE_DATA_SUBSTITUTE

TraceState = Optional[Tuple[Optional[SentrySpan], SentrySpan]]


class RustTracingLevel(Enum):
Trace: str = "TRACE"
Expand Down Expand Up @@ -171,7 +169,7 @@ def _include_tracing_fields(self) -> bool:
else self.include_tracing_fields
)

def on_event(self, event: str, _span_state: TraceState) -> None:
def on_event(self, event: str, _span_state: Optional[SentrySpan]) -> None:
deserialized_event = json.loads(event)
metadata = deserialized_event.get("metadata", {})

Expand All @@ -185,7 +183,7 @@ def on_event(self, event: str, _span_state: TraceState) -> None:
elif event_type == EventTypeMapping.Event:
process_event(deserialized_event)

def on_new_span(self, attrs: str, span_id: str) -> TraceState:
def on_new_span(self, attrs: str, span_id: str) -> Optional[SentrySpan]:
attrs = json.loads(attrs)
metadata = attrs.get("metadata", {})

Expand All @@ -205,48 +203,35 @@ def on_new_span(self, attrs: str, span_id: str) -> TraceState:
else:
sentry_span_name = "<unknown>"

kwargs = {
"op": "function",
"name": sentry_span_name,
"origin": self.origin,
}

scope = sentry_sdk.get_current_scope()
parent_sentry_span = scope.span
if parent_sentry_span:
sentry_span = parent_sentry_span.start_child(**kwargs)
else:
sentry_span = scope.start_span(**kwargs)
span = sentry_sdk.start_span(
op="function",
name=sentry_span_name,
origin=self.origin,
only_if_parent=True,
)
span.__enter__()

fields = metadata.get("fields", [])
for field in fields:
if self._include_tracing_fields():
sentry_span.set_data(field, attrs.get(field))
else:
sentry_span.set_data(field, SENSITIVE_DATA_SUBSTITUTE)

scope.span = sentry_span
return (parent_sentry_span, sentry_span)

def on_close(self, span_id: str, span_state: TraceState) -> None:
if span_state is None:
return

parent_sentry_span, sentry_span = span_state
sentry_span.finish()
sentry_sdk.get_current_scope().span = parent_sentry_span

def on_record(self, span_id: str, values: str, span_state: TraceState) -> None:
if span_state is None:
return
_parent_sentry_span, sentry_span = span_state

deserialized_values = json.loads(values)
for key, value in deserialized_values.items():
if self._include_tracing_fields():
sentry_span.set_data(key, value)
span.set_data(field, attrs.get(field))
else:
sentry_span.set_data(key, SENSITIVE_DATA_SUBSTITUTE)
span.set_data(field, SENSITIVE_DATA_SUBSTITUTE)

return span

def on_close(self, span_id: str, span: Optional[SentrySpan]) -> None:
if span is not None:
span.__exit__(None, None, None)

def on_record(self, span_id: str, values: str, span: Optional[SentrySpan]) -> None:
if span is not None:
deserialized_values = json.loads(values)
for key, value in deserialized_values.items():
if self._include_tracing_fields():
span.set_data(key, value)
else:
span.set_data(key, SENSITIVE_DATA_SUBSTITUTE)


class RustTracingIntegration(Integration):
Expand Down
4 changes: 3 additions & 1 deletion sentry_sdk/integrations/socket.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,9 @@ def create_connection(
origin=SocketIntegration.origin,
only_if_parent=True,
) as span:
span.set_data("address", address)
host, port = address
span.set_data("address.host", host)
span.set_data("address.port", port)
span.set_data("timeout", timeout)
span.set_data("source_address", source_address)

Expand Down
3 changes: 2 additions & 1 deletion sentry_sdk/integrations/stdlib.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ def putrequest(self, method, url, *args, **kwargs):
origin="auto.http.stdlib.httplib",
only_if_parent=True,
)
span.__enter__()

data = {
SPANDATA.HTTP_METHOD: method,
Expand Down Expand Up @@ -152,7 +153,7 @@ def getresponse(self, *args, **kwargs):
span.set_http_status(int(rv.status))
span.set_data("reason", rv.reason)
finally:
span.finish()
span.__exit__(None, None, None)

return rv

Expand Down
9 changes: 7 additions & 2 deletions sentry_sdk/tracing.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import json
import uuid
import random
import time
Expand Down Expand Up @@ -1631,8 +1632,12 @@ def finish(self, end_timestamp=None):

def to_json(self):
# type: () -> dict[str, Any]
# TODO-neel-potel for sampling context
pass
"""
Only meant for testing. Not used internally anymore.
"""
if not isinstance(self._otel_span, ReadableSpan):
return {}
return json.loads(self._otel_span.to_json())

def get_trace_context(self):
# type: () -> dict[str, Any]
Expand Down
10 changes: 6 additions & 4 deletions tests/integrations/httpx/test_httpx.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,10 @@ def test_outgoing_trace_headers(sentry_init, httpx_client, capture_envelopes):
(httpx.Client(), httpx.AsyncClient()),
)
def test_outgoing_trace_headers_append_to_baggage(
sentry_init, httpx_client, capture_envelopes, SortedBaggage, # noqa: N803
sentry_init,
httpx_client,
capture_envelopes,
SortedBaggage, # noqa: N803
):
sentry_init(
traces_sample_rate=1.0,
Expand Down Expand Up @@ -137,9 +140,8 @@ def test_outgoing_trace_headers_append_to_baggage(
parent_span_id=request_span["span_id"],
sampled=1,
)
assert (
response.request.headers["baggage"]
== SortedBaggage(f"custom=data,sentry-trace_id={trace_id},sentry-environment=production,sentry-release=d08ebdb9309e1b004c6f52202de58a09c2268e42,sentry-transaction=/interactions/other-dogs/new-dog,sentry-sample_rate=1.0,sentry-sampled=true")
assert response.request.headers["baggage"] == SortedBaggage(
f"custom=data,sentry-trace_id={trace_id},sentry-environment=production,sentry-release=d08ebdb9309e1b004c6f52202de58a09c2268e42,sentry-transaction=/interactions/other-dogs/new-dog,sentry-sample_rate=1.0,sentry-sampled=true"
)


Expand Down
Loading

0 comments on commit 60a6b92

Please sign in to comment.