|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
import random
|
|
|
import uuid
|
|
|
from datetime import datetime, timezone
|
|
|
-from typing import Any, Mapping, Optional, cast
|
|
|
+from typing import Any, Mapping, Optional
|
|
|
|
|
|
import sentry_sdk
|
|
|
from arroyo.backends.kafka import KafkaPayload, KafkaProducer, build_kafka_configuration
|
|
@@ -14,7 +14,7 @@ from django.conf import settings
|
|
|
from sentry_kafka_schemas import get_codec
|
|
|
from sentry_kafka_schemas.codecs import Codec, ValidationError
|
|
|
from sentry_kafka_schemas.schema_types.ingest_spans_v1 import IngestSpanMessage
|
|
|
-from sentry_kafka_schemas.schema_types.snuba_spans_v1 import SpanEvent, _SentryExtractedTags
|
|
|
+from sentry_kafka_schemas.schema_types.snuba_spans_v1 import SpanEvent
|
|
|
|
|
|
from sentry.spans.grouping.api import load_span_grouping_config
|
|
|
from sentry.spans.grouping.strategy.base import Span
|
|
@@ -44,42 +44,34 @@ def _process_relay_span_v1(relay_span: Mapping[str, Any]) -> SpanEvent:
|
|
|
segment_id=relay_span.get("segment_id", "0"),
|
|
|
span_id=relay_span.get("span_id", "0"),
|
|
|
start_timestamp_ms=int(start_timestamp.timestamp() * 1e3),
|
|
|
- trace_id=uuid.UUID(relay_span["trace_id"]).hex,
|
|
|
+ trace_id=_format_event_id(relay_span["trace_id"]),
|
|
|
)
|
|
|
|
|
|
- if value := relay_span.get("description"):
|
|
|
- snuba_span["description"] = value
|
|
|
+ for key in {"description", "tags", "measurements", "sentry_tags"}:
|
|
|
+ if value := relay_span.get(key):
|
|
|
+ snuba_span[key] = value # type: ignore
|
|
|
|
|
|
- if value := relay_span.get("tags"):
|
|
|
- snuba_span["tags"] = value
|
|
|
+ for key in {"event_id", "profile_id"}:
|
|
|
+ if value := format_event_id(relay_span, key=key):
|
|
|
+ snuba_span[key] = value # type: ignore
|
|
|
|
|
|
- if value := _format_event_id(relay_span, key="event_id"):
|
|
|
- snuba_span["event_id"] = value
|
|
|
-
|
|
|
- if value := _format_event_id(relay_span, key="profile_id"):
|
|
|
- snuba_span["profile_id"] = value
|
|
|
-
|
|
|
- snuba_span["sentry_tags"] = cast(
|
|
|
- _SentryExtractedTags,
|
|
|
- relay_span.get("sentry_tags", {}),
|
|
|
- )
|
|
|
-
|
|
|
- _process_group_raw(snuba_span, snuba_span["sentry_tags"].get("transaction", ""))
|
|
|
+ _process_group_raw(snuba_span)
|
|
|
|
|
|
return snuba_span
|
|
|
|
|
|
|
|
|
-def _process_group_raw(snuba_span: SpanEvent, transaction: str) -> None:
|
|
|
+def _process_group_raw(snuba_span: SpanEvent) -> None:
|
|
|
grouping_config = load_span_grouping_config()
|
|
|
+ sentry_tags = snuba_span.get("sentry_tags", {})
|
|
|
|
|
|
if snuba_span["is_segment"]:
|
|
|
group_raw = grouping_config.strategy.get_transaction_span_group(
|
|
|
- {"transaction": transaction},
|
|
|
+ {"transaction": sentry_tags.get("transaction", "")},
|
|
|
)
|
|
|
else:
|
|
|
# Build a span with only necessary values filled.
|
|
|
span = Span(
|
|
|
- op=snuba_span.get("sentry_tags", {}).get("op", ""),
|
|
|
+ op=sentry_tags.get("op", ""),
|
|
|
description=snuba_span.get("description", ""),
|
|
|
fingerprint=None,
|
|
|
trace_id="",
|
|
@@ -101,13 +93,16 @@ def _process_group_raw(snuba_span: SpanEvent, transaction: str) -> None:
|
|
|
metrics.incr("spans.invalid_group_raw")
|
|
|
|
|
|
|
|
|
-def _format_event_id(payload: Mapping[str, Any], key="event_id") -> Optional[str]:
|
|
|
- event_id = payload.get(key)
|
|
|
- if event_id:
|
|
|
- return uuid.UUID(event_id).hex
|
|
|
+def format_event_id(payload: Mapping[str, Any], key: str) -> Optional[str]:
|
|
|
+ if event_id := payload.get(key):
|
|
|
+ return _format_event_id(event_id)
|
|
|
return None
|
|
|
|
|
|
|
|
|
+def _format_event_id(event_id: str) -> str:
|
|
|
+ return uuid.UUID(event_id).hex
|
|
|
+
|
|
|
+
|
|
|
def _deserialize_payload(payload: bytes) -> Mapping[str, Any]:
|
|
|
return INGEST_SPAN_SCHEMA.decode(payload)
|
|
|
|