Skip to content

Commit 19ba0c8

Browse files
committed
feat(boto3): align span names with OTel conventions
- use modeled `ServiceID` and operation for span names: `aws.<hyphenized-service-id>.<Operation>` to `<ServiceID>.<Operation>`; e.g. `aws.s3.GetObject` => `S3.GetObject`
1 parent 61a562c commit 19ba0c8

3 files changed

Lines changed: 23 additions & 13 deletions

File tree

‎sentry_sdk/integrations/boto3/_instrumentation.py‎

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -156,10 +156,9 @@ def _start_client_span(ctx: "AwsCallContext") -> "Optional[Span]":
156156
if client.get_integration(IDENTIFIER) is None:
157157
return None
158158

159-
# use unknown if `service_id_hyphenized` is not set so span name can still be created.
160-
# e.g. "aws.unknown.GetObject"
161-
service_name = ctx.service_id_hyphenized or "unknown"
162-
span_name = f"aws.{service_name}.{ctx.operation_name}"
159+
# https://opentelemetry.io/docs/specs/semconv/cloud-providers/aws-sdk/#aws-sdk-spans
160+
service_name = ctx.service_id or "unknown"
161+
span_name = f"{service_name}.{ctx.operation_name}"
163162
attributes: "Attributes" = {
164163
SPANDATA.RPC_METHOD: ctx.operation_name,
165164
SPANDATA.RPC_SYSTEM_NAME: AWS_RPC_SYSTEM_NAME,

‎tests/integrations/boto3/test_client.py‎

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ def record_client_span(request, **kwargs):
125125
client_spans = [
126126
span
127127
for span in spans
128-
if span.get("name", span.get("description")) == "aws.s3.GetObject"
128+
if span.get("name", span.get("description")) == "S3.GetObject"
129129
and (
130130
span["attributes"].get(SPANDATA.SENTRY_ORIGIN) == ORIGIN
131131
and span["attributes"].get(SPANDATA.SENTRY_OP) == OP.HTTP_CLIENT
@@ -141,7 +141,7 @@ def record_client_span(request, **kwargs):
141141
stream_spans = [
142142
span
143143
for span in spans
144-
if span.get("name", span.get("description")) == "aws.s3.GetObject"
144+
if span.get("name", span.get("description")) == "S3.GetObject"
145145
and (span["attributes"].get(SPANDATA.SENTRY_OP) == OP.HTTP_CLIENT_STREAM)
146146
]
147147
assert len(client_spans) == 1
@@ -437,7 +437,7 @@ def test_get_response_attributes_ignores_malformed_field(field, value, attribute
437437
"s3",
438438
"head_object",
439439
{"Bucket": "bucket", "Key": "foo"},
440-
"aws.s3.HeadObject",
440+
"S3.HeadObject",
441441
"S3",
442442
"HeadObject",
443443
"http://localhost:4566",
@@ -448,13 +448,24 @@ def test_get_response_attributes_ignores_malformed_field(field, value, attribute
448448
"events",
449449
"list_event_buses",
450450
{},
451-
"aws.eventbridge.ListEventBuses",
451+
"EventBridge.ListEventBuses",
452452
"EventBridge",
453453
"ListEventBuses",
454454
None,
455455
"events.eu-north-1.amazonaws.com",
456456
443,
457457
),
458+
(
459+
"apigateway",
460+
"get_rest_apis",
461+
{},
462+
"API Gateway.GetRestApis",
463+
"API Gateway",
464+
"GetRestApis",
465+
None,
466+
"apigateway.eu-north-1.amazonaws.com",
467+
443,
468+
),
458469
],
459470
)
460471
def test_client_call_has_common_attributes(

‎tests/integrations/boto3/test_s3.py‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def test_basic(
4848
assert len(spans) == 2
4949
span = spans[0]
5050
assert span["attributes"]["sentry.op"] == "http.client"
51-
assert span["name"] == "aws.s3.ListObjects"
51+
assert span["name"] == "S3.ListObjects"
5252

5353

5454
def test_streaming(sentry_init, capture_items):
@@ -79,11 +79,11 @@ def test_streaming(sentry_init, capture_items):
7979

8080
stream_span, client_span, parent_span = spans
8181
assert stream_span["attributes"]["sentry.op"] == "http.client.stream"
82-
assert stream_span["name"] == "aws.s3.GetObject"
82+
assert stream_span["name"] == "S3.GetObject"
8383
assert stream_span["parent_span_id"] == client_span["span_id"]
8484

8585
assert client_span["attributes"]["sentry.op"] == "http.client"
86-
assert client_span["name"] == "aws.s3.GetObject"
86+
assert client_span["name"] == "S3.GetObject"
8787
assert client_span["parent_span_id"] == parent_span["span_id"]
8888

8989
assert parent_span["name"] == "custom parent"
@@ -137,11 +137,11 @@ def test_streaming_close(sentry_init, capture_items):
137137

138138
stream_span, client_span, parent_span = spans
139139
assert stream_span["attributes"]["sentry.op"] == "http.client.stream"
140-
assert stream_span["name"] == "aws.s3.GetObject"
140+
assert stream_span["name"] == "S3.GetObject"
141141
assert stream_span["parent_span_id"] == client_span["span_id"]
142142

143143
assert client_span["attributes"]["sentry.op"] == "http.client"
144-
assert client_span["name"] == "aws.s3.GetObject"
144+
assert client_span["name"] == "S3.GetObject"
145145
assert client_span["parent_span_id"] == parent_span["span_id"]
146146

147147
assert parent_span["name"] == "custom parent"

0 commit comments

Comments
 (0)