Skip to content

Commit bafd8e1

Browse files
authored
ref(o11y): Add scope.set_attribute calls in organization misc endpoints (#117516)
Supplement existing `set_tag`/`set_context`/`set_extra` calls with `set_attribute` so that data gets added to attributes-based telemetry as well. This will make the migration to span streaming easier. Additionally, if applicable, use top-level SDK API instead of scope APIs. Related to getsentry/sentry-python#6537
1 parent a20bdb7 commit bafd8e1

9 files changed

Lines changed: 34 additions & 1 deletion

File tree

src/sentry/api/endpoints/internal/rpc.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ def _is_authorized(self, request: Request) -> bool:
4242
return False
4343

4444
def post(self, request: Request, service_name: str, method_name: str) -> Response:
45-
sentry_sdk.get_isolation_scope().set_tag("rpc_method", f"{service_name}.{method_name}")
45+
sentry_sdk.set_tag("rpc_method", f"{service_name}.{method_name}")
46+
sentry_sdk.set_attribute("rpc_method", f"{service_name}.{method_name}")
4647
if not self._is_authorized(request):
4748
raise PermissionDenied
4849

src/sentry/api/endpoints/organization_sdk_updates.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,9 @@ def get(self, request: Request, organization: Organization) -> Response:
9494

9595
len_projects = len(projects)
9696
sentry_sdk.set_tag("query.num_projects", len_projects)
97+
sentry_sdk.set_attribute("query.num_projects", len_projects)
9798
sentry_sdk.set_tag("query.num_projects.grouped", format_grouped_length(len_projects))
99+
sentry_sdk.set_attribute("query.num_projects.grouped", format_grouped_length(len_projects))
98100

99101
if len(projects) == 0:
100102
return Response([])

src/sentry/api/endpoints/organization_tagkey_values.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,20 +32,25 @@ def get(self, request: Request, organization, key) -> Response:
3232
return Response({"detail": f'Invalid tag key format for "{key}"'}, status=400)
3333

3434
sentry_sdk.set_tag("query.tag_key", key)
35+
sentry_sdk.set_attribute("query.tag_key", key)
3536

3637
dataset = None
3738
if request.GET.get("dataset"):
3839
try:
3940
dataset = Dataset(request.GET.get("dataset"))
4041
sentry_sdk.set_tag("dataset", dataset.value)
42+
sentry_sdk.set_attribute("dataset", dataset.value)
4143
except ValueError:
4244
raise ParseError(detail="Invalid dataset parameter")
4345
elif request.GET.get("includeTransactions") == "1":
4446
sentry_sdk.set_tag("dataset", Dataset.Discover.value)
47+
sentry_sdk.set_attribute("dataset", Dataset.Discover.value)
4548
elif request.GET.get("includeReplays") == "1":
4649
sentry_sdk.set_tag("dataset", Dataset.Replays.value)
50+
sentry_sdk.set_attribute("dataset", Dataset.Replays.value)
4751
else:
4852
sentry_sdk.set_tag("dataset", Dataset.Events.value)
53+
sentry_sdk.set_attribute("dataset", Dataset.Events.value)
4954

5055
try:
5156
snuba_params = self.get_snuba_params(request, organization)

src/sentry/api/endpoints/organization_tags.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,11 +148,17 @@ def get(
148148

149149
# Setting the tag for now since the measurement is still experimental
150150
sentry_sdk.set_tag("custom_tags.count", len(final_results))
151+
sentry_sdk.set_attribute("custom_tags.count", len(final_results))
151152
sentry_sdk.set_tag(
152153
"custom_tags.count.grouped",
153154
format_grouped_length(len(final_results), [1, 10, 50, 100]),
154155
)
156+
sentry_sdk.set_attribute(
157+
"custom_tags.count.grouped",
158+
format_grouped_length(len(final_results), [1, 10, 50, 100]),
159+
)
155160
sentry_sdk.set_tag("dataset_queried", dataset.value)
161+
sentry_sdk.set_attribute("dataset_queried", dataset.value)
156162
set_span_attribute("custom_tags.count", len(final_results))
157163

158164
return Response(serialize(final_results, request.user, TagKeySerializer()))

src/sentry/api/endpoints/organization_trace_item_attributes.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,7 @@ def query_trace_attributes(
582582
)
583583

584584
sentry_sdk.set_context("api_response", {"attributes": attributes})
585+
sentry_sdk.set_attribute("api_response.attributes", str(attributes))
585586
span.set_data("attribute_count", len(attributes))
586587
span.set_data("attribute_type", attribute_type)
587588
return attributes, debug_info
@@ -654,6 +655,7 @@ def serialize_trace_attributes(
654655
attribute_keys[attr_key["key"]] = attr_key
655656
attributes = list(attribute_keys.values())
656657
sentry_sdk.set_context("api_response", {"attributes": attributes})
658+
sentry_sdk.set_attribute("api_response.attributes", str(attributes))
657659
return attributes
658660

659661

@@ -676,6 +678,7 @@ def get(self, request: Request, organization: Organization, key: str) -> Respons
676678
)
677679

678680
sentry_sdk.set_tag("query.attribute_key", key)
681+
sentry_sdk.set_attribute("query.attribute_key", key)
679682

680683
serialized = serializer.validated_data
681684
substring_match = serialized.get("substring_match", "")

src/sentry/api/endpoints/project_trace_item_details.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,7 @@ def get(request: Request, project: Project, item_id: str) -> Response:
377377
trace_id = serialized.get("trace_id")
378378
item_type = serialized.get("item_type")
379379
sentry_sdk.set_tag("trace_item_details.item_type", item_type)
380+
sentry_sdk.set_attribute("trace_item_details.item_type", item_type)
380381
referrer = serialized.get("referrer", Referrer.API_ORGANIZATION_TRACE_ITEM_DETAILS.value)
381382

382383
trace_item_type = None

src/sentry/api/endpoints/relay/project_configs.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from collections.abc import MutableMapping
33
from typing import Any
44

5+
import sentry_sdk
56
from rest_framework.request import Request
67
from rest_framework.response import Response
78
from sentry_sdk import set_tag, start_span
@@ -48,6 +49,7 @@ def post(self, request: Request):
4849

4950
version = request.GET.get("version") or "1"
5051
set_tag("relay_protocol_version", version)
52+
sentry_sdk.set_attribute("relay_protocol_version", version)
5153

5254
if version == "3" and request.relay_request_data.get("global"):
5355
response["global"] = get_global_config()
@@ -79,8 +81,10 @@ def _should_post_or_schedule(self, version, request):
7981
considering them for the full build.
8082
"""
8183
set_tag("relay_endpoint_version", version)
84+
sentry_sdk.set_attribute("relay_endpoint_version", version)
8285
no_cache = request.relay_request_data.get("noCache") or False
8386
set_tag("relay_no_cache", no_cache)
87+
sentry_sdk.set_attribute("relay_no_cache", no_cache)
8488

8589
post_or_schedule = True
8690
reason = "version"
@@ -94,7 +98,9 @@ def _should_post_or_schedule(self, version, request):
9498
version = "2" # Downgrade to 2 for reporting metrics
9599

96100
set_tag("relay_use_post_or_schedule", post_or_schedule)
101+
sentry_sdk.set_attribute("relay_use_post_or_schedule", post_or_schedule)
97102
set_tag("relay_use_post_or_schedule_rejected", reason)
103+
sentry_sdk.set_attribute("relay_use_post_or_schedule_rejected", reason)
98104
if version == "2":
99105
metrics.incr(
100106
"api.endpoints.relay.project_configs.post",

src/sentry/api/serializers/rest_framework/dashboard.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,7 @@ def _validate_widget_type(self, data):
442442
"org_slug": self.context["organization"].slug,
443443
},
444444
)
445+
sentry_sdk.set_attribute("dashboard.org_slug", self.context["organization"].slug)
445446
sentry_sdk.capture_message("Created or updated widget with discover dataset.")
446447
raise serializers.ValidationError(
447448
{
@@ -974,6 +975,13 @@ def update_widgets(self, instance, widget_data):
974975
"requested_widget_ids": widget_ids,
975976
},
976977
)
978+
sentry_sdk.set_attribute("dashboard.org_slug", instance.organization.slug)
979+
sentry_sdk.set_attribute("dashboard.dashboard_id", instance.id)
980+
sentry_sdk.set_attribute("dashboard.widget_id", widget_id)
981+
sentry_sdk.set_attribute(
982+
"dashboard.existing_widget_ids", str(list(existing_map.keys()))
983+
)
984+
sentry_sdk.set_attribute("dashboard.requested_widget_ids", str(widget_ids))
977985
sentry_sdk.capture_message(
978986
"Attempted to update widget not belonging to dashboard."
979987
)

src/sentry/data_export/endpoints/data_export.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ def _validate_query_info(self, query_type: str, query_info: dict[str, Any]) -> d
128128
start, end = get_date_range_from_params(query_info)
129129
except InvalidParams as err:
130130
sentry_sdk.set_tag("query.error_reason", "Invalid date params")
131+
sentry_sdk.set_attribute("query.error_reason", "Invalid date params")
131132
sentry_sdk.capture_exception(err)
132133
raise serializers.ValidationError("Invalid date parameters.")
133134

0 commit comments

Comments
 (0)