diff --git a/sentry_sdk/integrations/boto3/_services/bedrock.py b/sentry_sdk/integrations/boto3/_services/bedrock.py index e6e1446aa3..77420f3407 100644 --- a/sentry_sdk/integrations/boto3/_services/bedrock.py +++ b/sentry_sdk/integrations/boto3/_services/bedrock.py @@ -28,12 +28,18 @@ def get_request_attributes(self, ctx: "AwsCallContext") -> "Attributes": if ctx.operation_name != "Converse" and ctx.operation_name != "ConverseStream": return {} - return { + attributes: "Attributes" = { SPANDATA.GEN_AI_PROVIDER_NAME: "aws.bedrock", SPANDATA.GEN_AI_OPERATION_NAME: "chat", SPANDATA.GEN_AI_RESPONSE_STREAMING: ctx.operation_name == "ConverseStream", } + model_id = ctx.params.get("modelId") + if model_id is not None: + attributes[SPANDATA.GEN_AI_REQUEST_MODEL] = model_id + + return attributes + def get_response_attributes( self, ctx: "AwsCallContext", diff --git a/tests/integrations/boto3/test_bedrock.py b/tests/integrations/boto3/test_bedrock.py index 5219bdf8b2..a272ae2dd5 100644 --- a/tests/integrations/boto3/test_bedrock.py +++ b/tests/integrations/boto3/test_bedrock.py @@ -68,6 +68,10 @@ def test_converse( assert span["attributes"][SPANDATA.GEN_AI_PROVIDER_NAME] == "aws.bedrock" assert span["attributes"][SPANDATA.GEN_AI_OPERATION_NAME] == "chat" assert span["attributes"][SPANDATA.GEN_AI_RESPONSE_STREAMING] is False + assert ( + span["attributes"][SPANDATA.GEN_AI_REQUEST_MODEL] + == "anthropic.claude-3-sonnet-20240229-v1:0" + ) else: events = capture_events() @@ -83,6 +87,10 @@ def test_converse( assert span["data"][SPANDATA.GEN_AI_PROVIDER_NAME] == "aws.bedrock" assert span["data"][SPANDATA.GEN_AI_OPERATION_NAME] == "chat" assert span["data"][SPANDATA.GEN_AI_RESPONSE_STREAMING] is False + assert ( + span["data"][SPANDATA.GEN_AI_REQUEST_MODEL] + == "anthropic.claude-3-sonnet-20240229-v1:0" + ) @pytest.mark.parametrize("span_streaming", [True, False]) @@ -139,6 +147,10 @@ def raise_client_error(**kwargs): assert span["attributes"][SPANDATA.GEN_AI_PROVIDER_NAME] == "aws.bedrock" assert span["attributes"][SPANDATA.GEN_AI_OPERATION_NAME] == "chat" + assert ( + span["attributes"][SPANDATA.GEN_AI_REQUEST_MODEL] + == "anthropic.claude-3-sonnet-20240229-v1:0" + ) assert span["attributes"][SPANDATA.ERROR_TYPE] == "AccessDeniedException" assert span["attributes"][SPANDATA.HTTP_STATUS_CODE] == 403 @@ -159,6 +171,10 @@ def raise_client_error(**kwargs): assert span["data"][SPANDATA.GEN_AI_PROVIDER_NAME] == "aws.bedrock" assert span["data"][SPANDATA.GEN_AI_OPERATION_NAME] == "chat" + assert ( + span["data"][SPANDATA.GEN_AI_REQUEST_MODEL] + == "anthropic.claude-3-sonnet-20240229-v1:0" + ) assert span["data"][SPANDATA.ERROR_TYPE] == "AccessDeniedException" assert span["data"][SPANDATA.HTTP_STATUS_CODE] == 403 @@ -206,6 +222,10 @@ def test_converse_stream( assert span["attributes"][SPANDATA.GEN_AI_PROVIDER_NAME] == "aws.bedrock" assert span["attributes"][SPANDATA.GEN_AI_OPERATION_NAME] == "chat" assert span["attributes"][SPANDATA.GEN_AI_RESPONSE_STREAMING] is True + assert ( + span["attributes"][SPANDATA.GEN_AI_REQUEST_MODEL] + == "anthropic.claude-3-sonnet-20240229-v1:0" + ) else: events = capture_events() @@ -221,6 +241,10 @@ def test_converse_stream( assert span["data"][SPANDATA.GEN_AI_PROVIDER_NAME] == "aws.bedrock" assert span["data"][SPANDATA.GEN_AI_OPERATION_NAME] == "chat" assert span["data"][SPANDATA.GEN_AI_RESPONSE_STREAMING] is True + assert ( + span["data"][SPANDATA.GEN_AI_REQUEST_MODEL] + == "anthropic.claude-3-sonnet-20240229-v1:0" + ) @pytest.mark.parametrize("span_streaming", [True, False]) @@ -278,6 +302,10 @@ def raise_client_error(**kwargs): assert span["attributes"][SPANDATA.GEN_AI_PROVIDER_NAME] == "aws.bedrock" assert span["attributes"][SPANDATA.GEN_AI_OPERATION_NAME] == "chat" assert span["attributes"][SPANDATA.GEN_AI_RESPONSE_STREAMING] is True + assert ( + span["attributes"][SPANDATA.GEN_AI_REQUEST_MODEL] + == "anthropic.claude-3-sonnet-20240229-v1:0" + ) assert span["attributes"][SPANDATA.ERROR_TYPE] == "AccessDeniedException" assert span["attributes"][SPANDATA.HTTP_STATUS_CODE] == 403 @@ -299,6 +327,10 @@ def raise_client_error(**kwargs): assert span["data"][SPANDATA.GEN_AI_PROVIDER_NAME] == "aws.bedrock" assert span["data"][SPANDATA.GEN_AI_OPERATION_NAME] == "chat" assert span["data"][SPANDATA.GEN_AI_RESPONSE_STREAMING] is True + assert ( + span["data"][SPANDATA.GEN_AI_REQUEST_MODEL] + == "anthropic.claude-3-sonnet-20240229-v1:0" + ) assert span["data"][SPANDATA.ERROR_TYPE] == "AccessDeniedException" assert span["data"][SPANDATA.HTTP_STATUS_CODE] == 403