Skip to content

Commit 9aca704

Browse files
committed
added guardrail arn to bedrock
1 parent 581db39 commit 9aca704

File tree

6 files changed

+25
-5
lines changed

6 files changed

+25
-5
lines changed

aws-distro-opentelemetry-node-autoinstrumentation/src/aws-attribute-keys.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ export const AWS_ATTRIBUTE_KEYS: { [key: string]: string } = {
3636
AWS_BEDROCK_KNOWLEDGE_BASE_ID: 'aws.bedrock.knowledge_base.id',
3737
AWS_BEDROCK_AGENT_ID: 'aws.bedrock.agent.id',
3838
AWS_BEDROCK_GUARDRAIL_ID: 'aws.bedrock.guardrail.id',
39+
AWS_BEDROCK_GUARDRAIL_ARN: 'aws.bedrock.guardrail.arn',
3940
AWS_SNS_TOPIC_ARN: 'aws.sns.topic.arn',
4041
AWS_SECRETSMANAGER_SECRET_ARN: 'aws.secretsmanager.secret.arn',
4142
AWS_STEPFUNCTIONS_STATEMACHINE_ARN: 'aws.stepfunctions.state_machine.arn',

aws-distro-opentelemetry-node-autoinstrumentation/src/aws-metric-attribute-generator.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,9 @@ export class AwsMetricAttributeGenerator implements MetricAttributeGenerator {
437437
remoteResourceIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(
438438
span.attributes[AWS_ATTRIBUTE_KEYS.AWS_BEDROCK_GUARDRAIL_ID]
439439
);
440+
cloudFormationIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(
441+
span.attributes[AWS_ATTRIBUTE_KEYS.AWS_BEDROCK_GUARDRAIL_ARN]
442+
);
440443
} else if (AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_BEDROCK_KNOWLEDGE_BASE_ID)) {
441444
remoteResourceType = NORMALIZED_BEDROCK_SERVICE_NAME + '::KnowledgeBase';
442445
remoteResourceIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(

aws-distro-opentelemetry-node-autoinstrumentation/src/patches/aws/services/bedrock.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ const AGENT_ID: string = 'agentId';
1515
const KNOWLEDGE_BASE_ID: string = 'knowledgeBaseId';
1616
const DATA_SOURCE_ID: string = 'dataSourceId';
1717
const GUARDRAIL_ID: string = 'guardrailId';
18+
const GUARDRAIL_ARN: string = 'guardrailArn';
1819
const MODEL_ID: string = 'modelId';
1920
const AWS_BEDROCK_SYSTEM: string = 'aws_bedrock';
2021

@@ -182,10 +183,15 @@ export class BedrockServiceExtension implements ServiceExtension {
182183
};
183184
}
184185
responseHook(response: NormalizedResponse, span: Span, tracer: Tracer, config: AwsSdkInstrumentationConfig): void {
185-
const guardrail_id = response.data[GUARDRAIL_ID];
186+
const guardrailId = response.data[GUARDRAIL_ID];
187+
const guardrailArn = response.data[GUARDRAIL_ARN];
186188

187-
if (guardrail_id) {
188-
span.setAttribute(AWS_ATTRIBUTE_KEYS.AWS_BEDROCK_GUARDRAIL_ID, guardrail_id);
189+
if (guardrailId) {
190+
span.setAttribute(AWS_ATTRIBUTE_KEYS.AWS_BEDROCK_GUARDRAIL_ID, guardrailId);
191+
}
192+
193+
if (guardrailArn) {
194+
span.setAttribute(AWS_ATTRIBUTE_KEYS.AWS_BEDROCK_GUARDRAIL_ARN, guardrailArn);
189195
}
190196
}
191197
}

aws-distro-opentelemetry-node-autoinstrumentation/test/aws-metric-attribute-generator.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -849,10 +849,12 @@ describe('AwsMetricAttributeGeneratorTest', () => {
849849
validateRemoteResourceAttributes('AWS::Bedrock::DataSource', 'test_datasource_^^id');
850850
mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_BEDROCK_DATA_SOURCE_ID, undefined);
851851

852-
// Validate behaviour of AWS_BEDROCK_GUARDRAIL_ID attribute, then remove it.
852+
// Validate behaviour of AWS_BEDROCK_GUARDRAIL_ID and AWS_BEDROCK_GUARDRAIL_ARN attribute, then remove it.
853853
mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_BEDROCK_GUARDRAIL_ID, 'test_guardrail_id');
854+
mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_BEDROCK_GUARDRAIL_ARN, 'test_guardrail_arn');
854855
validateRemoteResourceAttributes('AWS::Bedrock::Guardrail', 'test_guardrail_id');
855856
mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_BEDROCK_GUARDRAIL_ID, undefined);
857+
mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_BEDROCK_GUARDRAIL_ARN, undefined);
856858

