@opentelemetry/instrumentation-aws-sdk 0.69.0 → 0.71.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/src/aws-sdk.js +1 -12
- package/build/src/aws-sdk.js.map +1 -1
- package/build/src/aws-sdk.types.js +1 -12
- package/build/src/aws-sdk.types.js.map +1 -1
- package/build/src/enums.js +1 -12
- package/build/src/enums.js.map +1 -1
- package/build/src/index.js +1 -12
- package/build/src/index.js.map +1 -1
- package/build/src/propwrap.js +1 -12
- package/build/src/propwrap.js.map +1 -1
- package/build/src/semconv-obsolete.js +1 -12
- package/build/src/semconv-obsolete.js.map +1 -1
- package/build/src/semconv.js +1 -12
- package/build/src/semconv.js.map +1 -1
- package/build/src/services/MessageAttributes.js +1 -12
- package/build/src/services/MessageAttributes.js.map +1 -1
- package/build/src/services/ServiceExtension.js.map +1 -1
- package/build/src/services/ServicesExtensions.js.map +1 -1
- package/build/src/services/bedrock-runtime.js +1 -12
- package/build/src/services/bedrock-runtime.js.map +1 -1
- package/build/src/services/dynamodb.js +1 -12
- package/build/src/services/dynamodb.js.map +1 -1
- package/build/src/services/index.js +1 -12
- package/build/src/services/index.js.map +1 -1
- package/build/src/services/kinesis.js +1 -12
- package/build/src/services/kinesis.js.map +1 -1
- package/build/src/services/lambda.js +1 -12
- package/build/src/services/lambda.js.map +1 -1
- package/build/src/services/s3.js +1 -12
- package/build/src/services/s3.js.map +1 -1
- package/build/src/services/secretsmanager.js +1 -12
- package/build/src/services/secretsmanager.js.map +1 -1
- package/build/src/services/sns.js +1 -12
- package/build/src/services/sns.js.map +1 -1
- package/build/src/services/sqs.js +1 -12
- package/build/src/services/sqs.js.map +1 -1
- package/build/src/services/stepfunctions.js +1 -12
- package/build/src/services/stepfunctions.js.map +1 -1
- package/build/src/types.js.map +1 -1
- package/build/src/utils.js +1 -12
- package/build/src/utils.js.map +1 -1
- package/build/src/version.d.ts +1 -1
- package/build/src/version.js +2 -13
- package/build/src/version.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServiceExtension.js","sourceRoot":"","sources":["../../../src/services/ServiceExtension.ts"],"names":[],"mappings":"","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n
|
|
1
|
+
{"version":3,"file":"ServiceExtension.js","sourceRoot":"","sources":["../../../src/services/ServiceExtension.ts"],"names":[],"mappings":"","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n DiagLogger,\n HrTime,\n Meter,\n Span,\n SpanAttributes,\n SpanKind,\n Tracer,\n} from '@opentelemetry/api';\nimport { SemconvStability } from '@opentelemetry/instrumentation';\nimport {\n AwsSdkInstrumentationConfig,\n NormalizedRequest,\n NormalizedResponse,\n} from '../types';\n\nexport interface RequestMetadata {\n // isIncoming - if true, then the operation callback / promise should be bind with the operation's span\n isIncoming: boolean;\n // isStream - if true, then the response is a stream so the span should not be ended by the middleware.\n // the ServiceExtension must end the span itself, generally by wrapping the stream and ending after it is\n // consumed.\n isStream?: boolean;\n spanAttributes?: SpanAttributes;\n spanKind?: SpanKind;\n spanName?: string;\n}\n\nexport interface ServiceExtension {\n // called before request is sent, and before span is started\n requestPreSpanHook: (\n request: NormalizedRequest,\n config: AwsSdkInstrumentationConfig,\n diag: DiagLogger,\n dbSemconvStability?: SemconvStability\n ) => RequestMetadata;\n\n // called before request is sent, and after span is started\n requestPostSpanHook?: (request: NormalizedRequest) => void;\n\n // called after response is received. If value is returned, it replaces the response output.\n responseHook?: (\n response: NormalizedResponse,\n span: Span,\n tracer: Tracer,\n config: AwsSdkInstrumentationConfig,\n startTime: HrTime\n ) => any | undefined;\n\n updateMetricInstruments?: (meter: Meter) => void;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServicesExtensions.js","sourceRoot":"","sources":["../../../src/services/ServicesExtensions.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"ServicesExtensions.js","sourceRoot":"","sources":["../../../src/services/ServicesExtensions.ts"],"names":[],"mappings":";;;AAOA,+BAA4C;AAM5C,uDAAmE;AACnE,yCAAsD;AACtD,qDAAkE;AAClE,+BAA4C;AAC5C,mDAAgE;AAChE,qCAAkD;AAClD,6BAA0C;AAC1C,uCAAoD;AAEpD,MAAa,kBAAkB;IAC7B,QAAQ,GAAkC,IAAI,GAAG,EAAE,CAAC;IAEpD;QACE,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAEO,gBAAgB;QACtB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,+CAA8B,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,6CAA6B,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,yBAAmB,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,yBAAmB,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,mCAAwB,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,+BAAsB,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,uBAAkB,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,iCAAuB,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,gDAA8B,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,kBAAkB,CAChB,OAA0B,EAC1B,MAAmC,EACnC,IAAgB,EAChB,kBAAqC;QAErC,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAChE,IAAI,CAAC,gBAAgB;YACnB,OAAO;gBACL,UAAU,EAAE,KAAK;aAClB,CAAC;QACJ,OAAO,gBAAgB,CAAC,kBAAkB,CACxC,OAAO,EACP,MAAM,EACN,IAAI,EACJ,kBAAkB,CACnB,CAAC;IACJ,CAAC;IAED,mBAAmB,CAAC,OAA0B;QAC5C,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAChE,IAAI,CAAC,gBAAgB,EAAE,mBAAmB;YAAE,OAAO;QACnD,OAAO,gBAAgB,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC;IAED,YAAY,CACV,QAA4B,EAC5B,IAAU,EACV,MAAc,EACd,MAAmC,EACnC,SAAiB;QAEjB,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAEzE,OAAO,gBAAgB,EAAE,YAAY,EAAE,CACrC,QAAQ,EACR,IAAI,EACJ,MAAM,EACN,MAAM,EACN,SAAS,CACV,CAAC;IACJ,CAAC;IAED,uBAAuB,CAAC,KAAY;QAClC,KAAK,MAAM,gBAAgB,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE;YACrD,gBAAgB,CAAC,uBAAuB,EAAE,CAAC,KAAK,CAAC,CAAC;SACnD;IACH,CAAC;CACF;AAnED,gDAmEC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { Tracer, Span, DiagLogger, Meter, HrTime } from '@opentelemetry/api';\nimport { SemconvStability } from '@opentelemetry/instrumentation';\nimport { ServiceExtension, RequestMetadata } from './ServiceExtension';\nimport { SqsServiceExtension } from './sqs';\nimport {\n AwsSdkInstrumentationConfig,\n NormalizedRequest,\n NormalizedResponse,\n} from '../types';\nimport { BedrockRuntimeServiceExtension } from './bedrock-runtime';\nimport { DynamodbServiceExtension } from './dynamodb';\nimport { SecretsManagerServiceExtension } from './secretsmanager';\nimport { SnsServiceExtension } from './sns';\nimport { StepFunctionsServiceExtension } from './stepfunctions';\nimport { LambdaServiceExtension } from './lambda';\nimport { S3ServiceExtension } from './s3';\nimport { KinesisServiceExtension } from './kinesis';\n\nexport class ServicesExtensions implements ServiceExtension {\n services: Map<string, ServiceExtension> = new Map();\n\n constructor() {\n this.registerServices();\n }\n\n private registerServices() {\n this.services.set('SecretsManager', new SecretsManagerServiceExtension());\n this.services.set('SFN', new StepFunctionsServiceExtension());\n this.services.set('SQS', new SqsServiceExtension());\n this.services.set('SNS', new SnsServiceExtension());\n this.services.set('DynamoDB', new DynamodbServiceExtension());\n this.services.set('Lambda', new LambdaServiceExtension());\n this.services.set('S3', new S3ServiceExtension());\n this.services.set('Kinesis', new KinesisServiceExtension());\n this.services.set('BedrockRuntime', new BedrockRuntimeServiceExtension());\n }\n\n requestPreSpanHook(\n request: NormalizedRequest,\n config: AwsSdkInstrumentationConfig,\n diag: DiagLogger,\n dbSemconvStability?: SemconvStability\n ): RequestMetadata {\n const serviceExtension = this.services.get(request.serviceName);\n if (!serviceExtension)\n return {\n isIncoming: false,\n };\n return serviceExtension.requestPreSpanHook(\n request,\n config,\n diag,\n dbSemconvStability\n );\n }\n\n requestPostSpanHook(request: NormalizedRequest) {\n const serviceExtension = this.services.get(request.serviceName);\n if (!serviceExtension?.requestPostSpanHook) return;\n return serviceExtension.requestPostSpanHook(request);\n }\n\n responseHook(\n response: NormalizedResponse,\n span: Span,\n tracer: Tracer,\n config: AwsSdkInstrumentationConfig,\n startTime: HrTime\n ) {\n const serviceExtension = this.services.get(response.request.serviceName);\n\n return serviceExtension?.responseHook?.(\n response,\n span,\n tracer,\n config,\n startTime\n );\n }\n\n updateMetricInstruments(meter: Meter) {\n for (const serviceExtension of this.services.values()) {\n serviceExtension.updateMetricInstruments?.(meter);\n }\n }\n}\n"]}
|
|
@@ -3,18 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.BedrockRuntimeServiceExtension = void 0;
|
|
4
4
|
/*
|
|
5
5
|
* Copyright The OpenTelemetry Authors
|
|
6
|
-
*
|
|
7
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
-
* you may not use this file except in compliance with the License.
|
|
9
|
-
* You may obtain a copy of the License at
|
|
10
|
-
*
|
|
11
|
-
* https://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
-
*
|
|
13
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
-
* See the License for the specific language governing permissions and
|
|
17
|
-
* limitations under the License.
|
|
6
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
18
7
|
*/
|
|
19
8
|
const api_1 = require("@opentelemetry/api");
|
|
20
9
|
const semconv_1 = require("../semconv");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bedrock-runtime.js","sourceRoot":"","sources":["../../../src/services/bedrock-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n Attributes,\n DiagLogger,\n diag,\n Histogram,\n HrTime,\n Meter,\n Span,\n Tracer,\n ValueType,\n} from '@opentelemetry/api';\nimport { RequestMetadata, ServiceExtension } from './ServiceExtension';\nimport {\n ATTR_GEN_AI_SYSTEM,\n ATTR_GEN_AI_OPERATION_NAME,\n ATTR_GEN_AI_REQUEST_MODEL,\n ATTR_GEN_AI_REQUEST_MAX_TOKENS,\n ATTR_GEN_AI_REQUEST_TEMPERATURE,\n ATTR_GEN_AI_REQUEST_TOP_P,\n ATTR_GEN_AI_REQUEST_STOP_SEQUENCES,\n ATTR_GEN_AI_TOKEN_TYPE,\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n ATTR_GEN_AI_RESPONSE_FINISH_REASONS,\n GEN_AI_OPERATION_NAME_VALUE_CHAT,\n GEN_AI_SYSTEM_VALUE_AWS_BEDROCK,\n GEN_AI_TOKEN_TYPE_VALUE_INPUT,\n GEN_AI_TOKEN_TYPE_VALUE_OUTPUT,\n METRIC_GEN_AI_CLIENT_OPERATION_DURATION,\n METRIC_GEN_AI_CLIENT_TOKEN_USAGE,\n} from '../semconv';\nimport {\n AwsSdkInstrumentationConfig,\n NormalizedRequest,\n NormalizedResponse,\n} from '../types';\nimport type {\n ConverseStreamOutput,\n TokenUsage,\n} from '@aws-sdk/client-bedrock-runtime';\nimport {\n hrTime,\n hrTimeDuration,\n hrTimeToMilliseconds,\n} from '@opentelemetry/core';\n\nexport class BedrockRuntimeServiceExtension implements ServiceExtension {\n private tokenUsage!: Histogram;\n private operationDuration!: Histogram;\n private _diag: DiagLogger = diag;\n\n updateMetricInstruments(meter: Meter) {\n // https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-metrics/#metric-gen_aiclienttokenusage\n this.tokenUsage = meter.createHistogram(METRIC_GEN_AI_CLIENT_TOKEN_USAGE, {\n unit: '{token}',\n description: 'Measures number of input and output tokens used',\n valueType: ValueType.INT,\n advice: {\n explicitBucketBoundaries: [\n 1, 4, 16, 64, 256, 1024, 4096, 16384, 65536, 262144, 1048576, 4194304,\n 16777216, 67108864,\n ],\n },\n });\n\n // https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-metrics/#metric-gen_aiclientoperationduration\n this.operationDuration = meter.createHistogram(\n METRIC_GEN_AI_CLIENT_OPERATION_DURATION,\n {\n unit: 's',\n description: 'GenAI operation duration',\n advice: {\n explicitBucketBoundaries: [\n 0.01, 0.02, 0.04, 0.08, 0.16, 0.32, 0.64, 1.28, 2.56, 5.12, 10.24,\n 20.48, 40.96, 81.92,\n ],\n },\n }\n );\n }\n\n requestPreSpanHook(\n request: NormalizedRequest,\n config: AwsSdkInstrumentationConfig,\n diag: DiagLogger\n ): RequestMetadata {\n switch (request.commandName) {\n case 'Converse':\n return this.requestPreSpanHookConverse(request, config, diag, false);\n case 'ConverseStream':\n return this.requestPreSpanHookConverse(request, config, diag, true);\n case 'InvokeModel':\n return this.requestPreSpanHookInvokeModel(request, config, diag, false);\n case 'InvokeModelWithResponseStream':\n return this.requestPreSpanHookInvokeModel(request, config, diag, true);\n }\n\n return {\n isIncoming: false,\n };\n }\n\n private requestPreSpanHookConverse(\n request: NormalizedRequest,\n config: AwsSdkInstrumentationConfig,\n diag: DiagLogger,\n isStream: boolean\n ): RequestMetadata {\n let spanName = GEN_AI_OPERATION_NAME_VALUE_CHAT;\n const spanAttributes: Attributes = {\n [ATTR_GEN_AI_SYSTEM]: GEN_AI_SYSTEM_VALUE_AWS_BEDROCK,\n [ATTR_GEN_AI_OPERATION_NAME]: GEN_AI_OPERATION_NAME_VALUE_CHAT,\n };\n\n const modelId = request.commandInput.modelId;\n if (modelId) {\n spanAttributes[ATTR_GEN_AI_REQUEST_MODEL] = modelId;\n if (spanName) {\n spanName += ` ${modelId}`;\n }\n }\n\n const inferenceConfig = request.commandInput.inferenceConfig;\n if (inferenceConfig) {\n const { maxTokens, temperature, topP, stopSequences } = inferenceConfig;\n if (maxTokens !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] = maxTokens;\n }\n if (temperature !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] = temperature;\n }\n if (topP !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TOP_P] = topP;\n }\n if (stopSequences !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] = stopSequences;\n }\n }\n\n return {\n spanName,\n isIncoming: false,\n isStream,\n spanAttributes,\n };\n }\n\n private requestPreSpanHookInvokeModel(\n request: NormalizedRequest,\n config: AwsSdkInstrumentationConfig,\n diag: DiagLogger,\n isStream: boolean\n ): RequestMetadata {\n let spanName: string | undefined;\n const spanAttributes: Attributes = {\n [ATTR_GEN_AI_SYSTEM]: GEN_AI_SYSTEM_VALUE_AWS_BEDROCK,\n // add operation name for InvokeModel API\n };\n\n const modelId = request.commandInput?.modelId;\n if (modelId) {\n spanAttributes[ATTR_GEN_AI_REQUEST_MODEL] = modelId;\n }\n\n if (request.commandInput?.body) {\n const requestBody = JSON.parse(request.commandInput.body);\n if (modelId.includes('amazon.titan')) {\n if (requestBody.textGenerationConfig?.temperature !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] =\n requestBody.textGenerationConfig.temperature;\n }\n if (requestBody.textGenerationConfig?.topP !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TOP_P] =\n requestBody.textGenerationConfig.topP;\n }\n if (requestBody.textGenerationConfig?.maxTokenCount !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] =\n requestBody.textGenerationConfig.maxTokenCount;\n }\n if (requestBody.textGenerationConfig?.stopSequences !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] =\n requestBody.textGenerationConfig.stopSequences;\n }\n } else if (modelId.includes('amazon.nova')) {\n if (requestBody.inferenceConfig?.temperature !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] =\n requestBody.inferenceConfig.temperature;\n }\n if (requestBody.inferenceConfig?.top_p !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TOP_P] =\n requestBody.inferenceConfig.top_p;\n }\n if (requestBody.inferenceConfig?.max_new_tokens !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] =\n requestBody.inferenceConfig.max_new_tokens;\n }\n if (requestBody.inferenceConfig?.stopSequences !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] =\n requestBody.inferenceConfig.stopSequences;\n }\n } else if (modelId.includes('anthropic.claude')) {\n if (requestBody.max_tokens !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] =\n requestBody.max_tokens;\n }\n if (requestBody.temperature !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] =\n requestBody.temperature;\n }\n if (requestBody.top_p !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TOP_P] = requestBody.top_p;\n }\n if (requestBody.stop_sequences !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] =\n requestBody.stop_sequences;\n }\n } else if (modelId.includes('meta.llama')) {\n if (requestBody.max_gen_len !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] =\n requestBody.max_gen_len;\n }\n if (requestBody.temperature !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] =\n requestBody.temperature;\n }\n if (requestBody.top_p !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TOP_P] = requestBody.top_p;\n }\n // request for meta llama models does not contain stop_sequences field\n } else if (modelId.includes('cohere.command-r')) {\n if (requestBody.max_tokens !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] =\n requestBody.max_tokens;\n }\n if (requestBody.temperature !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] =\n requestBody.temperature;\n }\n if (requestBody.p !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TOP_P] = requestBody.p;\n }\n if (requestBody.message !== undefined) {\n // NOTE: We approximate the token count since this value is not directly available in the body\n // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.\n // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html\n spanAttributes[ATTR_GEN_AI_USAGE_INPUT_TOKENS] = Math.ceil(\n requestBody.message.length / 6\n );\n }\n if (requestBody.stop_sequences !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] =\n requestBody.stop_sequences;\n }\n } else if (modelId.includes('cohere.command')) {\n if (requestBody.max_tokens !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] =\n requestBody.max_tokens;\n }\n if (requestBody.temperature !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] =\n requestBody.temperature;\n }\n if (requestBody.p !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TOP_P] = requestBody.p;\n }\n if (requestBody.prompt !== undefined) {\n // NOTE: We approximate the token count since this value is not directly available in the body\n // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.\n // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html\n spanAttributes[ATTR_GEN_AI_USAGE_INPUT_TOKENS] = Math.ceil(\n requestBody.prompt.length / 6\n );\n }\n if (requestBody.stop_sequences !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] =\n requestBody.stop_sequences;\n }\n } else if (modelId.includes('mistral')) {\n if (requestBody.prompt !== undefined) {\n // NOTE: We approximate the token count since this value is not directly available in the body\n // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.\n // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html\n spanAttributes[ATTR_GEN_AI_USAGE_INPUT_TOKENS] = Math.ceil(\n requestBody.prompt.length / 6\n );\n }\n if (requestBody.max_tokens !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] =\n requestBody.max_tokens;\n }\n if (requestBody.temperature !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] =\n requestBody.temperature;\n }\n if (requestBody.top_p !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TOP_P] = requestBody.top_p;\n }\n if (requestBody.stop !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] = requestBody.stop;\n }\n }\n }\n\n return {\n spanName,\n isIncoming: false,\n isStream,\n spanAttributes,\n };\n }\n\n responseHook(\n response: NormalizedResponse,\n span: Span,\n tracer: Tracer,\n config: AwsSdkInstrumentationConfig,\n startTime: HrTime\n ) {\n if (!span.isRecording()) {\n return;\n }\n\n switch (response.request.commandName) {\n case 'Converse':\n return this.responseHookConverse(\n response,\n span,\n tracer,\n config,\n startTime\n );\n case 'ConverseStream':\n return this.responseHookConverseStream(\n response,\n span,\n tracer,\n config,\n startTime\n );\n case 'InvokeModel':\n return this.responseHookInvokeModel(response, span, tracer, config);\n case 'InvokeModelWithResponseStream':\n return this.responseHookInvokeModelWithResponseStream(\n response,\n span,\n tracer,\n config\n );\n }\n }\n\n private responseHookConverse(\n response: NormalizedResponse,\n span: Span,\n tracer: Tracer,\n config: AwsSdkInstrumentationConfig,\n startTime: HrTime\n ) {\n const { stopReason, usage } = response.data;\n\n BedrockRuntimeServiceExtension.setStopReason(span, stopReason);\n this.setUsage(response, span, usage, startTime);\n }\n\n private responseHookConverseStream(\n response: NormalizedResponse,\n span: Span,\n tracer: Tracer,\n config: AwsSdkInstrumentationConfig,\n startTime: HrTime\n ) {\n return {\n ...response.data,\n // Wrap and replace the response stream to allow processing events to telemetry\n // before yielding to the user.\n stream: this.wrapConverseStreamResponse(\n response,\n response.data.stream,\n span,\n startTime\n ),\n };\n }\n\n private async *wrapConverseStreamResponse(\n response: NormalizedResponse,\n stream: AsyncIterable<ConverseStreamOutput>,\n span: Span,\n startTime: HrTime\n ) {\n try {\n let usage: TokenUsage | undefined;\n for await (const item of stream) {\n BedrockRuntimeServiceExtension.setStopReason(\n span,\n item.messageStop?.stopReason\n );\n usage = item.metadata?.usage;\n yield item;\n }\n this.setUsage(response, span, usage, startTime);\n } finally {\n span.end();\n }\n }\n\n private static setStopReason(span: Span, stopReason: string | undefined) {\n if (stopReason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [stopReason]);\n }\n }\n\n private setUsage(\n response: NormalizedResponse,\n span: Span,\n usage: TokenUsage | undefined,\n startTime: HrTime\n ) {\n const sharedMetricAttrs: Attributes = {\n [ATTR_GEN_AI_SYSTEM]: GEN_AI_SYSTEM_VALUE_AWS_BEDROCK,\n [ATTR_GEN_AI_OPERATION_NAME]: GEN_AI_OPERATION_NAME_VALUE_CHAT,\n [ATTR_GEN_AI_REQUEST_MODEL]: response.request.commandInput.modelId,\n };\n\n const durationSecs =\n hrTimeToMilliseconds(hrTimeDuration(startTime, hrTime())) / 1000;\n this.operationDuration.record(durationSecs, sharedMetricAttrs);\n\n if (usage) {\n const { inputTokens, outputTokens } = usage;\n if (inputTokens !== undefined) {\n span.setAttribute(ATTR_GEN_AI_USAGE_INPUT_TOKENS, inputTokens);\n\n this.tokenUsage.record(inputTokens, {\n ...sharedMetricAttrs,\n [ATTR_GEN_AI_TOKEN_TYPE]: GEN_AI_TOKEN_TYPE_VALUE_INPUT,\n });\n }\n if (outputTokens !== undefined) {\n span.setAttribute(ATTR_GEN_AI_USAGE_OUTPUT_TOKENS, outputTokens);\n\n this.tokenUsage.record(outputTokens, {\n ...sharedMetricAttrs,\n [ATTR_GEN_AI_TOKEN_TYPE]: GEN_AI_TOKEN_TYPE_VALUE_OUTPUT,\n });\n }\n }\n }\n\n private responseHookInvokeModel(\n response: NormalizedResponse,\n span: Span,\n tracer: Tracer,\n config: AwsSdkInstrumentationConfig\n ) {\n const currentModelId = response.request.commandInput?.modelId;\n if (response.data?.body) {\n const decodedResponseBody = new TextDecoder().decode(response.data.body);\n const responseBody = JSON.parse(decodedResponseBody);\n if (currentModelId.includes('amazon.titan')) {\n if (responseBody.inputTextTokenCount !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n responseBody.inputTextTokenCount\n );\n }\n if (responseBody.results?.[0]?.tokenCount !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n responseBody.results[0].tokenCount\n );\n }\n if (responseBody.results?.[0]?.completionReason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n responseBody.results[0].completionReason,\n ]);\n }\n } else if (currentModelId.includes('amazon.nova')) {\n if (responseBody.usage !== undefined) {\n if (responseBody.usage.inputTokens !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n responseBody.usage.inputTokens\n );\n }\n if (responseBody.usage.outputTokens !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n responseBody.usage.outputTokens\n );\n }\n }\n if (responseBody.stopReason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n responseBody.stopReason,\n ]);\n }\n } else if (currentModelId.includes('anthropic.claude')) {\n if (responseBody.usage?.input_tokens !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n responseBody.usage.input_tokens\n );\n }\n if (responseBody.usage?.output_tokens !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n responseBody.usage.output_tokens\n );\n }\n if (responseBody.stop_reason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n responseBody.stop_reason,\n ]);\n }\n } else if (currentModelId.includes('meta.llama')) {\n if (responseBody.prompt_token_count !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n responseBody.prompt_token_count\n );\n }\n if (responseBody.generation_token_count !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n responseBody.generation_token_count\n );\n }\n if (responseBody.stop_reason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n responseBody.stop_reason,\n ]);\n }\n } else if (currentModelId.includes('cohere.command-r')) {\n if (responseBody.text !== undefined) {\n // NOTE: We approximate the token count since this value is not directly available in the body\n // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.\n // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n Math.ceil(responseBody.text.length / 6)\n );\n }\n if (responseBody.finish_reason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n responseBody.finish_reason,\n ]);\n }\n } else if (currentModelId.includes('cohere.command')) {\n if (responseBody.generations?.[0]?.text !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n // NOTE: We approximate the token count since this value is not directly available in the body\n // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.\n // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html\n Math.ceil(responseBody.generations[0].text.length / 6)\n );\n }\n if (responseBody.generations?.[0]?.finish_reason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n responseBody.generations[0].finish_reason,\n ]);\n }\n } else if (currentModelId.includes('mistral')) {\n if (responseBody.outputs?.[0]?.text !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n // NOTE: We approximate the token count since this value is not directly available in the body\n // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.\n // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html\n Math.ceil(responseBody.outputs[0].text.length / 6)\n );\n }\n if (responseBody.outputs?.[0]?.stop_reason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n responseBody.outputs[0].stop_reason,\n ]);\n }\n }\n }\n }\n\n private async responseHookInvokeModelWithResponseStream(\n response: NormalizedResponse,\n span: Span,\n tracer: Tracer,\n config: AwsSdkInstrumentationConfig\n ): Promise<any> {\n const stream = response.data?.body;\n const modelId = response.request.commandInput?.modelId;\n if (!stream || !modelId) return;\n\n // Replace the original response body with our instrumented stream.\n // - Defers span.end() until the entire stream is consumed\n // This ensures downstream consumers still receive the full stream correctly,\n // while OpenTelemetry can record span attributes from streamed data.\n response.data.body = async function* (\n this: BedrockRuntimeServiceExtension\n ) {\n try {\n for await (const chunk of stream) {\n const parsedChunk = this.parseChunk(chunk?.chunk?.bytes);\n\n if (!parsedChunk) {\n // pass through\n } else if (modelId.includes('amazon.titan')) {\n BedrockRuntimeServiceExtension.recordTitanAttributes(\n parsedChunk,\n span\n );\n } else if (modelId.includes('anthropic.claude')) {\n BedrockRuntimeServiceExtension.recordClaudeAttributes(\n parsedChunk,\n span\n );\n } else if (modelId.includes('amazon.nova')) {\n BedrockRuntimeServiceExtension.recordNovaAttributes(\n parsedChunk,\n span\n );\n } else if (modelId.includes('meta.llama')) {\n BedrockRuntimeServiceExtension.recordLlamaAttributes(\n parsedChunk,\n span\n );\n } else if (modelId.includes('cohere.command-r')) {\n BedrockRuntimeServiceExtension.recordCohereRAttributes(\n parsedChunk,\n span\n );\n } else if (modelId.includes('cohere.command')) {\n BedrockRuntimeServiceExtension.recordCohereAttributes(\n parsedChunk,\n span\n );\n } else if (modelId.includes('mistral')) {\n BedrockRuntimeServiceExtension.recordMistralAttributes(\n parsedChunk,\n span\n );\n }\n yield chunk;\n }\n } finally {\n span.end();\n }\n }.bind(this)();\n return response.data;\n }\n\n private parseChunk(bytes?: Uint8Array): any {\n if (!bytes || !(bytes instanceof Uint8Array)) return null;\n try {\n const str = Buffer.from(bytes).toString('utf-8');\n return JSON.parse(str);\n } catch (err) {\n this._diag.warn('Failed to parse streamed chunk', err);\n return null;\n }\n }\n\n private static recordNovaAttributes(parsedChunk: any, span: Span) {\n if (parsedChunk.metadata?.usage !== undefined) {\n if (parsedChunk.metadata?.usage.inputTokens !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n parsedChunk.metadata.usage.inputTokens\n );\n }\n if (parsedChunk.metadata?.usage.outputTokens !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n parsedChunk.metadata.usage.outputTokens\n );\n }\n }\n if (parsedChunk.messageStop?.stopReason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n parsedChunk.messageStop.stopReason,\n ]);\n }\n }\n\n private static recordClaudeAttributes(parsedChunk: any, span: Span) {\n if (parsedChunk.message?.usage?.input_tokens !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n parsedChunk.message.usage.input_tokens\n );\n }\n if (parsedChunk.message?.usage?.output_tokens !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n parsedChunk.message.usage.output_tokens\n );\n }\n if (parsedChunk.delta?.stop_reason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n parsedChunk.delta.stop_reason,\n ]);\n }\n }\n\n private static recordTitanAttributes(parsedChunk: any, span: Span) {\n if (parsedChunk.inputTextTokenCount !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n parsedChunk.inputTextTokenCount\n );\n }\n if (parsedChunk.totalOutputTextTokenCount !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n parsedChunk.totalOutputTextTokenCount\n );\n }\n if (parsedChunk.completionReason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n parsedChunk.completionReason,\n ]);\n }\n }\n private static recordLlamaAttributes(parsedChunk: any, span: Span) {\n if (parsedChunk.prompt_token_count !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n parsedChunk.prompt_token_count\n );\n }\n if (parsedChunk.generation_token_count !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n parsedChunk.generation_token_count\n );\n }\n if (parsedChunk.stop_reason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n parsedChunk.stop_reason,\n ]);\n }\n }\n\n private static recordMistralAttributes(parsedChunk: any, span: Span) {\n if (parsedChunk.outputs?.[0]?.text !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n // NOTE: We approximate the token count since this value is not directly available in the body\n // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.\n // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html\n Math.ceil(parsedChunk.outputs[0].text.length / 6)\n );\n }\n if (parsedChunk.outputs?.[0]?.stop_reason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n parsedChunk.outputs[0].stop_reason,\n ]);\n }\n }\n\n private static recordCohereAttributes(parsedChunk: any, span: Span) {\n if (parsedChunk.generations?.[0]?.text !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n // NOTE: We approximate the token count since this value is not directly available in the body\n // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.\n // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html\n Math.ceil(parsedChunk.generations[0].text.length / 6)\n );\n }\n if (parsedChunk.generations?.[0]?.finish_reason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n parsedChunk.generations[0].finish_reason,\n ]);\n }\n }\n\n private static recordCohereRAttributes(parsedChunk: any, span: Span) {\n if (parsedChunk.text !== undefined) {\n // NOTE: We approximate the token count since this value is not directly available in the body\n // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.\n // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n Math.ceil(parsedChunk.text.length / 6)\n );\n }\n if (parsedChunk.finish_reason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n parsedChunk.finish_reason,\n ]);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"bedrock-runtime.js","sourceRoot":"","sources":["../../../src/services/bedrock-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n Attributes,\n DiagLogger,\n diag,\n Histogram,\n HrTime,\n Meter,\n Span,\n Tracer,\n ValueType,\n} from '@opentelemetry/api';\nimport { RequestMetadata, ServiceExtension } from './ServiceExtension';\nimport {\n ATTR_GEN_AI_SYSTEM,\n ATTR_GEN_AI_OPERATION_NAME,\n ATTR_GEN_AI_REQUEST_MODEL,\n ATTR_GEN_AI_REQUEST_MAX_TOKENS,\n ATTR_GEN_AI_REQUEST_TEMPERATURE,\n ATTR_GEN_AI_REQUEST_TOP_P,\n ATTR_GEN_AI_REQUEST_STOP_SEQUENCES,\n ATTR_GEN_AI_TOKEN_TYPE,\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n ATTR_GEN_AI_RESPONSE_FINISH_REASONS,\n GEN_AI_OPERATION_NAME_VALUE_CHAT,\n GEN_AI_SYSTEM_VALUE_AWS_BEDROCK,\n GEN_AI_TOKEN_TYPE_VALUE_INPUT,\n GEN_AI_TOKEN_TYPE_VALUE_OUTPUT,\n METRIC_GEN_AI_CLIENT_OPERATION_DURATION,\n METRIC_GEN_AI_CLIENT_TOKEN_USAGE,\n} from '../semconv';\nimport {\n AwsSdkInstrumentationConfig,\n NormalizedRequest,\n NormalizedResponse,\n} from '../types';\nimport type {\n ConverseStreamOutput,\n TokenUsage,\n} from '@aws-sdk/client-bedrock-runtime';\nimport {\n hrTime,\n hrTimeDuration,\n hrTimeToMilliseconds,\n} from '@opentelemetry/core';\n\nexport class BedrockRuntimeServiceExtension implements ServiceExtension {\n private tokenUsage!: Histogram;\n private operationDuration!: Histogram;\n private _diag: DiagLogger = diag;\n\n updateMetricInstruments(meter: Meter) {\n // https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-metrics/#metric-gen_aiclienttokenusage\n this.tokenUsage = meter.createHistogram(METRIC_GEN_AI_CLIENT_TOKEN_USAGE, {\n unit: '{token}',\n description: 'Measures number of input and output tokens used',\n valueType: ValueType.INT,\n advice: {\n explicitBucketBoundaries: [\n 1, 4, 16, 64, 256, 1024, 4096, 16384, 65536, 262144, 1048576, 4194304,\n 16777216, 67108864,\n ],\n },\n });\n\n // https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-metrics/#metric-gen_aiclientoperationduration\n this.operationDuration = meter.createHistogram(\n METRIC_GEN_AI_CLIENT_OPERATION_DURATION,\n {\n unit: 's',\n description: 'GenAI operation duration',\n advice: {\n explicitBucketBoundaries: [\n 0.01, 0.02, 0.04, 0.08, 0.16, 0.32, 0.64, 1.28, 2.56, 5.12, 10.24,\n 20.48, 40.96, 81.92,\n ],\n },\n }\n );\n }\n\n requestPreSpanHook(\n request: NormalizedRequest,\n config: AwsSdkInstrumentationConfig,\n diag: DiagLogger\n ): RequestMetadata {\n switch (request.commandName) {\n case 'Converse':\n return this.requestPreSpanHookConverse(request, config, diag, false);\n case 'ConverseStream':\n return this.requestPreSpanHookConverse(request, config, diag, true);\n case 'InvokeModel':\n return this.requestPreSpanHookInvokeModel(request, config, diag, false);\n case 'InvokeModelWithResponseStream':\n return this.requestPreSpanHookInvokeModel(request, config, diag, true);\n }\n\n return {\n isIncoming: false,\n };\n }\n\n private requestPreSpanHookConverse(\n request: NormalizedRequest,\n config: AwsSdkInstrumentationConfig,\n diag: DiagLogger,\n isStream: boolean\n ): RequestMetadata {\n let spanName = GEN_AI_OPERATION_NAME_VALUE_CHAT;\n const spanAttributes: Attributes = {\n [ATTR_GEN_AI_SYSTEM]: GEN_AI_SYSTEM_VALUE_AWS_BEDROCK,\n [ATTR_GEN_AI_OPERATION_NAME]: GEN_AI_OPERATION_NAME_VALUE_CHAT,\n };\n\n const modelId = request.commandInput.modelId;\n if (modelId) {\n spanAttributes[ATTR_GEN_AI_REQUEST_MODEL] = modelId;\n if (spanName) {\n spanName += ` ${modelId}`;\n }\n }\n\n const inferenceConfig = request.commandInput.inferenceConfig;\n if (inferenceConfig) {\n const { maxTokens, temperature, topP, stopSequences } = inferenceConfig;\n if (maxTokens !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] = maxTokens;\n }\n if (temperature !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] = temperature;\n }\n if (topP !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TOP_P] = topP;\n }\n if (stopSequences !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] = stopSequences;\n }\n }\n\n return {\n spanName,\n isIncoming: false,\n isStream,\n spanAttributes,\n };\n }\n\n private requestPreSpanHookInvokeModel(\n request: NormalizedRequest,\n config: AwsSdkInstrumentationConfig,\n diag: DiagLogger,\n isStream: boolean\n ): RequestMetadata {\n let spanName: string | undefined;\n const spanAttributes: Attributes = {\n [ATTR_GEN_AI_SYSTEM]: GEN_AI_SYSTEM_VALUE_AWS_BEDROCK,\n // add operation name for InvokeModel API\n };\n\n const modelId = request.commandInput?.modelId;\n if (modelId) {\n spanAttributes[ATTR_GEN_AI_REQUEST_MODEL] = modelId;\n }\n\n if (request.commandInput?.body) {\n const requestBody = JSON.parse(request.commandInput.body);\n if (modelId.includes('amazon.titan')) {\n if (requestBody.textGenerationConfig?.temperature !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] =\n requestBody.textGenerationConfig.temperature;\n }\n if (requestBody.textGenerationConfig?.topP !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TOP_P] =\n requestBody.textGenerationConfig.topP;\n }\n if (requestBody.textGenerationConfig?.maxTokenCount !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] =\n requestBody.textGenerationConfig.maxTokenCount;\n }\n if (requestBody.textGenerationConfig?.stopSequences !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] =\n requestBody.textGenerationConfig.stopSequences;\n }\n } else if (modelId.includes('amazon.nova')) {\n if (requestBody.inferenceConfig?.temperature !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] =\n requestBody.inferenceConfig.temperature;\n }\n if (requestBody.inferenceConfig?.top_p !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TOP_P] =\n requestBody.inferenceConfig.top_p;\n }\n if (requestBody.inferenceConfig?.max_new_tokens !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] =\n requestBody.inferenceConfig.max_new_tokens;\n }\n if (requestBody.inferenceConfig?.stopSequences !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] =\n requestBody.inferenceConfig.stopSequences;\n }\n } else if (modelId.includes('anthropic.claude')) {\n if (requestBody.max_tokens !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] =\n requestBody.max_tokens;\n }\n if (requestBody.temperature !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] =\n requestBody.temperature;\n }\n if (requestBody.top_p !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TOP_P] = requestBody.top_p;\n }\n if (requestBody.stop_sequences !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] =\n requestBody.stop_sequences;\n }\n } else if (modelId.includes('meta.llama')) {\n if (requestBody.max_gen_len !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] =\n requestBody.max_gen_len;\n }\n if (requestBody.temperature !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] =\n requestBody.temperature;\n }\n if (requestBody.top_p !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TOP_P] = requestBody.top_p;\n }\n // request for meta llama models does not contain stop_sequences field\n } else if (modelId.includes('cohere.command-r')) {\n if (requestBody.max_tokens !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] =\n requestBody.max_tokens;\n }\n if (requestBody.temperature !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] =\n requestBody.temperature;\n }\n if (requestBody.p !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TOP_P] = requestBody.p;\n }\n if (requestBody.message !== undefined) {\n // NOTE: We approximate the token count since this value is not directly available in the body\n // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.\n // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html\n spanAttributes[ATTR_GEN_AI_USAGE_INPUT_TOKENS] = Math.ceil(\n requestBody.message.length / 6\n );\n }\n if (requestBody.stop_sequences !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] =\n requestBody.stop_sequences;\n }\n } else if (modelId.includes('cohere.command')) {\n if (requestBody.max_tokens !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] =\n requestBody.max_tokens;\n }\n if (requestBody.temperature !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] =\n requestBody.temperature;\n }\n if (requestBody.p !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TOP_P] = requestBody.p;\n }\n if (requestBody.prompt !== undefined) {\n // NOTE: We approximate the token count since this value is not directly available in the body\n // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.\n // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html\n spanAttributes[ATTR_GEN_AI_USAGE_INPUT_TOKENS] = Math.ceil(\n requestBody.prompt.length / 6\n );\n }\n if (requestBody.stop_sequences !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] =\n requestBody.stop_sequences;\n }\n } else if (modelId.includes('mistral')) {\n if (requestBody.prompt !== undefined) {\n // NOTE: We approximate the token count since this value is not directly available in the body\n // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.\n // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html\n spanAttributes[ATTR_GEN_AI_USAGE_INPUT_TOKENS] = Math.ceil(\n requestBody.prompt.length / 6\n );\n }\n if (requestBody.max_tokens !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] =\n requestBody.max_tokens;\n }\n if (requestBody.temperature !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] =\n requestBody.temperature;\n }\n if (requestBody.top_p !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_TOP_P] = requestBody.top_p;\n }\n if (requestBody.stop !== undefined) {\n spanAttributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] = requestBody.stop;\n }\n }\n }\n\n return {\n spanName,\n isIncoming: false,\n isStream,\n spanAttributes,\n };\n }\n\n responseHook(\n response: NormalizedResponse,\n span: Span,\n tracer: Tracer,\n config: AwsSdkInstrumentationConfig,\n startTime: HrTime\n ) {\n if (!span.isRecording()) {\n return;\n }\n\n switch (response.request.commandName) {\n case 'Converse':\n return this.responseHookConverse(\n response,\n span,\n tracer,\n config,\n startTime\n );\n case 'ConverseStream':\n return this.responseHookConverseStream(\n response,\n span,\n tracer,\n config,\n startTime\n );\n case 'InvokeModel':\n return this.responseHookInvokeModel(response, span, tracer, config);\n case 'InvokeModelWithResponseStream':\n return this.responseHookInvokeModelWithResponseStream(\n response,\n span,\n tracer,\n config\n );\n }\n }\n\n private responseHookConverse(\n response: NormalizedResponse,\n span: Span,\n tracer: Tracer,\n config: AwsSdkInstrumentationConfig,\n startTime: HrTime\n ) {\n const { stopReason, usage } = response.data;\n\n BedrockRuntimeServiceExtension.setStopReason(span, stopReason);\n this.setUsage(response, span, usage, startTime);\n }\n\n private responseHookConverseStream(\n response: NormalizedResponse,\n span: Span,\n tracer: Tracer,\n config: AwsSdkInstrumentationConfig,\n startTime: HrTime\n ) {\n return {\n ...response.data,\n // Wrap and replace the response stream to allow processing events to telemetry\n // before yielding to the user.\n stream: this.wrapConverseStreamResponse(\n response,\n response.data.stream,\n span,\n startTime\n ),\n };\n }\n\n private async *wrapConverseStreamResponse(\n response: NormalizedResponse,\n stream: AsyncIterable<ConverseStreamOutput>,\n span: Span,\n startTime: HrTime\n ) {\n try {\n let usage: TokenUsage | undefined;\n for await (const item of stream) {\n BedrockRuntimeServiceExtension.setStopReason(\n span,\n item.messageStop?.stopReason\n );\n usage = item.metadata?.usage;\n yield item;\n }\n this.setUsage(response, span, usage, startTime);\n } finally {\n span.end();\n }\n }\n\n private static setStopReason(span: Span, stopReason: string | undefined) {\n if (stopReason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [stopReason]);\n }\n }\n\n private setUsage(\n response: NormalizedResponse,\n span: Span,\n usage: TokenUsage | undefined,\n startTime: HrTime\n ) {\n const sharedMetricAttrs: Attributes = {\n [ATTR_GEN_AI_SYSTEM]: GEN_AI_SYSTEM_VALUE_AWS_BEDROCK,\n [ATTR_GEN_AI_OPERATION_NAME]: GEN_AI_OPERATION_NAME_VALUE_CHAT,\n [ATTR_GEN_AI_REQUEST_MODEL]: response.request.commandInput.modelId,\n };\n\n const durationSecs =\n hrTimeToMilliseconds(hrTimeDuration(startTime, hrTime())) / 1000;\n this.operationDuration.record(durationSecs, sharedMetricAttrs);\n\n if (usage) {\n const { inputTokens, outputTokens } = usage;\n if (inputTokens !== undefined) {\n span.setAttribute(ATTR_GEN_AI_USAGE_INPUT_TOKENS, inputTokens);\n\n this.tokenUsage.record(inputTokens, {\n ...sharedMetricAttrs,\n [ATTR_GEN_AI_TOKEN_TYPE]: GEN_AI_TOKEN_TYPE_VALUE_INPUT,\n });\n }\n if (outputTokens !== undefined) {\n span.setAttribute(ATTR_GEN_AI_USAGE_OUTPUT_TOKENS, outputTokens);\n\n this.tokenUsage.record(outputTokens, {\n ...sharedMetricAttrs,\n [ATTR_GEN_AI_TOKEN_TYPE]: GEN_AI_TOKEN_TYPE_VALUE_OUTPUT,\n });\n }\n }\n }\n\n private responseHookInvokeModel(\n response: NormalizedResponse,\n span: Span,\n tracer: Tracer,\n config: AwsSdkInstrumentationConfig\n ) {\n const currentModelId = response.request.commandInput?.modelId;\n if (response.data?.body) {\n const decodedResponseBody = new TextDecoder().decode(response.data.body);\n const responseBody = JSON.parse(decodedResponseBody);\n if (currentModelId.includes('amazon.titan')) {\n if (responseBody.inputTextTokenCount !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n responseBody.inputTextTokenCount\n );\n }\n if (responseBody.results?.[0]?.tokenCount !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n responseBody.results[0].tokenCount\n );\n }\n if (responseBody.results?.[0]?.completionReason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n responseBody.results[0].completionReason,\n ]);\n }\n } else if (currentModelId.includes('amazon.nova')) {\n if (responseBody.usage !== undefined) {\n if (responseBody.usage.inputTokens !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n responseBody.usage.inputTokens\n );\n }\n if (responseBody.usage.outputTokens !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n responseBody.usage.outputTokens\n );\n }\n }\n if (responseBody.stopReason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n responseBody.stopReason,\n ]);\n }\n } else if (currentModelId.includes('anthropic.claude')) {\n if (responseBody.usage?.input_tokens !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n responseBody.usage.input_tokens\n );\n }\n if (responseBody.usage?.output_tokens !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n responseBody.usage.output_tokens\n );\n }\n if (responseBody.stop_reason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n responseBody.stop_reason,\n ]);\n }\n } else if (currentModelId.includes('meta.llama')) {\n if (responseBody.prompt_token_count !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n responseBody.prompt_token_count\n );\n }\n if (responseBody.generation_token_count !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n responseBody.generation_token_count\n );\n }\n if (responseBody.stop_reason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n responseBody.stop_reason,\n ]);\n }\n } else if (currentModelId.includes('cohere.command-r')) {\n if (responseBody.text !== undefined) {\n // NOTE: We approximate the token count since this value is not directly available in the body\n // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.\n // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n Math.ceil(responseBody.text.length / 6)\n );\n }\n if (responseBody.finish_reason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n responseBody.finish_reason,\n ]);\n }\n } else if (currentModelId.includes('cohere.command')) {\n if (responseBody.generations?.[0]?.text !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n // NOTE: We approximate the token count since this value is not directly available in the body\n // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.\n // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html\n Math.ceil(responseBody.generations[0].text.length / 6)\n );\n }\n if (responseBody.generations?.[0]?.finish_reason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n responseBody.generations[0].finish_reason,\n ]);\n }\n } else if (currentModelId.includes('mistral')) {\n if (responseBody.outputs?.[0]?.text !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n // NOTE: We approximate the token count since this value is not directly available in the body\n // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.\n // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html\n Math.ceil(responseBody.outputs[0].text.length / 6)\n );\n }\n if (responseBody.outputs?.[0]?.stop_reason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n responseBody.outputs[0].stop_reason,\n ]);\n }\n }\n }\n }\n\n private async responseHookInvokeModelWithResponseStream(\n response: NormalizedResponse,\n span: Span,\n tracer: Tracer,\n config: AwsSdkInstrumentationConfig\n ): Promise<any> {\n const stream = response.data?.body;\n const modelId = response.request.commandInput?.modelId;\n if (!stream || !modelId) return;\n\n // Replace the original response body with our instrumented stream.\n // - Defers span.end() until the entire stream is consumed\n // This ensures downstream consumers still receive the full stream correctly,\n // while OpenTelemetry can record span attributes from streamed data.\n response.data.body = async function* (\n this: BedrockRuntimeServiceExtension\n ) {\n try {\n for await (const chunk of stream) {\n const parsedChunk = this.parseChunk(chunk?.chunk?.bytes);\n\n if (!parsedChunk) {\n // pass through\n } else if (modelId.includes('amazon.titan')) {\n BedrockRuntimeServiceExtension.recordTitanAttributes(\n parsedChunk,\n span\n );\n } else if (modelId.includes('anthropic.claude')) {\n BedrockRuntimeServiceExtension.recordClaudeAttributes(\n parsedChunk,\n span\n );\n } else if (modelId.includes('amazon.nova')) {\n BedrockRuntimeServiceExtension.recordNovaAttributes(\n parsedChunk,\n span\n );\n } else if (modelId.includes('meta.llama')) {\n BedrockRuntimeServiceExtension.recordLlamaAttributes(\n parsedChunk,\n span\n );\n } else if (modelId.includes('cohere.command-r')) {\n BedrockRuntimeServiceExtension.recordCohereRAttributes(\n parsedChunk,\n span\n );\n } else if (modelId.includes('cohere.command')) {\n BedrockRuntimeServiceExtension.recordCohereAttributes(\n parsedChunk,\n span\n );\n } else if (modelId.includes('mistral')) {\n BedrockRuntimeServiceExtension.recordMistralAttributes(\n parsedChunk,\n span\n );\n }\n yield chunk;\n }\n } finally {\n span.end();\n }\n }.bind(this)();\n return response.data;\n }\n\n private parseChunk(bytes?: Uint8Array): any {\n if (!bytes || !(bytes instanceof Uint8Array)) return null;\n try {\n const str = Buffer.from(bytes).toString('utf-8');\n return JSON.parse(str);\n } catch (err) {\n this._diag.warn('Failed to parse streamed chunk', err);\n return null;\n }\n }\n\n private static recordNovaAttributes(parsedChunk: any, span: Span) {\n if (parsedChunk.metadata?.usage !== undefined) {\n if (parsedChunk.metadata?.usage.inputTokens !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n parsedChunk.metadata.usage.inputTokens\n );\n }\n if (parsedChunk.metadata?.usage.outputTokens !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n parsedChunk.metadata.usage.outputTokens\n );\n }\n }\n if (parsedChunk.messageStop?.stopReason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n parsedChunk.messageStop.stopReason,\n ]);\n }\n }\n\n private static recordClaudeAttributes(parsedChunk: any, span: Span) {\n if (parsedChunk.message?.usage?.input_tokens !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n parsedChunk.message.usage.input_tokens\n );\n }\n if (parsedChunk.message?.usage?.output_tokens !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n parsedChunk.message.usage.output_tokens\n );\n }\n if (parsedChunk.delta?.stop_reason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n parsedChunk.delta.stop_reason,\n ]);\n }\n }\n\n private static recordTitanAttributes(parsedChunk: any, span: Span) {\n if (parsedChunk.inputTextTokenCount !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n parsedChunk.inputTextTokenCount\n );\n }\n if (parsedChunk.totalOutputTextTokenCount !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n parsedChunk.totalOutputTextTokenCount\n );\n }\n if (parsedChunk.completionReason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n parsedChunk.completionReason,\n ]);\n }\n }\n private static recordLlamaAttributes(parsedChunk: any, span: Span) {\n if (parsedChunk.prompt_token_count !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n parsedChunk.prompt_token_count\n );\n }\n if (parsedChunk.generation_token_count !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n parsedChunk.generation_token_count\n );\n }\n if (parsedChunk.stop_reason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n parsedChunk.stop_reason,\n ]);\n }\n }\n\n private static recordMistralAttributes(parsedChunk: any, span: Span) {\n if (parsedChunk.outputs?.[0]?.text !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n // NOTE: We approximate the token count since this value is not directly available in the body\n // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.\n // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html\n Math.ceil(parsedChunk.outputs[0].text.length / 6)\n );\n }\n if (parsedChunk.outputs?.[0]?.stop_reason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n parsedChunk.outputs[0].stop_reason,\n ]);\n }\n }\n\n private static recordCohereAttributes(parsedChunk: any, span: Span) {\n if (parsedChunk.generations?.[0]?.text !== undefined) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n // NOTE: We approximate the token count since this value is not directly available in the body\n // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.\n // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html\n Math.ceil(parsedChunk.generations[0].text.length / 6)\n );\n }\n if (parsedChunk.generations?.[0]?.finish_reason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n parsedChunk.generations[0].finish_reason,\n ]);\n }\n }\n\n private static recordCohereRAttributes(parsedChunk: any, span: Span) {\n if (parsedChunk.text !== undefined) {\n // NOTE: We approximate the token count since this value is not directly available in the body\n // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.\n // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html\n span.setAttribute(\n ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n Math.ceil(parsedChunk.text.length / 6)\n );\n }\n if (parsedChunk.finish_reason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n parsedChunk.finish_reason,\n ]);\n }\n }\n}\n"]}
|
|
@@ -3,18 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.DynamodbServiceExtension = void 0;
|
|
4
4
|
/*
|
|
5
5
|
* Copyright The OpenTelemetry Authors
|
|
6
|
-
*
|
|
7
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
-
* you may not use this file except in compliance with the License.
|
|
9
|
-
* You may obtain a copy of the License at
|
|
10
|
-
*
|
|
11
|
-
* https://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
-
*
|
|
13
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
-
* See the License for the specific language governing permissions and
|
|
17
|
-
* limitations under the License.
|
|
6
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
18
7
|
*/
|
|
19
8
|
const api_1 = require("@opentelemetry/api");
|
|
20
9
|
const instrumentation_1 = require("@opentelemetry/instrumentation");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamodb.js","sourceRoot":"","sources":["../../../src/services/dynamodb.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n Attributes,\n DiagLogger,\n Span,\n SpanKind,\n Tracer,\n} from '@opentelemetry/api';\nimport { SemconvStability } from '@opentelemetry/instrumentation';\nimport {\n ATTR_DB_NAMESPACE,\n ATTR_DB_OPERATION_NAME,\n ATTR_DB_QUERY_TEXT,\n ATTR_DB_SYSTEM_NAME,\n} from '@opentelemetry/semantic-conventions';\nimport { RequestMetadata, ServiceExtension } from './ServiceExtension';\nimport {\n ATTR_AWS_DYNAMODB_ATTRIBUTE_DEFINITIONS,\n ATTR_AWS_DYNAMODB_CONSISTENT_READ,\n ATTR_AWS_DYNAMODB_CONSUMED_CAPACITY,\n ATTR_AWS_DYNAMODB_COUNT,\n ATTR_AWS_DYNAMODB_EXCLUSIVE_START_TABLE,\n ATTR_AWS_DYNAMODB_GLOBAL_SECONDARY_INDEX_UPDATES,\n ATTR_AWS_DYNAMODB_GLOBAL_SECONDARY_INDEXES,\n ATTR_AWS_DYNAMODB_INDEX_NAME,\n ATTR_AWS_DYNAMODB_ITEM_COLLECTION_METRICS,\n ATTR_AWS_DYNAMODB_LIMIT,\n ATTR_AWS_DYNAMODB_LOCAL_SECONDARY_INDEXES,\n ATTR_AWS_DYNAMODB_PROJECTION,\n ATTR_AWS_DYNAMODB_PROVISIONED_READ_CAPACITY,\n ATTR_AWS_DYNAMODB_PROVISIONED_WRITE_CAPACITY,\n ATTR_AWS_DYNAMODB_SCAN_FORWARD,\n ATTR_AWS_DYNAMODB_SCANNED_COUNT,\n ATTR_AWS_DYNAMODB_SEGMENT,\n ATTR_AWS_DYNAMODB_SELECT,\n ATTR_AWS_DYNAMODB_TABLE_COUNT,\n ATTR_AWS_DYNAMODB_TABLE_NAMES,\n ATTR_AWS_DYNAMODB_TOTAL_SEGMENTS,\n ATTR_DB_NAME,\n ATTR_DB_OPERATION,\n ATTR_DB_STATEMENT,\n ATTR_DB_SYSTEM,\n DB_SYSTEM_NAME_VALUE_DYNAMODB,\n DB_SYSTEM_VALUE_DYNAMODB,\n} from '../semconv';\nimport {\n AwsSdkInstrumentationConfig,\n NormalizedRequest,\n NormalizedResponse,\n} from '../types';\n\nexport class DynamodbServiceExtension implements ServiceExtension {\n toArray<T>(values: T | T[]): T[] {\n return Array.isArray(values) ? values : [values];\n }\n\n requestPreSpanHook(\n normalizedRequest: NormalizedRequest,\n config: AwsSdkInstrumentationConfig,\n diag: DiagLogger,\n dbSemconvStability?: SemconvStability\n ): RequestMetadata {\n const spanKind: SpanKind = SpanKind.CLIENT;\n let spanName: string | undefined;\n const isIncoming = false;\n const operation = normalizedRequest.commandName;\n const tableName = normalizedRequest.commandInput?.TableName;\n\n const spanAttributes: Attributes = {};\n\n if (\n dbSemconvStability === undefined ||\n dbSemconvStability & SemconvStability.OLD\n ) {\n spanAttributes[ATTR_DB_SYSTEM] = DB_SYSTEM_VALUE_DYNAMODB;\n spanAttributes[ATTR_DB_NAME] = tableName;\n spanAttributes[ATTR_DB_OPERATION] = operation;\n }\n if (\n dbSemconvStability !== undefined &&\n dbSemconvStability & SemconvStability.STABLE\n ) {\n spanAttributes[ATTR_DB_SYSTEM_NAME] = DB_SYSTEM_NAME_VALUE_DYNAMODB;\n spanAttributes[ATTR_DB_NAMESPACE] = tableName;\n spanAttributes[ATTR_DB_OPERATION_NAME] = operation;\n }\n\n if (config.dynamoDBStatementSerializer) {\n try {\n const sanitizedStatement = config.dynamoDBStatementSerializer(\n operation,\n normalizedRequest.commandInput\n );\n\n if (typeof sanitizedStatement === 'string') {\n if (\n dbSemconvStability === undefined ||\n dbSemconvStability & SemconvStability.OLD\n ) {\n spanAttributes[ATTR_DB_STATEMENT] = sanitizedStatement;\n }\n if (\n dbSemconvStability !== undefined &&\n dbSemconvStability & SemconvStability.STABLE\n ) {\n spanAttributes[ATTR_DB_QUERY_TEXT] = sanitizedStatement;\n }\n }\n } catch (err) {\n diag.error('failed to sanitize DynamoDB statement', err);\n }\n }\n\n // normalizedRequest.commandInput.RequestItems) is undefined when no table names are returned\n // keys in this object are the table names\n if (normalizedRequest.commandInput?.TableName) {\n // Necessary for commands with only 1 table name (example: CreateTable). Attribute is TableName not keys of RequestItems\n // single table name returned for operations like CreateTable\n spanAttributes[ATTR_AWS_DYNAMODB_TABLE_NAMES] = [\n normalizedRequest.commandInput.TableName,\n ];\n } else if (normalizedRequest.commandInput?.RequestItems) {\n spanAttributes[ATTR_AWS_DYNAMODB_TABLE_NAMES] = Object.keys(\n normalizedRequest.commandInput.RequestItems\n );\n }\n\n if (operation === 'CreateTable' || operation === 'UpdateTable') {\n // only check for ProvisionedThroughput since ReadCapacityUnits and WriteCapacity units are required attributes\n if (normalizedRequest.commandInput?.ProvisionedThroughput) {\n spanAttributes[ATTR_AWS_DYNAMODB_PROVISIONED_READ_CAPACITY] =\n normalizedRequest.commandInput.ProvisionedThroughput.ReadCapacityUnits;\n spanAttributes[ATTR_AWS_DYNAMODB_PROVISIONED_WRITE_CAPACITY] =\n normalizedRequest.commandInput.ProvisionedThroughput.WriteCapacityUnits;\n }\n }\n\n if (\n operation === 'GetItem' ||\n operation === 'Scan' ||\n operation === 'Query'\n ) {\n if (normalizedRequest.commandInput?.ConsistentRead) {\n spanAttributes[ATTR_AWS_DYNAMODB_CONSISTENT_READ] =\n normalizedRequest.commandInput.ConsistentRead;\n }\n }\n\n if (operation === 'Query' || operation === 'Scan') {\n if (normalizedRequest.commandInput?.ProjectionExpression) {\n spanAttributes[ATTR_AWS_DYNAMODB_PROJECTION] =\n normalizedRequest.commandInput.ProjectionExpression;\n }\n }\n\n if (operation === 'CreateTable') {\n if (normalizedRequest.commandInput?.GlobalSecondaryIndexes) {\n spanAttributes[ATTR_AWS_DYNAMODB_GLOBAL_SECONDARY_INDEXES] =\n this.toArray(\n normalizedRequest.commandInput.GlobalSecondaryIndexes\n ).map((x: { [DictionaryKey: string]: any }) => JSON.stringify(x));\n }\n\n if (normalizedRequest.commandInput?.LocalSecondaryIndexes) {\n spanAttributes[ATTR_AWS_DYNAMODB_LOCAL_SECONDARY_INDEXES] =\n this.toArray(\n normalizedRequest.commandInput.LocalSecondaryIndexes\n ).map((x: { [DictionaryKey: string]: any }) => JSON.stringify(x));\n }\n }\n\n if (\n operation === 'ListTables' ||\n operation === 'Query' ||\n operation === 'Scan'\n ) {\n if (normalizedRequest.commandInput?.Limit) {\n spanAttributes[ATTR_AWS_DYNAMODB_LIMIT] =\n normalizedRequest.commandInput.Limit;\n }\n }\n\n if (operation === 'ListTables') {\n if (normalizedRequest.commandInput?.ExclusiveStartTableName) {\n spanAttributes[ATTR_AWS_DYNAMODB_EXCLUSIVE_START_TABLE] =\n normalizedRequest.commandInput.ExclusiveStartTableName;\n }\n }\n\n if (operation === 'Query') {\n if (normalizedRequest.commandInput?.ScanIndexForward) {\n spanAttributes[ATTR_AWS_DYNAMODB_SCAN_FORWARD] =\n normalizedRequest.commandInput.ScanIndexForward;\n }\n\n if (normalizedRequest.commandInput?.IndexName) {\n spanAttributes[ATTR_AWS_DYNAMODB_INDEX_NAME] =\n normalizedRequest.commandInput.IndexName;\n }\n\n if (normalizedRequest.commandInput?.Select) {\n spanAttributes[ATTR_AWS_DYNAMODB_SELECT] =\n normalizedRequest.commandInput.Select;\n }\n }\n\n if (operation === 'Scan') {\n if (normalizedRequest.commandInput?.Segment) {\n spanAttributes[ATTR_AWS_DYNAMODB_SEGMENT] =\n normalizedRequest.commandInput?.Segment;\n }\n\n if (normalizedRequest.commandInput?.TotalSegments) {\n spanAttributes[ATTR_AWS_DYNAMODB_TOTAL_SEGMENTS] =\n normalizedRequest.commandInput?.TotalSegments;\n }\n\n if (normalizedRequest.commandInput?.IndexName) {\n spanAttributes[ATTR_AWS_DYNAMODB_INDEX_NAME] =\n normalizedRequest.commandInput.IndexName;\n }\n\n if (normalizedRequest.commandInput?.Select) {\n spanAttributes[ATTR_AWS_DYNAMODB_SELECT] =\n normalizedRequest.commandInput.Select;\n }\n }\n\n if (operation === 'UpdateTable') {\n if (normalizedRequest.commandInput?.AttributeDefinitions) {\n spanAttributes[ATTR_AWS_DYNAMODB_ATTRIBUTE_DEFINITIONS] = this.toArray(\n normalizedRequest.commandInput.AttributeDefinitions\n ).map((x: { [DictionaryKey: string]: any }) => JSON.stringify(x));\n }\n\n if (normalizedRequest.commandInput?.GlobalSecondaryIndexUpdates) {\n spanAttributes[ATTR_AWS_DYNAMODB_GLOBAL_SECONDARY_INDEX_UPDATES] =\n this.toArray(\n normalizedRequest.commandInput.GlobalSecondaryIndexUpdates\n ).map((x: { [DictionaryKey: string]: any }) => JSON.stringify(x));\n }\n }\n\n return {\n isIncoming,\n spanAttributes,\n spanKind,\n spanName,\n };\n }\n\n responseHook(\n response: NormalizedResponse,\n span: Span,\n _tracer: Tracer,\n _config: AwsSdkInstrumentationConfig\n ) {\n if (response.data?.ConsumedCapacity) {\n span.setAttribute(\n ATTR_AWS_DYNAMODB_CONSUMED_CAPACITY,\n toArray(response.data.ConsumedCapacity).map(\n (x: { [DictionaryKey: string]: any }) => JSON.stringify(x)\n )\n );\n }\n\n if (response.data?.ItemCollectionMetrics) {\n span.setAttribute(\n ATTR_AWS_DYNAMODB_ITEM_COLLECTION_METRICS,\n this.toArray(response.data.ItemCollectionMetrics).map(\n (x: { [DictionaryKey: string]: any }) => JSON.stringify(x)\n )\n );\n }\n\n if (response.data?.TableNames) {\n span.setAttribute(\n ATTR_AWS_DYNAMODB_TABLE_COUNT,\n response.data?.TableNames.length\n );\n }\n\n if (response.data?.Count) {\n span.setAttribute(ATTR_AWS_DYNAMODB_COUNT, response.data?.Count);\n }\n\n if (response.data?.ScannedCount) {\n span.setAttribute(\n ATTR_AWS_DYNAMODB_SCANNED_COUNT,\n response.data?.ScannedCount\n );\n }\n }\n}\n\nfunction toArray<T>(values: T | T[]): T[] {\n return Array.isArray(values) ? values : [values];\n}\n"]}
|
|
1
|
+
{"version":3,"file":"dynamodb.js","sourceRoot":"","sources":["../../../src/services/dynamodb.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n Attributes,\n DiagLogger,\n Span,\n SpanKind,\n Tracer,\n} from '@opentelemetry/api';\nimport { SemconvStability } from '@opentelemetry/instrumentation';\nimport {\n ATTR_DB_NAMESPACE,\n ATTR_DB_OPERATION_NAME,\n ATTR_DB_QUERY_TEXT,\n ATTR_DB_SYSTEM_NAME,\n} from '@opentelemetry/semantic-conventions';\nimport { RequestMetadata, ServiceExtension } from './ServiceExtension';\nimport {\n ATTR_AWS_DYNAMODB_ATTRIBUTE_DEFINITIONS,\n ATTR_AWS_DYNAMODB_CONSISTENT_READ,\n ATTR_AWS_DYNAMODB_CONSUMED_CAPACITY,\n ATTR_AWS_DYNAMODB_COUNT,\n ATTR_AWS_DYNAMODB_EXCLUSIVE_START_TABLE,\n ATTR_AWS_DYNAMODB_GLOBAL_SECONDARY_INDEX_UPDATES,\n ATTR_AWS_DYNAMODB_GLOBAL_SECONDARY_INDEXES,\n ATTR_AWS_DYNAMODB_INDEX_NAME,\n ATTR_AWS_DYNAMODB_ITEM_COLLECTION_METRICS,\n ATTR_AWS_DYNAMODB_LIMIT,\n ATTR_AWS_DYNAMODB_LOCAL_SECONDARY_INDEXES,\n ATTR_AWS_DYNAMODB_PROJECTION,\n ATTR_AWS_DYNAMODB_PROVISIONED_READ_CAPACITY,\n ATTR_AWS_DYNAMODB_PROVISIONED_WRITE_CAPACITY,\n ATTR_AWS_DYNAMODB_SCAN_FORWARD,\n ATTR_AWS_DYNAMODB_SCANNED_COUNT,\n ATTR_AWS_DYNAMODB_SEGMENT,\n ATTR_AWS_DYNAMODB_SELECT,\n ATTR_AWS_DYNAMODB_TABLE_COUNT,\n ATTR_AWS_DYNAMODB_TABLE_NAMES,\n ATTR_AWS_DYNAMODB_TOTAL_SEGMENTS,\n ATTR_DB_NAME,\n ATTR_DB_OPERATION,\n ATTR_DB_STATEMENT,\n ATTR_DB_SYSTEM,\n DB_SYSTEM_NAME_VALUE_DYNAMODB,\n DB_SYSTEM_VALUE_DYNAMODB,\n} from '../semconv';\nimport {\n AwsSdkInstrumentationConfig,\n NormalizedRequest,\n NormalizedResponse,\n} from '../types';\n\nexport class DynamodbServiceExtension implements ServiceExtension {\n toArray<T>(values: T | T[]): T[] {\n return Array.isArray(values) ? values : [values];\n }\n\n requestPreSpanHook(\n normalizedRequest: NormalizedRequest,\n config: AwsSdkInstrumentationConfig,\n diag: DiagLogger,\n dbSemconvStability?: SemconvStability\n ): RequestMetadata {\n const spanKind: SpanKind = SpanKind.CLIENT;\n let spanName: string | undefined;\n const isIncoming = false;\n const operation = normalizedRequest.commandName;\n const tableName = normalizedRequest.commandInput?.TableName;\n\n const spanAttributes: Attributes = {};\n\n if (\n dbSemconvStability === undefined ||\n dbSemconvStability & SemconvStability.OLD\n ) {\n spanAttributes[ATTR_DB_SYSTEM] = DB_SYSTEM_VALUE_DYNAMODB;\n spanAttributes[ATTR_DB_NAME] = tableName;\n spanAttributes[ATTR_DB_OPERATION] = operation;\n }\n if (\n dbSemconvStability !== undefined &&\n dbSemconvStability & SemconvStability.STABLE\n ) {\n spanAttributes[ATTR_DB_SYSTEM_NAME] = DB_SYSTEM_NAME_VALUE_DYNAMODB;\n spanAttributes[ATTR_DB_NAMESPACE] = tableName;\n spanAttributes[ATTR_DB_OPERATION_NAME] = operation;\n }\n\n if (config.dynamoDBStatementSerializer) {\n try {\n const sanitizedStatement = config.dynamoDBStatementSerializer(\n operation,\n normalizedRequest.commandInput\n );\n\n if (typeof sanitizedStatement === 'string') {\n if (\n dbSemconvStability === undefined ||\n dbSemconvStability & SemconvStability.OLD\n ) {\n spanAttributes[ATTR_DB_STATEMENT] = sanitizedStatement;\n }\n if (\n dbSemconvStability !== undefined &&\n dbSemconvStability & SemconvStability.STABLE\n ) {\n spanAttributes[ATTR_DB_QUERY_TEXT] = sanitizedStatement;\n }\n }\n } catch (err) {\n diag.error('failed to sanitize DynamoDB statement', err);\n }\n }\n\n // normalizedRequest.commandInput.RequestItems) is undefined when no table names are returned\n // keys in this object are the table names\n if (normalizedRequest.commandInput?.TableName) {\n // Necessary for commands with only 1 table name (example: CreateTable). Attribute is TableName not keys of RequestItems\n // single table name returned for operations like CreateTable\n spanAttributes[ATTR_AWS_DYNAMODB_TABLE_NAMES] = [\n normalizedRequest.commandInput.TableName,\n ];\n } else if (normalizedRequest.commandInput?.RequestItems) {\n spanAttributes[ATTR_AWS_DYNAMODB_TABLE_NAMES] = Object.keys(\n normalizedRequest.commandInput.RequestItems\n );\n }\n\n if (operation === 'CreateTable' || operation === 'UpdateTable') {\n // only check for ProvisionedThroughput since ReadCapacityUnits and WriteCapacity units are required attributes\n if (normalizedRequest.commandInput?.ProvisionedThroughput) {\n spanAttributes[ATTR_AWS_DYNAMODB_PROVISIONED_READ_CAPACITY] =\n normalizedRequest.commandInput.ProvisionedThroughput.ReadCapacityUnits;\n spanAttributes[ATTR_AWS_DYNAMODB_PROVISIONED_WRITE_CAPACITY] =\n normalizedRequest.commandInput.ProvisionedThroughput.WriteCapacityUnits;\n }\n }\n\n if (\n operation === 'GetItem' ||\n operation === 'Scan' ||\n operation === 'Query'\n ) {\n if (normalizedRequest.commandInput?.ConsistentRead) {\n spanAttributes[ATTR_AWS_DYNAMODB_CONSISTENT_READ] =\n normalizedRequest.commandInput.ConsistentRead;\n }\n }\n\n if (operation === 'Query' || operation === 'Scan') {\n if (normalizedRequest.commandInput?.ProjectionExpression) {\n spanAttributes[ATTR_AWS_DYNAMODB_PROJECTION] =\n normalizedRequest.commandInput.ProjectionExpression;\n }\n }\n\n if (operation === 'CreateTable') {\n if (normalizedRequest.commandInput?.GlobalSecondaryIndexes) {\n spanAttributes[ATTR_AWS_DYNAMODB_GLOBAL_SECONDARY_INDEXES] =\n this.toArray(\n normalizedRequest.commandInput.GlobalSecondaryIndexes\n ).map((x: { [DictionaryKey: string]: any }) => JSON.stringify(x));\n }\n\n if (normalizedRequest.commandInput?.LocalSecondaryIndexes) {\n spanAttributes[ATTR_AWS_DYNAMODB_LOCAL_SECONDARY_INDEXES] =\n this.toArray(\n normalizedRequest.commandInput.LocalSecondaryIndexes\n ).map((x: { [DictionaryKey: string]: any }) => JSON.stringify(x));\n }\n }\n\n if (\n operation === 'ListTables' ||\n operation === 'Query' ||\n operation === 'Scan'\n ) {\n if (normalizedRequest.commandInput?.Limit) {\n spanAttributes[ATTR_AWS_DYNAMODB_LIMIT] =\n normalizedRequest.commandInput.Limit;\n }\n }\n\n if (operation === 'ListTables') {\n if (normalizedRequest.commandInput?.ExclusiveStartTableName) {\n spanAttributes[ATTR_AWS_DYNAMODB_EXCLUSIVE_START_TABLE] =\n normalizedRequest.commandInput.ExclusiveStartTableName;\n }\n }\n\n if (operation === 'Query') {\n if (normalizedRequest.commandInput?.ScanIndexForward) {\n spanAttributes[ATTR_AWS_DYNAMODB_SCAN_FORWARD] =\n normalizedRequest.commandInput.ScanIndexForward;\n }\n\n if (normalizedRequest.commandInput?.IndexName) {\n spanAttributes[ATTR_AWS_DYNAMODB_INDEX_NAME] =\n normalizedRequest.commandInput.IndexName;\n }\n\n if (normalizedRequest.commandInput?.Select) {\n spanAttributes[ATTR_AWS_DYNAMODB_SELECT] =\n normalizedRequest.commandInput.Select;\n }\n }\n\n if (operation === 'Scan') {\n if (normalizedRequest.commandInput?.Segment) {\n spanAttributes[ATTR_AWS_DYNAMODB_SEGMENT] =\n normalizedRequest.commandInput?.Segment;\n }\n\n if (normalizedRequest.commandInput?.TotalSegments) {\n spanAttributes[ATTR_AWS_DYNAMODB_TOTAL_SEGMENTS] =\n normalizedRequest.commandInput?.TotalSegments;\n }\n\n if (normalizedRequest.commandInput?.IndexName) {\n spanAttributes[ATTR_AWS_DYNAMODB_INDEX_NAME] =\n normalizedRequest.commandInput.IndexName;\n }\n\n if (normalizedRequest.commandInput?.Select) {\n spanAttributes[ATTR_AWS_DYNAMODB_SELECT] =\n normalizedRequest.commandInput.Select;\n }\n }\n\n if (operation === 'UpdateTable') {\n if (normalizedRequest.commandInput?.AttributeDefinitions) {\n spanAttributes[ATTR_AWS_DYNAMODB_ATTRIBUTE_DEFINITIONS] = this.toArray(\n normalizedRequest.commandInput.AttributeDefinitions\n ).map((x: { [DictionaryKey: string]: any }) => JSON.stringify(x));\n }\n\n if (normalizedRequest.commandInput?.GlobalSecondaryIndexUpdates) {\n spanAttributes[ATTR_AWS_DYNAMODB_GLOBAL_SECONDARY_INDEX_UPDATES] =\n this.toArray(\n normalizedRequest.commandInput.GlobalSecondaryIndexUpdates\n ).map((x: { [DictionaryKey: string]: any }) => JSON.stringify(x));\n }\n }\n\n return {\n isIncoming,\n spanAttributes,\n spanKind,\n spanName,\n };\n }\n\n responseHook(\n response: NormalizedResponse,\n span: Span,\n _tracer: Tracer,\n _config: AwsSdkInstrumentationConfig\n ) {\n if (response.data?.ConsumedCapacity) {\n span.setAttribute(\n ATTR_AWS_DYNAMODB_CONSUMED_CAPACITY,\n toArray(response.data.ConsumedCapacity).map(\n (x: { [DictionaryKey: string]: any }) => JSON.stringify(x)\n )\n );\n }\n\n if (response.data?.ItemCollectionMetrics) {\n span.setAttribute(\n ATTR_AWS_DYNAMODB_ITEM_COLLECTION_METRICS,\n this.toArray(response.data.ItemCollectionMetrics).map(\n (x: { [DictionaryKey: string]: any }) => JSON.stringify(x)\n )\n );\n }\n\n if (response.data?.TableNames) {\n span.setAttribute(\n ATTR_AWS_DYNAMODB_TABLE_COUNT,\n response.data?.TableNames.length\n );\n }\n\n if (response.data?.Count) {\n span.setAttribute(ATTR_AWS_DYNAMODB_COUNT, response.data?.Count);\n }\n\n if (response.data?.ScannedCount) {\n span.setAttribute(\n ATTR_AWS_DYNAMODB_SCANNED_COUNT,\n response.data?.ScannedCount\n );\n }\n }\n}\n\nfunction toArray<T>(values: T | T[]): T[] {\n return Array.isArray(values) ? values : [values];\n}\n"]}
|
|
@@ -3,18 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ServicesExtensions = void 0;
|
|
4
4
|
/*
|
|
5
5
|
* Copyright The OpenTelemetry Authors
|
|
6
|
-
*
|
|
7
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
-
* you may not use this file except in compliance with the License.
|
|
9
|
-
* You may obtain a copy of the License at
|
|
10
|
-
*
|
|
11
|
-
* https://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
-
*
|
|
13
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
-
* See the License for the specific language governing permissions and
|
|
17
|
-
* limitations under the License.
|
|
6
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
18
7
|
*/
|
|
19
8
|
var ServicesExtensions_1 = require("./ServicesExtensions");
|
|
20
9
|
Object.defineProperty(exports, "ServicesExtensions", { enumerable: true, get: function () { return ServicesExtensions_1.ServicesExtensions; } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/index.ts"],"names":[],"mappings":";;;AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/index.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,2DAA0D;AAAjD,wHAAA,kBAAkB,OAAA","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nexport { ServicesExtensions } from './ServicesExtensions';\n"]}
|
|
@@ -3,18 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.KinesisServiceExtension = void 0;
|
|
4
4
|
/*
|
|
5
5
|
* Copyright The OpenTelemetry Authors
|
|
6
|
-
*
|
|
7
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
-
* you may not use this file except in compliance with the License.
|
|
9
|
-
* You may obtain a copy of the License at
|
|
10
|
-
*
|
|
11
|
-
* https://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
-
*
|
|
13
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
-
* See the License for the specific language governing permissions and
|
|
17
|
-
* limitations under the License.
|
|
6
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
18
7
|
*/
|
|
19
8
|
const api_1 = require("@opentelemetry/api");
|
|
20
9
|
const enums_1 = require("../enums");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kinesis.js","sourceRoot":"","sources":["../../../src/services/kinesis.ts"],"names":[],"mappings":";;;AAAA
|
|
1
|
+
{"version":3,"file":"kinesis.js","sourceRoot":"","sources":["../../../src/services/kinesis.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,4CAA0D;AAC1D,oCAA0C;AAI1C,MAAa,uBAAuB;IAClC,kBAAkB,CAChB,OAA0B,EAC1B,OAAoC;QAEpC,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,EAAE,UAAU,CAAC;QACpD,MAAM,QAAQ,GAAa,cAAQ,CAAC,MAAM,CAAC;QAC3C,MAAM,cAAc,GAAe,EAAE,CAAC;QAEtC,IAAI,UAAU,EAAE;YACd,cAAc,CAAC,sBAAc,CAAC,uBAAuB,CAAC,GAAG,UAAU,CAAC;SACrE;QAED,MAAM,UAAU,GAAG,KAAK,CAAC;QAEzB,OAAO;YACL,UAAU;YACV,cAAc;YACd,QAAQ;SACT,CAAC;IACJ,CAAC;CACF;AArBD,0DAqBC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { Attributes, SpanKind } from '@opentelemetry/api';\nimport { AttributeNames } from '../enums';\nimport { AwsSdkInstrumentationConfig, NormalizedRequest } from '../types';\nimport { RequestMetadata, ServiceExtension } from './ServiceExtension';\n\nexport class KinesisServiceExtension implements ServiceExtension {\n requestPreSpanHook(\n request: NormalizedRequest,\n _config: AwsSdkInstrumentationConfig\n ): RequestMetadata {\n const streamName = request.commandInput?.StreamName;\n const spanKind: SpanKind = SpanKind.CLIENT;\n const spanAttributes: Attributes = {};\n\n if (streamName) {\n spanAttributes[AttributeNames.AWS_KINESIS_STREAM_NAME] = streamName;\n }\n\n const isIncoming = false;\n\n return {\n isIncoming,\n spanAttributes,\n spanKind,\n };\n }\n}\n"]}
|
|
@@ -3,18 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.LambdaServiceExtension = void 0;
|
|
4
4
|
/*
|
|
5
5
|
* Copyright The OpenTelemetry Authors
|
|
6
|
-
*
|
|
7
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
-
* you may not use this file except in compliance with the License.
|
|
9
|
-
* You may obtain a copy of the License at
|
|
10
|
-
*
|
|
11
|
-
* https://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
-
*
|
|
13
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
-
* See the License for the specific language governing permissions and
|
|
17
|
-
* limitations under the License.
|
|
6
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
18
7
|
*/
|
|
19
8
|
const api_1 = require("@opentelemetry/api");
|
|
20
9
|
const semconv_1 = require("../semconv");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lambda.js","sourceRoot":"","sources":["../../../src/services/lambda.ts"],"names":[],"mappings":";;;AAAA
|
|
1
|
+
{"version":3,"file":"lambda.js","sourceRoot":"","sources":["../../../src/services/lambda.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,4CAA8E;AAC9E,wCAIoB;AACpB,0DAA0D;AAO1D,4CAA0D;AAE1D,MAAM,cAAc;IACX,MAAM,CAAU,MAAM,GAAW,QAAQ,CAAC;;AAGnD,MAAa,sBAAsB;IACjC,kBAAkB,CAChB,OAA0B,EAC1B,OAAoC;QAEpC,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAEpE,IAAI,cAAc,GAAe,EAAE,CAAC;QACpC,IAAI,QAA4B,CAAC;QAEjC,QAAQ,OAAO,CAAC,WAAW,EAAE;YAC3B,KAAK,QAAQ;gBACX,cAAc,GAAG;oBACf,CAAC,gCAAsB,CAAC,EAAE,YAAY;oBACtC,CAAC,oCAA0B,CAAC,EAAE,KAAK;iBACpC,CAAC;gBACF,IAAI,OAAO,CAAC,MAAM,EAAE;oBAClB,cAAc,CAAC,kCAAwB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;iBAC3D;gBACD,QAAQ,GAAG,GAAG,YAAY,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;gBACtD,MAAM;SACT;QACD,OAAO;YACL,UAAU,EAAE,KAAK;YACjB,cAAc;YACd,QAAQ,EAAE,cAAQ,CAAC,MAAM;YACzB,QAAQ;SACT,CAAC;IACJ,CAAC;IAED,mBAAmB,GAAG,CAAC,OAA0B,EAAE,EAAE;QACnD,QAAQ,OAAO,CAAC,WAAW,EAAE;YAC3B,KAAK,cAAc,CAAC,MAAM;gBACxB;oBACE,IAAI,OAAO,CAAC,YAAY,EAAE;wBACxB,OAAO,CAAC,YAAY,CAAC,aAAa,GAAG,8BAA8B,CACjE,OAAO,CAAC,YAAY,CAAC,aAAa,CACnC,CAAC;qBACH;iBACF;gBACD,MAAM;SACT;IACH,CAAC,CAAC;IAEF,YAAY,CACV,QAA4B,EAC5B,IAAU,EACV,MAAc,EACd,MAAmC;QAEnC,QAAQ,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE;YACpC,KAAK,cAAc,CAAC,MAAM;gBACxB;oBACE,IAAI,CAAC,YAAY,CAAC,sCAAmB,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;iBAC5D;gBACD,MAAM;SACT;IACH,CAAC;IAED,mBAAmB,GAAG,CAAC,YAAiC,EAAU,EAAE;QAClE,OAAO,YAAY,EAAE,YAAY,CAAC;IACpC,CAAC,CAAC;CACH;AA9DD,wDA8DC;AAED,MAAM,8BAA8B,GAAG,CACrC,aAAiC,EACb,EAAE;IACtB,IAAI;QACF,MAAM,iBAAiB,GAAG,EAAE,CAAC;QAC7B,iBAAW,CAAC,MAAM,CAAC,aAAO,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC;QAExD,MAAM,mBAAmB,GAAG,aAAa;YACvC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACnE,CAAC,CAAC,EAAE,CAAC;QAEP,MAAM,oBAAoB,GAAG;YAC3B,GAAG,mBAAmB;YACtB,MAAM,EAAE;gBACN,GAAG,mBAAmB,CAAC,MAAM;gBAC7B,GAAG,iBAAiB;aACrB;SACF,CAAC;QAEF,MAAM,oBAAoB,GAAG,MAAM,CAAC,IAAI,CACtC,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,CACrC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAErB,8EAA8E;QAC9E,0FAA0F;QAC1F,IAAI,oBAAoB,CAAC,MAAM,GAAG,IAAI,EAAE;YACtC,UAAI,CAAC,IAAI,CACP,6HAA6H,CAC9H,CAAC;YACF,OAAO,aAAa,CAAC;SACtB;QAED,OAAO,oBAAoB,CAAC;KAC7B;IAAC,OAAO,CAAC,EAAE;QACV,UAAI,CAAC,KAAK,CACR,4EAA4E,EAC5E,CAAC,CACF,CAAC;QACF,OAAO,aAAa,CAAC;KACtB;AACH,CAAC,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { Span, SpanKind, Tracer, diag, Attributes } from '@opentelemetry/api';\nimport {\n ATTR_FAAS_INVOKED_NAME,\n ATTR_FAAS_INVOKED_PROVIDER,\n ATTR_FAAS_INVOKED_REGION,\n} from '../semconv';\nimport { ATTR_FAAS_EXECUTION } from '../semconv-obsolete';\nimport {\n AwsSdkInstrumentationConfig,\n NormalizedRequest,\n NormalizedResponse,\n} from '../types';\nimport { RequestMetadata, ServiceExtension } from './ServiceExtension';\nimport { context, propagation } from '@opentelemetry/api';\n\nclass LambdaCommands {\n public static readonly Invoke: string = 'Invoke';\n}\n\nexport class LambdaServiceExtension implements ServiceExtension {\n requestPreSpanHook(\n request: NormalizedRequest,\n _config: AwsSdkInstrumentationConfig\n ): RequestMetadata {\n const functionName = this.extractFunctionName(request.commandInput);\n\n let spanAttributes: Attributes = {};\n let spanName: string | undefined;\n\n switch (request.commandName) {\n case 'Invoke':\n spanAttributes = {\n [ATTR_FAAS_INVOKED_NAME]: functionName,\n [ATTR_FAAS_INVOKED_PROVIDER]: 'aws',\n };\n if (request.region) {\n spanAttributes[ATTR_FAAS_INVOKED_REGION] = request.region;\n }\n spanName = `${functionName} ${LambdaCommands.Invoke}`;\n break;\n }\n return {\n isIncoming: false,\n spanAttributes,\n spanKind: SpanKind.CLIENT,\n spanName,\n };\n }\n\n requestPostSpanHook = (request: NormalizedRequest) => {\n switch (request.commandName) {\n case LambdaCommands.Invoke:\n {\n if (request.commandInput) {\n request.commandInput.ClientContext = injectLambdaPropagationContext(\n request.commandInput.ClientContext\n );\n }\n }\n break;\n }\n };\n\n responseHook(\n response: NormalizedResponse,\n span: Span,\n tracer: Tracer,\n config: AwsSdkInstrumentationConfig\n ) {\n switch (response.request.commandName) {\n case LambdaCommands.Invoke:\n {\n span.setAttribute(ATTR_FAAS_EXECUTION, response.requestId);\n }\n break;\n }\n }\n\n extractFunctionName = (commandInput: Record<string, any>): string => {\n return commandInput?.FunctionName;\n };\n}\n\nconst injectLambdaPropagationContext = (\n clientContext: string | undefined\n): string | undefined => {\n try {\n const propagatedContext = {};\n propagation.inject(context.active(), propagatedContext);\n\n const parsedClientContext = clientContext\n ? JSON.parse(Buffer.from(clientContext, 'base64').toString('utf8'))\n : {};\n\n const updatedClientContext = {\n ...parsedClientContext,\n custom: {\n ...parsedClientContext.custom,\n ...propagatedContext,\n },\n };\n\n const encodedClientContext = Buffer.from(\n JSON.stringify(updatedClientContext)\n ).toString('base64');\n\n // The length of client context is capped at 3583 bytes of base64 encoded data\n // (https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html#API_Invoke_RequestSyntax)\n if (encodedClientContext.length > 3583) {\n diag.warn(\n 'lambda instrumentation: cannot set context propagation on lambda invoke parameters due to ClientContext length limitations.'\n );\n return clientContext;\n }\n\n return encodedClientContext;\n } catch (e) {\n diag.debug(\n 'lambda instrumentation: failed to set context propagation on ClientContext',\n e\n );\n return clientContext;\n }\n};\n"]}
|
package/build/src/services/s3.js
CHANGED
|
@@ -3,18 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.S3ServiceExtension = void 0;
|
|
4
4
|
/*
|
|
5
5
|
* Copyright The OpenTelemetry Authors
|
|
6
|
-
*
|
|
7
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
-
* you may not use this file except in compliance with the License.
|
|
9
|
-
* You may obtain a copy of the License at
|
|
10
|
-
*
|
|
11
|
-
* https://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
-
*
|
|
13
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
-
* See the License for the specific language governing permissions and
|
|
17
|
-
* limitations under the License.
|
|
6
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
18
7
|
*/
|
|
19
8
|
const api_1 = require("@opentelemetry/api");
|
|
20
9
|
const enums_1 = require("../enums");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3.js","sourceRoot":"","sources":["../../../src/services/s3.ts"],"names":[],"mappings":";;;AAAA
|
|
1
|
+
{"version":3,"file":"s3.js","sourceRoot":"","sources":["../../../src/services/s3.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,4CAA0D;AAC1D,oCAA0C;AAI1C,MAAa,kBAAkB;IAC7B,kBAAkB,CAChB,OAA0B,EAC1B,OAAoC;QAEpC,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC;QAChD,MAAM,QAAQ,GAAa,cAAQ,CAAC,MAAM,CAAC;QAC3C,MAAM,cAAc,GAAe,EAAE,CAAC;QAEtC,IAAI,UAAU,EAAE;YACd,cAAc,CAAC,sBAAc,CAAC,aAAa,CAAC,GAAG,UAAU,CAAC;SAC3D;QAED,MAAM,UAAU,GAAG,KAAK,CAAC;QAEzB,OAAO;YACL,UAAU;YACV,cAAc;YACd,QAAQ;SACT,CAAC;IACJ,CAAC;CACF;AArBD,gDAqBC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { Attributes, SpanKind } from '@opentelemetry/api';\nimport { AttributeNames } from '../enums';\nimport { AwsSdkInstrumentationConfig, NormalizedRequest } from '../types';\nimport { RequestMetadata, ServiceExtension } from './ServiceExtension';\n\nexport class S3ServiceExtension implements ServiceExtension {\n requestPreSpanHook(\n request: NormalizedRequest,\n _config: AwsSdkInstrumentationConfig\n ): RequestMetadata {\n const bucketName = request.commandInput?.Bucket;\n const spanKind: SpanKind = SpanKind.CLIENT;\n const spanAttributes: Attributes = {};\n\n if (bucketName) {\n spanAttributes[AttributeNames.AWS_S3_BUCKET] = bucketName;\n }\n\n const isIncoming = false;\n\n return {\n isIncoming,\n spanAttributes,\n spanKind,\n };\n }\n}\n"]}
|
|
@@ -3,18 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.SecretsManagerServiceExtension = void 0;
|
|
4
4
|
/*
|
|
5
5
|
* Copyright The OpenTelemetry Authors
|
|
6
|
-
*
|
|
7
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
-
* you may not use this file except in compliance with the License.
|
|
9
|
-
* You may obtain a copy of the License at
|
|
10
|
-
*
|
|
11
|
-
* https://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
-
*
|
|
13
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
-
* See the License for the specific language governing permissions and
|
|
17
|
-
* limitations under the License.
|
|
6
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
18
7
|
*/
|
|
19
8
|
const api_1 = require("@opentelemetry/api");
|
|
20
9
|
const semconv_1 = require("../semconv");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secretsmanager.js","sourceRoot":"","sources":["../../../src/services/secretsmanager.ts"],"names":[],"mappings":";;;AAAA
|
|
1
|
+
{"version":3,"file":"secretsmanager.js","sourceRoot":"","sources":["../../../src/services/secretsmanager.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,4CAAwE;AACxE,wCAAgE;AAQhE,MAAa,8BAA8B;IACzC,kBAAkB,CAChB,OAA0B,EAC1B,OAAoC;QAEpC,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC;QAChD,MAAM,QAAQ,GAAa,cAAQ,CAAC,MAAM,CAAC;QAC3C,IAAI,QAA4B,CAAC;QACjC,MAAM,cAAc,GAAe,EAAE,CAAC;QACtC,IACE,OAAO,QAAQ,KAAK,QAAQ;YAC5B,QAAQ,CAAC,UAAU,CAAC,yBAAyB,CAAC,EAC9C;YACA,cAAc,CAAC,4CAAkC,CAAC,GAAG,QAAQ,CAAC;SAC/D;QAED,OAAO;YACL,UAAU,EAAE,KAAK;YACjB,cAAc;YACd,QAAQ;YACR,QAAQ;SACT,CAAC;IACJ,CAAC;IAED,YAAY,CACV,QAA4B,EAC5B,IAAU,EACV,MAAc,EACd,MAAmC;QAEnC,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC;QACrC,IAAI,SAAS,EAAE;YACb,IAAI,CAAC,YAAY,CAAC,4CAAkC,EAAE,SAAS,CAAC,CAAC;SAClE;IACH,CAAC;CACF;AAnCD,wEAmCC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { Attributes, Span, SpanKind, Tracer } from '@opentelemetry/api';\nimport { ATTR_AWS_SECRETSMANAGER_SECRET_ARN } from '../semconv';\nimport { RequestMetadata, ServiceExtension } from './ServiceExtension';\nimport {\n NormalizedRequest,\n NormalizedResponse,\n AwsSdkInstrumentationConfig,\n} from '../types';\n\nexport class SecretsManagerServiceExtension implements ServiceExtension {\n requestPreSpanHook(\n request: NormalizedRequest,\n _config: AwsSdkInstrumentationConfig\n ): RequestMetadata {\n const secretId = request.commandInput?.SecretId;\n const spanKind: SpanKind = SpanKind.CLIENT;\n let spanName: string | undefined;\n const spanAttributes: Attributes = {};\n if (\n typeof secretId === 'string' &&\n secretId.startsWith('arn:aws:secretsmanager:')\n ) {\n spanAttributes[ATTR_AWS_SECRETSMANAGER_SECRET_ARN] = secretId;\n }\n\n return {\n isIncoming: false,\n spanAttributes,\n spanKind,\n spanName,\n };\n }\n\n responseHook(\n response: NormalizedResponse,\n span: Span,\n tracer: Tracer,\n config: AwsSdkInstrumentationConfig\n ): void {\n const secretArn = response.data?.ARN;\n if (secretArn) {\n span.setAttribute(ATTR_AWS_SECRETSMANAGER_SECRET_ARN, secretArn);\n }\n }\n}\n"]}
|
|
@@ -3,18 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.SnsServiceExtension = void 0;
|
|
4
4
|
/*
|
|
5
5
|
* Copyright The OpenTelemetry Authors
|
|
6
|
-
*
|
|
7
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
-
* you may not use this file except in compliance with the License.
|
|
9
|
-
* You may obtain a copy of the License at
|
|
10
|
-
*
|
|
11
|
-
* https://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
-
*
|
|
13
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
-
* See the License for the specific language governing permissions and
|
|
17
|
-
* limitations under the License.
|
|
6
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
18
7
|
*/
|
|
19
8
|
const api_1 = require("@opentelemetry/api");
|
|
20
9
|
const semconv_1 = require("../semconv");
|