66package io .opentelemetry .instrumentation .awssdk .v1_11 ;
77
88import static io .opentelemetry .instrumentation .awssdk .v1_11 .AwsExperimentalAttributes .AWS_AGENT ;
9+ import static io .opentelemetry .instrumentation .awssdk .v1_11 .AwsExperimentalAttributes .AWS_AGENT_ID ;
10+ import static io .opentelemetry .instrumentation .awssdk .v1_11 .AwsExperimentalAttributes .AWS_BEDROCK_RUNTIME_MODEL_ID ;
11+ import static io .opentelemetry .instrumentation .awssdk .v1_11 .AwsExperimentalAttributes .AWS_BEDROCK_SYSTEM ;
912import static io .opentelemetry .instrumentation .awssdk .v1_11 .AwsExperimentalAttributes .AWS_BUCKET_NAME ;
1013import static io .opentelemetry .instrumentation .awssdk .v1_11 .AwsExperimentalAttributes .AWS_ENDPOINT ;
14+ import static io .opentelemetry .instrumentation .awssdk .v1_11 .AwsExperimentalAttributes .AWS_GUARDRAIL_ID ;
15+ import static io .opentelemetry .instrumentation .awssdk .v1_11 .AwsExperimentalAttributes .AWS_KNOWLEDGEBASE_ID ;
1116import static io .opentelemetry .instrumentation .awssdk .v1_11 .AwsExperimentalAttributes .AWS_QUEUE_NAME ;
1217import static io .opentelemetry .instrumentation .awssdk .v1_11 .AwsExperimentalAttributes .AWS_QUEUE_URL ;
1318import static io .opentelemetry .instrumentation .awssdk .v1_11 .AwsExperimentalAttributes .AWS_REQUEST_ID ;
2126import io .opentelemetry .api .common .AttributesBuilder ;
2227import io .opentelemetry .context .Context ;
2328import io .opentelemetry .instrumentation .api .instrumenter .AttributesExtractor ;
29+ import java .util .Objects ;
2430import java .util .function .Function ;
2531import javax .annotation .Nullable ;
2632
2733class AwsSdkExperimentalAttributesExtractor
2834 implements AttributesExtractor <Request <?>, Response <?>> {
2935 private static final String COMPONENT_NAME = "java-aws-sdk" ;
36+ private static final String BEDROCK_SERVICE = "AmazonBedrock" ;
37+ private static final String BEDROCK_AGENT_SERVICE = "AWSBedrockAgent" ;
38+ private static final String BEDROCK_AGENT_RUNTIME_SERVICE = "AWSBedrockAgentRuntime" ;
39+ private static final String BEDROCK_RUNTIME_SERVICE = "AmazonBedrockRuntime" ;
3040
3141 @ Override
3242 public void onStart (AttributesBuilder attributes , Context parentContext , Request <?> request ) {
3343 attributes .put (AWS_AGENT , COMPONENT_NAME );
3444 attributes .put (AWS_ENDPOINT , request .getEndpoint ().toString ());
3545
3646 Object originalRequest = request .getOriginalRequest ();
37- setRequestAttribute ( attributes , AWS_BUCKET_NAME , originalRequest , RequestAccess :: getBucketName );
38- setRequestAttribute (attributes , AWS_QUEUE_URL , originalRequest , RequestAccess ::getQueueUrl );
39- setRequestAttribute (attributes , AWS_QUEUE_NAME , originalRequest , RequestAccess ::getQueueName );
40- setRequestAttribute (attributes , AWS_STREAM_NAME , originalRequest , RequestAccess ::getStreamName );
41- setRequestAttribute (attributes , AWS_TABLE_NAME , originalRequest , RequestAccess ::getTableName );
42- }
47+ String requestClassName = originalRequest . getClass (). getSimpleName ( );
48+ setAttribute (attributes , AWS_BUCKET_NAME , originalRequest , RequestAccess ::getBucketName );
49+ setAttribute (attributes , AWS_QUEUE_URL , originalRequest , RequestAccess ::getQueueUrl );
50+ setAttribute (attributes , AWS_QUEUE_NAME , originalRequest , RequestAccess ::getQueueName );
51+ setAttribute (attributes , AWS_STREAM_NAME , originalRequest , RequestAccess ::getStreamName );
52+ setAttribute ( attributes , AWS_TABLE_NAME , originalRequest , RequestAccess :: getTableName );
4353
44- private static void setRequestAttribute (
45- AttributesBuilder attributes ,
46- AttributeKey <String > key ,
47- Object request ,
48- Function <Object , String > getter ) {
49- String value = getter .apply (request );
50- if (value != null ) {
51- attributes .put (key , value );
54+ // Get serviceName defined in the AWS Java SDK V1 Request class.
55+ String serviceName = request .getServiceName ();
56+ // Extract request attributes only for Bedrock services.
57+ if (isBedrockService (serviceName )) {
58+ bedrockOnStart (attributes , originalRequest , requestClassName , serviceName );
5259 }
5360 }
5461
@@ -59,12 +66,108 @@ public void onEnd(
5966 Request <?> request ,
6067 @ Nullable Response <?> response ,
6168 @ Nullable Throwable error ) {
62- if (response != null && response .getAwsResponse () instanceof AmazonWebServiceResponse ) {
63- AmazonWebServiceResponse <?> awsResp = (AmazonWebServiceResponse <?>) response .getAwsResponse ();
64- String requestId = awsResp .getRequestId ();
65- if (requestId != null ) {
66- attributes .put (AWS_REQUEST_ID , requestId );
69+ if (response != null ) {
70+ Object awsResp = response .getAwsResponse ();
71+ if (awsResp instanceof AmazonWebServiceResponse ) {
72+ AmazonWebServiceResponse <?> awsWebServiceResponse = (AmazonWebServiceResponse <?>) awsResp ;
73+ String requestId = awsWebServiceResponse .getRequestId ();
74+ if (requestId != null ) {
75+ attributes .put (AWS_REQUEST_ID , requestId );
76+ }
77+ }
78+ // Get serviceName defined in the AWS Java SDK V1 Request class.
79+ String serviceName = request .getServiceName ();
80+ // Extract response attributes for Bedrock services
81+ if (awsResp != null && isBedrockService (serviceName )) {
82+ bedrockOnEnd (attributes , awsResp , serviceName );
6783 }
6884 }
6985 }
86+
87+ private static void bedrockOnStart (
88+ AttributesBuilder attributes ,
89+ Object originalRequest ,
90+ String requestClassName ,
91+ String serviceName ) {
92+ switch (serviceName ) {
93+ case BEDROCK_SERVICE :
94+ setAttribute (attributes , AWS_GUARDRAIL_ID , originalRequest , RequestAccess ::getGuardrailId );
95+ break ;
96+ case BEDROCK_AGENT_SERVICE :
97+ AwsBedrockResourceType resourceType =
98+ AwsBedrockResourceType .getRequestType (requestClassName );
99+ if (resourceType != null ) {
100+ setAttribute (
101+ attributes ,
102+ resourceType .getKeyAttribute (),
103+ originalRequest ,
104+ resourceType .getAttributeValueAccessor ());
105+ }
106+ break ;
107+ case BEDROCK_AGENT_RUNTIME_SERVICE :
108+ setAttribute (attributes , AWS_AGENT_ID , originalRequest , RequestAccess ::getAgentId );
109+ setAttribute (
110+ attributes , AWS_KNOWLEDGEBASE_ID , originalRequest , RequestAccess ::getKnowledgeBaseId );
111+ break ;
112+ case BEDROCK_RUNTIME_SERVICE :
113+ if (!Objects .equals (requestClassName , "InvokeModelRequest" )) {
114+ break ;
115+ }
116+ attributes .put (AWS_BEDROCK_SYSTEM , "aws_bedrock" );
117+ Function <Object , String > getter = RequestAccess ::getModelId ;
118+ String modelId = getter .apply (originalRequest );
119+ attributes .put (AWS_BEDROCK_RUNTIME_MODEL_ID , modelId );
120+ break ;
121+ default :
122+ break ;
123+ }
124+ }
125+
126+ private static void bedrockOnEnd (
127+ AttributesBuilder attributes , Object awsResp , String serviceName ) {
128+ switch (serviceName ) {
129+ case BEDROCK_SERVICE :
130+ setAttribute (attributes , AWS_GUARDRAIL_ID , awsResp , RequestAccess ::getGuardrailId );
131+ break ;
132+ case BEDROCK_AGENT_SERVICE :
133+ String responseClassName = awsResp .getClass ().getSimpleName ();
134+ AwsBedrockResourceType resourceType =
135+ AwsBedrockResourceType .getResponseType (responseClassName );
136+ if (resourceType != null ) {
137+ setAttribute (
138+ attributes ,
139+ resourceType .getKeyAttribute (),
140+ awsResp ,
141+ resourceType .getAttributeValueAccessor ());
142+ }
143+ break ;
144+ case BEDROCK_AGENT_RUNTIME_SERVICE :
145+ setAttribute (attributes , AWS_AGENT_ID , awsResp , RequestAccess ::getAgentId );
146+ setAttribute (attributes , AWS_KNOWLEDGEBASE_ID , awsResp , RequestAccess ::getKnowledgeBaseId );
147+ break ;
148+ default :
149+ break ;
150+ }
151+ }
152+
153+ private static boolean isBedrockService (String serviceName ) {
154+ // Check if the serviceName belongs to Bedrock Services defined in AWS Java SDK V1.
155+ // For example <a
156+ // href="https://github.com/aws/aws-sdk-java/blob/38031248a696468e19a4670c0c4585637d5e7cc6/aws-java-sdk-bedrock/src/main/java/com/amazonaws/services/bedrock/AmazonBedrock.java#L34">AmazonBedrock</a>
157+ return serviceName .equals (BEDROCK_SERVICE )
158+ || serviceName .equals (BEDROCK_AGENT_SERVICE )
159+ || serviceName .equals (BEDROCK_AGENT_RUNTIME_SERVICE )
160+ || serviceName .equals (BEDROCK_RUNTIME_SERVICE );
161+ }
162+
163+ private static void setAttribute (
164+ AttributesBuilder attributes ,
165+ AttributeKey <String > key ,
166+ Object request ,
167+ Function <Object , String > getter ) {
168+ String value = getter .apply (request );
169+ if (value != null ) {
170+ attributes .put (key , value );
171+ }
172+ }
70173}
0 commit comments