857859
// Validate behaviour of AWS_BEDROCK_GUARDRAIL_ID attribute with special chars(^), then remove it.
858860
mockAttribute(AWS_ATTRIBUTE_KEYS.AWS_BEDROCK_GUARDRAIL_ID, 'test_guardrail_^id');

aws-distro-opentelemetry-node-autoinstrumentation/test/patches/aws/services/bedrock.test.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,9 +236,11 @@ describe('Bedrock', () => {
236236
describe('GetGuardrail', () => {
237237
it('adds guardrailId to span', async () => {
238238
const dummyGuardrailIdentifier: string = 'ABCDEFGH';
239+
const guardrailArn: string = 'arn:aws:bedrock:us-east-1:123456789012:guardrail/abc123';
239240

240241
nock(`https://bedrock.${region}.amazonaws.com`).get(`/guardrails/${dummyGuardrailIdentifier}`).reply(200, {
241242
guardrailId: dummyGuardrailIdentifier,
243+
guardrailArn: guardrailArn,
242244
});
243245

244246
await bedrock
@@ -258,6 +260,7 @@ describe('Bedrock', () => {
258260
expect(getGuardrailSpan.attributes[AWS_ATTRIBUTE_KEYS.AWS_BEDROCK_KNOWLEDGE_BASE_ID]).toBeUndefined();
259261
expect(getGuardrailSpan.attributes[AWS_ATTRIBUTE_KEYS.AWS_BEDROCK_DATA_SOURCE_ID]).toBeUndefined();
260262
expect(getGuardrailSpan.attributes[AWS_ATTRIBUTE_KEYS.AWS_BEDROCK_GUARDRAIL_ID]).toBe(dummyGuardrailIdentifier);
263+
expect(getGuardrailSpan.attributes[AWS_ATTRIBUTE_KEYS.AWS_BEDROCK_GUARDRAIL_ARN]).toBe(guardrailArn);
261264
expect(getGuardrailSpan.kind).toBe(SpanKind.CLIENT);
262265
});
263266
});

aws-distro-opentelemetry-node-autoinstrumentation/test/patches/instrumentation-patch.test.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ const _QUEUE_URL: string = 'https://sqs.us-east-1.amazonaws.com/123412341234/que
3838
const _BEDROCK_AGENT_ID: string = 'agentId';
3939
const _BEDROCK_DATASOURCE_ID: string = 'DataSourceId';
4040
const _BEDROCK_GUARDRAIL_ID: string = 'GuardrailId';
41+
const _BEDROCK_GUARDRAIL_ARN: string = 'arn:aws:bedrock:us-east-1:123456789012:guardrail/abc123';
4142
const _BEDROCK_KNOWLEDGEBASE_ID: string = 'KnowledgeBaseId';
4243
const _GEN_AI_SYSTEM: string = 'aws_bedrock';
4344
const _GEN_AI_REQUEST_MODEL: string = 'genAiReuqestModelId';
@@ -250,8 +251,11 @@ describe('InstrumentationPatchTest', () => {
250251
// Expect no-op from attribute extraction in Bedrock
251252
expect(Object.entries(bedrockAttributes).length).toEqual(0);
252253
const bedrockAttributesAfterResponse: Attributes = doResponseHookBedrock(services, 'Bedrock');
253-
expect(Object.entries(bedrockAttributesAfterResponse).length).toBe(1);
254+
expect(Object.entries(bedrockAttributesAfterResponse).length).toBe(2);
254255
expect(bedrockAttributesAfterResponse[AWS_ATTRIBUTE_KEYS.AWS_BEDROCK_GUARDRAIL_ID]).toEqual(_BEDROCK_GUARDRAIL_ID);
256+
expect(bedrockAttributesAfterResponse[AWS_ATTRIBUTE_KEYS.AWS_BEDROCK_GUARDRAIL_ARN]).toEqual(
257+
_BEDROCK_GUARDRAIL_ARN
258+
);
255259
});
256260

257261
it('Bedrock Agent with patching', () => {
@@ -519,6 +523,7 @@ describe('InstrumentationPatchTest', () => {
519523
dataSourceId: _BEDROCK_DATASOURCE_ID,
520524
knowledgeBaseId: _BEDROCK_KNOWLEDGEBASE_ID,
521525
guardrailId: _BEDROCK_GUARDRAIL_ID,
526+
guardrailArn: _BEDROCK_GUARDRAIL_ARN,
522527
modelId: _GEN_AI_REQUEST_MODEL,
523528
},
524529
request: {

0 commit comments

Comments
 (0)