@traceloop/instrumentation-bedrock 0.5.6 → 0.5.19

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.
@@ -6,7 +6,9 @@ export declare class BedrockInstrumentation extends InstrumentationBase<any> {
6
6
  constructor(config?: BedrockInstrumentationConfig);
7
7
  setConfig(config?: BedrockInstrumentationConfig): void;
8
8
  protected init(): InstrumentationModuleDefinition<any>;
9
- manuallyInstrument(module: typeof bedrock): void;
9
+ manuallyInstrument(module: typeof bedrock & {
10
+ openLLMetryPatched?: boolean;
11
+ }): void;
10
12
  private wrap;
11
13
  private unwrap;
12
14
  private wrapperMethod;
@@ -1,4 +1,13 @@
1
1
  "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
2
11
  var __asyncValues = (this && this.__asyncValues) || function (o) {
3
12
  if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
4
13
  var m = o[Symbol.asyncIterator], i;
@@ -38,13 +47,22 @@ class BedrockInstrumentation extends instrumentation_1.InstrumentationBase {
38
47
  return module;
39
48
  }
40
49
  manuallyInstrument(module) {
50
+ if (module.openLLMetryPatched) {
51
+ return;
52
+ }
53
+ module.openLLMetryPatched = true;
41
54
  this._wrap(module.BedrockRuntimeClient.prototype, "send", this.wrapperMethod());
42
55
  }
43
56
  wrap(module) {
57
+ if (module.openLLMetryPatched) {
58
+ return module;
59
+ }
60
+ module.openLLMetryPatched = true;
44
61
  this._wrap(module.BedrockRuntimeClient.prototype, "send", this.wrapperMethod());
45
62
  return module;
46
63
  }
47
64
  unwrap(module) {
65
+ module.openLLMetryPatched = false;
48
66
  this._unwrap(module.BedrockRuntimeClient.prototype, "send");
49
67
  }
50
68
  wrapperMethod() {
@@ -71,13 +89,13 @@ class BedrockInstrumentation extends instrumentation_1.InstrumentationBase {
71
89
  }
72
90
  _wrapPromise(span, promise) {
73
91
  return promise
74
- .then(async (result) => {
75
- await this._endSpan({
92
+ .then((result) => __awaiter(this, void 0, void 0, function* () {
93
+ yield this._endSpan({
76
94
  span,
77
95
  result: result,
78
96
  });
79
97
  return new Promise((resolve) => resolve(result));
80
- })
98
+ }))
81
99
  .catch((error) => {
82
100
  return new Promise((_, reject) => {
83
101
  span.setStatus({
@@ -109,62 +127,64 @@ class BedrockInstrumentation extends instrumentation_1.InstrumentationBase {
109
127
  attributes,
110
128
  });
111
129
  }
112
- async _endSpan({ span, result, }) {
130
+ _endSpan({ span, result, }) {
113
131
  var _a, e_1, _b, _c;
114
132
  var _d;
115
- if ("body" in result) {
116
- const attributes = "attributes" in span ? span["attributes"] : {};
117
- if (ai_semantic_conventions_1.SpanAttributes.LLM_VENDOR in attributes) {
118
- if (!(result.body instanceof Object.getPrototypeOf(Uint8Array))) {
119
- const rawRes = result.body;
120
- let streamedContent = "";
121
- try {
122
- for (var _e = true, rawRes_1 = __asyncValues(rawRes), rawRes_1_1; rawRes_1_1 = await rawRes_1.next(), _a = rawRes_1_1.done, !_a; _e = true) {
123
- _c = rawRes_1_1.value;
124
- _e = false;
125
- const value = _c;
126
- // Convert it to a JSON String
127
- const jsonString = new TextDecoder().decode((_d = value.chunk) === null || _d === void 0 ? void 0 : _d.bytes);
128
- // Parse the JSON string
129
- const parsedResponse = JSON.parse(jsonString);
130
- if ("amazon-bedrock-invocationMetrics" in parsedResponse) {
131
- span.setAttribute(ai_semantic_conventions_1.SpanAttributes.LLM_USAGE_PROMPT_TOKENS, parsedResponse["amazon-bedrock-invocationMetrics"]["inputTokenCount"]);
132
- span.setAttribute(ai_semantic_conventions_1.SpanAttributes.LLM_USAGE_COMPLETION_TOKENS, parsedResponse["amazon-bedrock-invocationMetrics"]["outputTokenCount"]);
133
- span.setAttribute(ai_semantic_conventions_1.SpanAttributes.LLM_USAGE_TOTAL_TOKENS, parsedResponse["amazon-bedrock-invocationMetrics"]["inputTokenCount"] +
134
- parsedResponse["amazon-bedrock-invocationMetrics"]["outputTokenCount"]);
133
+ return __awaiter(this, void 0, void 0, function* () {
134
+ if ("body" in result) {
135
+ const attributes = "attributes" in span ? span["attributes"] : {};
136
+ if (ai_semantic_conventions_1.SpanAttributes.LLM_VENDOR in attributes) {
137
+ if (!(result.body instanceof Object.getPrototypeOf(Uint8Array))) {
138
+ const rawRes = result.body;
139
+ let streamedContent = "";
140
+ try {
141
+ for (var _e = true, rawRes_1 = __asyncValues(rawRes), rawRes_1_1; rawRes_1_1 = yield rawRes_1.next(), _a = rawRes_1_1.done, !_a; _e = true) {
142
+ _c = rawRes_1_1.value;
143
+ _e = false;
144
+ const value = _c;
145
+ // Convert it to a JSON String
146
+ const jsonString = new TextDecoder().decode((_d = value.chunk) === null || _d === void 0 ? void 0 : _d.bytes);
147
+ // Parse the JSON string
148
+ const parsedResponse = JSON.parse(jsonString);
149
+ if ("amazon-bedrock-invocationMetrics" in parsedResponse) {
150
+ span.setAttribute(ai_semantic_conventions_1.SpanAttributes.LLM_USAGE_PROMPT_TOKENS, parsedResponse["amazon-bedrock-invocationMetrics"]["inputTokenCount"]);
151
+ span.setAttribute(ai_semantic_conventions_1.SpanAttributes.LLM_USAGE_COMPLETION_TOKENS, parsedResponse["amazon-bedrock-invocationMetrics"]["outputTokenCount"]);
152
+ span.setAttribute(ai_semantic_conventions_1.SpanAttributes.LLM_USAGE_TOTAL_TOKENS, parsedResponse["amazon-bedrock-invocationMetrics"]["inputTokenCount"] +
153
+ parsedResponse["amazon-bedrock-invocationMetrics"]["outputTokenCount"]);
154
+ }
155
+ let responseAttributes = this._setResponseAttributes(attributes[ai_semantic_conventions_1.SpanAttributes.LLM_VENDOR], parsedResponse, true);
156
+ // ! NOTE: This make sure the content always have all streamed chunks
157
+ if (this._shouldSendPrompts()) {
158
+ // Update local value with attribute value that was set by _setResponseAttributes
159
+ streamedContent +=
160
+ responseAttributes[`${ai_semantic_conventions_1.SpanAttributes.LLM_COMPLETIONS}.0.content`];
161
+ // re-assign the new value to responseAttributes
162
+ responseAttributes = Object.assign(Object.assign({}, responseAttributes), { [`${ai_semantic_conventions_1.SpanAttributes.LLM_COMPLETIONS}.0.content`]: streamedContent });
163
+ }
164
+ span.setAttributes(responseAttributes);
135
165
  }
136
- let responseAttributes = this._setResponseAttributes(attributes[ai_semantic_conventions_1.SpanAttributes.LLM_VENDOR], parsedResponse, true);
137
- // ! NOTE: This make sure the content always have all streamed chunks
138
- if (this._shouldSendPrompts()) {
139
- // Update local value with attribute value that was set by _setResponseAttributes
140
- streamedContent +=
141
- responseAttributes[`${ai_semantic_conventions_1.SpanAttributes.LLM_COMPLETIONS}.0.content`];
142
- // re-assign the new value to responseAttributes
143
- responseAttributes = Object.assign(Object.assign({}, responseAttributes), { [`${ai_semantic_conventions_1.SpanAttributes.LLM_COMPLETIONS}.0.content`]: streamedContent });
166
+ }
167
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
168
+ finally {
169
+ try {
170
+ if (!_e && !_a && (_b = rawRes_1.return)) yield _b.call(rawRes_1);
144
171
  }
145
- span.setAttributes(responseAttributes);
172
+ finally { if (e_1) throw e_1.error; }
146
173
  }
147
174
  }
148
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
149
- finally {
150
- try {
151
- if (!_e && !_a && (_b = rawRes_1.return)) await _b.call(rawRes_1);
152
- }
153
- finally { if (e_1) throw e_1.error; }
175
+ else if (result.body instanceof Object.getPrototypeOf(Uint8Array)) {
176
+ // Convert it to a JSON String
177
+ const jsonString = new TextDecoder().decode(result.body);
178
+ // Parse the JSON string
179
+ const parsedResponse = JSON.parse(jsonString);
180
+ const responseAttributes = this._setResponseAttributes(attributes[ai_semantic_conventions_1.SpanAttributes.LLM_VENDOR], parsedResponse);
181
+ span.setAttributes(responseAttributes);
154
182
  }
155
183
  }
156
- else if (result.body instanceof Object.getPrototypeOf(Uint8Array)) {
157
- // Convert it to a JSON String
158
- const jsonString = new TextDecoder().decode(result.body);
159
- // Parse the JSON string
160
- const parsedResponse = JSON.parse(jsonString);
161
- const responseAttributes = this._setResponseAttributes(attributes[ai_semantic_conventions_1.SpanAttributes.LLM_VENDOR], parsedResponse);
162
- span.setAttributes(responseAttributes);
163
- }
164
184
  }
165
- }
166
- span.setStatus({ code: api_1.SpanStatusCode.OK });
167
- span.end();
185
+ span.setStatus({ code: api_1.SpanStatusCode.OK });
186
+ span.end();
187
+ });
168
188
  }
169
189
  _setRequestAttributes(vendor, requestBody) {
170
190
  switch (vendor) {
@@ -1 +1 @@
1
- {"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../src/instrumentation.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright Traceloop\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 Span,\n Attributes,\n SpanKind,\n SpanStatusCode,\n context,\n trace,\n} from \"@opentelemetry/api\";\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n safeExecuteInTheMiddle,\n} from \"@opentelemetry/instrumentation\";\nimport { BedrockInstrumentationConfig } from \"./types\";\nimport * as bedrock from \"@aws-sdk/client-bedrock-runtime\";\nimport {\n CONTEXT_KEY_ALLOW_TRACE_CONTENT,\n LLMRequestTypeValues,\n SpanAttributes,\n} from \"@traceloop/ai-semantic-conventions\";\n\nexport class BedrockInstrumentation extends InstrumentationBase<any> {\n protected override _config!: BedrockInstrumentationConfig;\n\n constructor(config: BedrockInstrumentationConfig = {}) {\n super(\"@traceloop/instrumentation-bedrock\", \"0.3.0\", config);\n }\n\n public override setConfig(config: BedrockInstrumentationConfig = {}) {\n super.setConfig(config);\n }\n\n protected init(): InstrumentationModuleDefinition<any> {\n const module = new InstrumentationNodeModuleDefinition<any>(\n \"@aws-sdk/client-bedrock-runtime\",\n [\">=3.499.0\"],\n this.wrap.bind(this),\n this.unwrap.bind(this),\n );\n\n return module;\n }\n\n public manuallyInstrument(module: typeof bedrock) {\n this._wrap(\n module.BedrockRuntimeClient.prototype,\n \"send\",\n this.wrapperMethod(),\n );\n }\n\n private wrap(module: typeof bedrock) {\n this._wrap(\n module.BedrockRuntimeClient.prototype,\n \"send\",\n this.wrapperMethod(),\n );\n\n return module;\n }\n\n private unwrap(module: typeof bedrock) {\n this._unwrap(module.BedrockRuntimeClient.prototype, \"send\");\n }\n\n private wrapperMethod() {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const plugin = this;\n // eslint-disable-next-line @typescript-eslint/ban-types\n return (original: Function) => {\n return function method(this: any, ...args: any) {\n const span = plugin._startSpan({\n params: args[0],\n });\n const execContext = trace.setSpan(context.active(), span);\n const execPromise = safeExecuteInTheMiddle(\n () => {\n return context.with(execContext, () => {\n return original.apply(this, args);\n });\n },\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n () => {},\n );\n const wrappedPromise = plugin._wrapPromise(span, execPromise);\n return context.bind(execContext, wrappedPromise);\n };\n };\n }\n private _wrapPromise<T>(span: Span, promise: Promise<T>): Promise<T> {\n return promise\n .then(async (result) => {\n await this._endSpan({\n span,\n result: result as\n | bedrock.InvokeModelCommandOutput\n | bedrock.InvokeModelWithResponseStreamCommandOutput,\n });\n\n return new Promise<T>((resolve) => resolve(result));\n })\n .catch((error: Error) => {\n return new Promise<T>((_, reject) => {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n span.recordException(error);\n span.end();\n\n reject(error);\n });\n });\n }\n\n private _startSpan({\n params,\n }: {\n params: Parameters<bedrock.BedrockRuntimeClient[\"send\"]>[0];\n }): Span {\n const [vendor, model] = params.input.modelId\n ? params.input.modelId.split(\".\")\n : [\"\", \"\"];\n\n let attributes: Attributes = {\n [SpanAttributes.LLM_VENDOR]: vendor,\n [SpanAttributes.LLM_REQUEST_MODEL]: model,\n [SpanAttributes.LLM_RESPONSE_MODEL]: model,\n [SpanAttributes.LLM_REQUEST_TYPE]: LLMRequestTypeValues.COMPLETION,\n };\n\n if (typeof params.input.body === \"string\") {\n const requestBody = JSON.parse(params.input.body);\n\n attributes = {\n ...attributes,\n ...this._setRequestAttributes(vendor, requestBody),\n };\n }\n\n return this.tracer.startSpan(`bedrock.completion`, {\n kind: SpanKind.CLIENT,\n attributes,\n });\n }\n\n private async _endSpan({\n span,\n result,\n }: {\n span: Span;\n result:\n | bedrock.InvokeModelCommandOutput\n | bedrock.InvokeModelWithResponseStreamCommandOutput;\n }) {\n if (\"body\" in result) {\n const attributes =\n \"attributes\" in span ? (span[\"attributes\"] as Record<string, any>) : {};\n\n if (SpanAttributes.LLM_VENDOR in attributes) {\n if (!(result.body instanceof Object.getPrototypeOf(Uint8Array))) {\n const rawRes = result.body as AsyncIterable<bedrock.ResponseStream>;\n\n let streamedContent = \"\";\n for await (const value of rawRes) {\n // Convert it to a JSON String\n const jsonString = new TextDecoder().decode(value.chunk?.bytes);\n // Parse the JSON string\n const parsedResponse = JSON.parse(jsonString);\n\n if (\"amazon-bedrock-invocationMetrics\" in parsedResponse) {\n span.setAttribute(\n SpanAttributes.LLM_USAGE_PROMPT_TOKENS,\n parsedResponse[\"amazon-bedrock-invocationMetrics\"][\n \"inputTokenCount\"\n ],\n );\n span.setAttribute(\n SpanAttributes.LLM_USAGE_COMPLETION_TOKENS,\n parsedResponse[\"amazon-bedrock-invocationMetrics\"][\n \"outputTokenCount\"\n ],\n );\n\n span.setAttribute(\n SpanAttributes.LLM_USAGE_TOTAL_TOKENS,\n parsedResponse[\"amazon-bedrock-invocationMetrics\"][\n \"inputTokenCount\"\n ] +\n parsedResponse[\"amazon-bedrock-invocationMetrics\"][\n \"outputTokenCount\"\n ],\n );\n }\n\n let responseAttributes = this._setResponseAttributes(\n attributes[SpanAttributes.LLM_VENDOR],\n parsedResponse,\n true,\n );\n\n // ! NOTE: This make sure the content always have all streamed chunks\n if (this._shouldSendPrompts()) {\n // Update local value with attribute value that was set by _setResponseAttributes\n streamedContent +=\n responseAttributes[\n `${SpanAttributes.LLM_COMPLETIONS}.0.content`\n ];\n // re-assign the new value to responseAttributes\n responseAttributes = {\n ...responseAttributes,\n [`${SpanAttributes.LLM_COMPLETIONS}.0.content`]:\n streamedContent,\n };\n }\n\n span.setAttributes(responseAttributes);\n }\n } else if (result.body instanceof Object.getPrototypeOf(Uint8Array)) {\n // Convert it to a JSON String\n const jsonString = new TextDecoder().decode(\n result.body as Uint8Array,\n );\n // Parse the JSON string\n const parsedResponse = JSON.parse(jsonString);\n\n const responseAttributes = this._setResponseAttributes(\n attributes[SpanAttributes.LLM_VENDOR],\n parsedResponse,\n );\n\n span.setAttributes(responseAttributes);\n }\n }\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n }\n\n private _setRequestAttributes(\n vendor: string,\n requestBody: Record<string, any>,\n ) {\n switch (vendor) {\n case \"ai21\": {\n return {\n [SpanAttributes.LLM_TOP_P]: requestBody[\"topP\"],\n [SpanAttributes.LLM_TEMPERATURE]: requestBody[\"temperature\"],\n [SpanAttributes.LLM_REQUEST_MAX_TOKENS]: requestBody[\"maxTokens\"],\n [SpanAttributes.LLM_PRESENCE_PENALTY]:\n requestBody[\"presencePenalty\"][\"scale\"],\n [SpanAttributes.LLM_FREQUENCY_PENALTY]:\n requestBody[\"frequencyPenalty\"][\"scale\"],\n\n // Prompt & Role\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_PROMPTS}.0.role`]: \"user\",\n [`${SpanAttributes.LLM_PROMPTS}.0.content`]:\n requestBody[\"prompt\"],\n }\n : {}),\n };\n }\n case \"amazon\": {\n return {\n [SpanAttributes.LLM_TOP_P]:\n requestBody[\"textGenerationConfig\"][\"topP\"],\n [SpanAttributes.LLM_TEMPERATURE]:\n requestBody[\"textGenerationConfig\"][\"temperature\"],\n [SpanAttributes.LLM_REQUEST_MAX_TOKENS]:\n requestBody[\"textGenerationConfig\"][\"maxTokenCount\"],\n\n // Prompt & Role\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_PROMPTS}.0.role`]: \"user\",\n [`${SpanAttributes.LLM_PROMPTS}.0.content`]:\n requestBody[\"inputText\"],\n }\n : {}),\n };\n }\n case \"anthropic\": {\n return {\n [SpanAttributes.LLM_TOP_P]: requestBody[\"top_p\"],\n [SpanAttributes.LLM_TOP_K]: requestBody[\"top_k\"],\n [SpanAttributes.LLM_TEMPERATURE]: requestBody[\"temperature\"],\n [SpanAttributes.LLM_REQUEST_MAX_TOKENS]:\n requestBody[\"max_tokens_to_sample\"],\n\n // Prompt & Role\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_PROMPTS}.0.role`]: \"user\",\n [`${SpanAttributes.LLM_PROMPTS}.0.content`]: requestBody[\n \"prompt\"\n ]\n // The format is removing when we are setting span attribute\n .replace(\"\\n\\nHuman:\", \"\")\n .replace(\"\\n\\nAssistant:\", \"\"),\n }\n : {}),\n };\n }\n case \"cohere\": {\n return {\n [SpanAttributes.LLM_TOP_P]: requestBody[\"p\"],\n [SpanAttributes.LLM_TOP_K]: requestBody[\"k\"],\n [SpanAttributes.LLM_TEMPERATURE]: requestBody[\"temperature\"],\n [SpanAttributes.LLM_REQUEST_MAX_TOKENS]: requestBody[\"max_tokens\"],\n\n // Prompt & Role\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_PROMPTS}.0.role`]: \"user\",\n [`${SpanAttributes.LLM_PROMPTS}.0.content`]:\n requestBody[\"prompt\"],\n }\n : {}),\n };\n }\n case \"meta\": {\n return {\n [SpanAttributes.LLM_TOP_P]: requestBody[\"top_p\"],\n [SpanAttributes.LLM_TEMPERATURE]: requestBody[\"temperature\"],\n [SpanAttributes.LLM_REQUEST_MAX_TOKENS]: requestBody[\"max_gen_len\"],\n\n // Prompt & Role\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_PROMPTS}.0.role`]: \"user\",\n [`${SpanAttributes.LLM_PROMPTS}.0.content`]:\n requestBody[\"prompt\"],\n }\n : {}),\n };\n }\n default:\n return {};\n }\n }\n\n private _setResponseAttributes(\n vendor: string,\n response: Record<string, any>,\n isStream = false,\n ) {\n switch (vendor) {\n case \"ai21\": {\n return {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.finish_reason`]:\n response[\"completions\"][0][\"finishReason\"][\"reason\"],\n [`${SpanAttributes.LLM_COMPLETIONS}.0.role`]: \"assistant\",\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.content`]:\n response[\"completions\"][0][\"data\"][\"text\"],\n }\n : {}),\n };\n }\n case \"amazon\": {\n return {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.finish_reason`]: isStream\n ? response[\"completionReason\"]\n : response[\"results\"][0][\"completionReason\"],\n [`${SpanAttributes.LLM_COMPLETIONS}.0.role`]: \"assistant\",\n [SpanAttributes.LLM_USAGE_PROMPT_TOKENS]:\n response[\"inputTextTokenCount\"],\n [SpanAttributes.LLM_USAGE_COMPLETION_TOKENS]: isStream\n ? response[\"totalOutputTextTokenCount\"]\n : response[\"results\"][0][\"tokenCount\"],\n [SpanAttributes.LLM_USAGE_TOTAL_TOKENS]: isStream\n ? response[\"inputTextTokenCount\"] +\n response[\"totalOutputTextTokenCount\"]\n : response[\"inputTextTokenCount\"] +\n response[\"results\"][0][\"tokenCount\"],\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.content`]: isStream\n ? response[\"outputText\"]\n : response[\"results\"][0][\"outputText\"],\n }\n : {}),\n };\n }\n case \"anthropic\": {\n return {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.finish_reason`]:\n response[\"stop_reason\"],\n [`${SpanAttributes.LLM_COMPLETIONS}.0.role`]: \"assistant\",\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.content`]:\n response[\"completion\"],\n }\n : {}),\n };\n }\n case \"cohere\": {\n return {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.finish_reason`]:\n response[\"generations\"][0][\"finish_reason\"],\n [`${SpanAttributes.LLM_COMPLETIONS}.0.role`]: \"assistant\",\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.content`]:\n response[\"generations\"][0][\"text\"],\n }\n : {}),\n };\n }\n case \"meta\": {\n return {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.finish_reason`]:\n response[\"stop_reason\"],\n [`${SpanAttributes.LLM_COMPLETIONS}.0.role`]: \"assistant\",\n [SpanAttributes.LLM_USAGE_PROMPT_TOKENS]:\n response[\"prompt_token_count\"],\n [SpanAttributes.LLM_USAGE_COMPLETION_TOKENS]:\n response[\"generation_token_count\"],\n [SpanAttributes.LLM_USAGE_TOTAL_TOKENS]:\n response[\"prompt_token_count\"] + response[\"generation_token_count\"],\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.content`]:\n response[\"generation\"],\n }\n : {}),\n };\n }\n default:\n return {};\n }\n }\n\n private _shouldSendPrompts() {\n const contextShouldSendPrompts = context\n .active()\n .getValue(CONTEXT_KEY_ALLOW_TRACE_CONTENT);\n\n if (contextShouldSendPrompts !== undefined) {\n return contextShouldSendPrompts;\n }\n\n return this._config.traceContent !== undefined\n ? this._config.traceContent\n : true;\n }\n}\n"]}
1
+ {"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../src/instrumentation.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright Traceloop\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 Span,\n Attributes,\n SpanKind,\n SpanStatusCode,\n context,\n trace,\n} from \"@opentelemetry/api\";\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n safeExecuteInTheMiddle,\n} from \"@opentelemetry/instrumentation\";\nimport { BedrockInstrumentationConfig } from \"./types\";\nimport * as bedrock from \"@aws-sdk/client-bedrock-runtime\";\nimport {\n CONTEXT_KEY_ALLOW_TRACE_CONTENT,\n LLMRequestTypeValues,\n SpanAttributes,\n} from \"@traceloop/ai-semantic-conventions\";\n\nexport class BedrockInstrumentation extends InstrumentationBase<any> {\n protected override _config!: BedrockInstrumentationConfig;\n\n constructor(config: BedrockInstrumentationConfig = {}) {\n super(\"@traceloop/instrumentation-bedrock\", \"0.3.0\", config);\n }\n\n public override setConfig(config: BedrockInstrumentationConfig = {}) {\n super.setConfig(config);\n }\n\n protected init(): InstrumentationModuleDefinition<any> {\n const module = new InstrumentationNodeModuleDefinition<any>(\n \"@aws-sdk/client-bedrock-runtime\",\n [\">=3.499.0\"],\n this.wrap.bind(this),\n this.unwrap.bind(this),\n );\n\n return module;\n }\n\n public manuallyInstrument(\n module: typeof bedrock & { openLLMetryPatched?: boolean },\n ) {\n if (module.openLLMetryPatched) {\n return;\n }\n\n module.openLLMetryPatched = true;\n\n this._wrap(\n module.BedrockRuntimeClient.prototype,\n \"send\",\n this.wrapperMethod(),\n );\n }\n\n private wrap(module: typeof bedrock & { openLLMetryPatched?: boolean }) {\n if (module.openLLMetryPatched) {\n return module;\n }\n\n module.openLLMetryPatched = true;\n\n this._wrap(\n module.BedrockRuntimeClient.prototype,\n \"send\",\n this.wrapperMethod(),\n );\n\n return module;\n }\n\n private unwrap(module: typeof bedrock & { openLLMetryPatched?: boolean }) {\n module.openLLMetryPatched = false;\n\n this._unwrap(module.BedrockRuntimeClient.prototype, \"send\");\n }\n\n private wrapperMethod() {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const plugin = this;\n // eslint-disable-next-line @typescript-eslint/ban-types\n return (original: Function) => {\n return function method(this: any, ...args: any) {\n const span = plugin._startSpan({\n params: args[0],\n });\n const execContext = trace.setSpan(context.active(), span);\n const execPromise = safeExecuteInTheMiddle(\n () => {\n return context.with(execContext, () => {\n return original.apply(this, args);\n });\n },\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n () => {},\n );\n const wrappedPromise = plugin._wrapPromise(span, execPromise);\n return context.bind(execContext, wrappedPromise);\n };\n };\n }\n private _wrapPromise<T>(span: Span, promise: Promise<T>): Promise<T> {\n return promise\n .then(async (result) => {\n await this._endSpan({\n span,\n result: result as\n | bedrock.InvokeModelCommandOutput\n | bedrock.InvokeModelWithResponseStreamCommandOutput,\n });\n\n return new Promise<T>((resolve) => resolve(result));\n })\n .catch((error: Error) => {\n return new Promise<T>((_, reject) => {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n span.recordException(error);\n span.end();\n\n reject(error);\n });\n });\n }\n\n private _startSpan({\n params,\n }: {\n params: Parameters<bedrock.BedrockRuntimeClient[\"send\"]>[0];\n }): Span {\n const [vendor, model] = params.input.modelId\n ? params.input.modelId.split(\".\")\n : [\"\", \"\"];\n\n let attributes: Attributes = {\n [SpanAttributes.LLM_VENDOR]: vendor,\n [SpanAttributes.LLM_REQUEST_MODEL]: model,\n [SpanAttributes.LLM_RESPONSE_MODEL]: model,\n [SpanAttributes.LLM_REQUEST_TYPE]: LLMRequestTypeValues.COMPLETION,\n };\n\n if (typeof params.input.body === \"string\") {\n const requestBody = JSON.parse(params.input.body);\n\n attributes = {\n ...attributes,\n ...this._setRequestAttributes(vendor, requestBody),\n };\n }\n\n return this.tracer.startSpan(`bedrock.completion`, {\n kind: SpanKind.CLIENT,\n attributes,\n });\n }\n\n private async _endSpan({\n span,\n result,\n }: {\n span: Span;\n result:\n | bedrock.InvokeModelCommandOutput\n | bedrock.InvokeModelWithResponseStreamCommandOutput;\n }) {\n if (\"body\" in result) {\n const attributes =\n \"attributes\" in span ? (span[\"attributes\"] as Record<string, any>) : {};\n\n if (SpanAttributes.LLM_VENDOR in attributes) {\n if (!(result.body instanceof Object.getPrototypeOf(Uint8Array))) {\n const rawRes = result.body as AsyncIterable<bedrock.ResponseStream>;\n\n let streamedContent = \"\";\n for await (const value of rawRes) {\n // Convert it to a JSON String\n const jsonString = new TextDecoder().decode(value.chunk?.bytes);\n // Parse the JSON string\n const parsedResponse = JSON.parse(jsonString);\n\n if (\"amazon-bedrock-invocationMetrics\" in parsedResponse) {\n span.setAttribute(\n SpanAttributes.LLM_USAGE_PROMPT_TOKENS,\n parsedResponse[\"amazon-bedrock-invocationMetrics\"][\n \"inputTokenCount\"\n ],\n );\n span.setAttribute(\n SpanAttributes.LLM_USAGE_COMPLETION_TOKENS,\n parsedResponse[\"amazon-bedrock-invocationMetrics\"][\n \"outputTokenCount\"\n ],\n );\n\n span.setAttribute(\n SpanAttributes.LLM_USAGE_TOTAL_TOKENS,\n parsedResponse[\"amazon-bedrock-invocationMetrics\"][\n \"inputTokenCount\"\n ] +\n parsedResponse[\"amazon-bedrock-invocationMetrics\"][\n \"outputTokenCount\"\n ],\n );\n }\n\n let responseAttributes = this._setResponseAttributes(\n attributes[SpanAttributes.LLM_VENDOR],\n parsedResponse,\n true,\n );\n\n // ! NOTE: This make sure the content always have all streamed chunks\n if (this._shouldSendPrompts()) {\n // Update local value with attribute value that was set by _setResponseAttributes\n streamedContent +=\n responseAttributes[\n `${SpanAttributes.LLM_COMPLETIONS}.0.content`\n ];\n // re-assign the new value to responseAttributes\n responseAttributes = {\n ...responseAttributes,\n [`${SpanAttributes.LLM_COMPLETIONS}.0.content`]:\n streamedContent,\n };\n }\n\n span.setAttributes(responseAttributes);\n }\n } else if (result.body instanceof Object.getPrototypeOf(Uint8Array)) {\n // Convert it to a JSON String\n const jsonString = new TextDecoder().decode(\n result.body as Uint8Array,\n );\n // Parse the JSON string\n const parsedResponse = JSON.parse(jsonString);\n\n const responseAttributes = this._setResponseAttributes(\n attributes[SpanAttributes.LLM_VENDOR],\n parsedResponse,\n );\n\n span.setAttributes(responseAttributes);\n }\n }\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n }\n\n private _setRequestAttributes(\n vendor: string,\n requestBody: Record<string, any>,\n ) {\n switch (vendor) {\n case \"ai21\": {\n return {\n [SpanAttributes.LLM_TOP_P]: requestBody[\"topP\"],\n [SpanAttributes.LLM_TEMPERATURE]: requestBody[\"temperature\"],\n [SpanAttributes.LLM_REQUEST_MAX_TOKENS]: requestBody[\"maxTokens\"],\n [SpanAttributes.LLM_PRESENCE_PENALTY]:\n requestBody[\"presencePenalty\"][\"scale\"],\n [SpanAttributes.LLM_FREQUENCY_PENALTY]:\n requestBody[\"frequencyPenalty\"][\"scale\"],\n\n // Prompt & Role\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_PROMPTS}.0.role`]: \"user\",\n [`${SpanAttributes.LLM_PROMPTS}.0.content`]:\n requestBody[\"prompt\"],\n }\n : {}),\n };\n }\n case \"amazon\": {\n return {\n [SpanAttributes.LLM_TOP_P]:\n requestBody[\"textGenerationConfig\"][\"topP\"],\n [SpanAttributes.LLM_TEMPERATURE]:\n requestBody[\"textGenerationConfig\"][\"temperature\"],\n [SpanAttributes.LLM_REQUEST_MAX_TOKENS]:\n requestBody[\"textGenerationConfig\"][\"maxTokenCount\"],\n\n // Prompt & Role\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_PROMPTS}.0.role`]: \"user\",\n [`${SpanAttributes.LLM_PROMPTS}.0.content`]:\n requestBody[\"inputText\"],\n }\n : {}),\n };\n }\n case \"anthropic\": {\n return {\n [SpanAttributes.LLM_TOP_P]: requestBody[\"top_p\"],\n [SpanAttributes.LLM_TOP_K]: requestBody[\"top_k\"],\n [SpanAttributes.LLM_TEMPERATURE]: requestBody[\"temperature\"],\n [SpanAttributes.LLM_REQUEST_MAX_TOKENS]:\n requestBody[\"max_tokens_to_sample\"],\n\n // Prompt & Role\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_PROMPTS}.0.role`]: \"user\",\n [`${SpanAttributes.LLM_PROMPTS}.0.content`]: requestBody[\n \"prompt\"\n ]\n // The format is removing when we are setting span attribute\n .replace(\"\\n\\nHuman:\", \"\")\n .replace(\"\\n\\nAssistant:\", \"\"),\n }\n : {}),\n };\n }\n case \"cohere\": {\n return {\n [SpanAttributes.LLM_TOP_P]: requestBody[\"p\"],\n [SpanAttributes.LLM_TOP_K]: requestBody[\"k\"],\n [SpanAttributes.LLM_TEMPERATURE]: requestBody[\"temperature\"],\n [SpanAttributes.LLM_REQUEST_MAX_TOKENS]: requestBody[\"max_tokens\"],\n\n // Prompt & Role\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_PROMPTS}.0.role`]: \"user\",\n [`${SpanAttributes.LLM_PROMPTS}.0.content`]:\n requestBody[\"prompt\"],\n }\n : {}),\n };\n }\n case \"meta\": {\n return {\n [SpanAttributes.LLM_TOP_P]: requestBody[\"top_p\"],\n [SpanAttributes.LLM_TEMPERATURE]: requestBody[\"temperature\"],\n [SpanAttributes.LLM_REQUEST_MAX_TOKENS]: requestBody[\"max_gen_len\"],\n\n // Prompt & Role\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_PROMPTS}.0.role`]: \"user\",\n [`${SpanAttributes.LLM_PROMPTS}.0.content`]:\n requestBody[\"prompt\"],\n }\n : {}),\n };\n }\n default:\n return {};\n }\n }\n\n private _setResponseAttributes(\n vendor: string,\n response: Record<string, any>,\n isStream = false,\n ) {\n switch (vendor) {\n case \"ai21\": {\n return {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.finish_reason`]:\n response[\"completions\"][0][\"finishReason\"][\"reason\"],\n [`${SpanAttributes.LLM_COMPLETIONS}.0.role`]: \"assistant\",\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.content`]:\n response[\"completions\"][0][\"data\"][\"text\"],\n }\n : {}),\n };\n }\n case \"amazon\": {\n return {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.finish_reason`]: isStream\n ? response[\"completionReason\"]\n : response[\"results\"][0][\"completionReason\"],\n [`${SpanAttributes.LLM_COMPLETIONS}.0.role`]: \"assistant\",\n [SpanAttributes.LLM_USAGE_PROMPT_TOKENS]:\n response[\"inputTextTokenCount\"],\n [SpanAttributes.LLM_USAGE_COMPLETION_TOKENS]: isStream\n ? response[\"totalOutputTextTokenCount\"]\n : response[\"results\"][0][\"tokenCount\"],\n [SpanAttributes.LLM_USAGE_TOTAL_TOKENS]: isStream\n ? response[\"inputTextTokenCount\"] +\n response[\"totalOutputTextTokenCount\"]\n : response[\"inputTextTokenCount\"] +\n response[\"results\"][0][\"tokenCount\"],\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.content`]: isStream\n ? response[\"outputText\"]\n : response[\"results\"][0][\"outputText\"],\n }\n : {}),\n };\n }\n case \"anthropic\": {\n return {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.finish_reason`]:\n response[\"stop_reason\"],\n [`${SpanAttributes.LLM_COMPLETIONS}.0.role`]: \"assistant\",\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.content`]:\n response[\"completion\"],\n }\n : {}),\n };\n }\n case \"cohere\": {\n return {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.finish_reason`]:\n response[\"generations\"][0][\"finish_reason\"],\n [`${SpanAttributes.LLM_COMPLETIONS}.0.role`]: \"assistant\",\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.content`]:\n response[\"generations\"][0][\"text\"],\n }\n : {}),\n };\n }\n case \"meta\": {\n return {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.finish_reason`]:\n response[\"stop_reason\"],\n [`${SpanAttributes.LLM_COMPLETIONS}.0.role`]: \"assistant\",\n [SpanAttributes.LLM_USAGE_PROMPT_TOKENS]:\n response[\"prompt_token_count\"],\n [SpanAttributes.LLM_USAGE_COMPLETION_TOKENS]:\n response[\"generation_token_count\"],\n [SpanAttributes.LLM_USAGE_TOTAL_TOKENS]:\n response[\"prompt_token_count\"] + response[\"generation_token_count\"],\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.content`]:\n response[\"generation\"],\n }\n : {}),\n };\n }\n default:\n return {};\n }\n }\n\n private _shouldSendPrompts() {\n const contextShouldSendPrompts = context\n .active()\n .getValue(CONTEXT_KEY_ALLOW_TRACE_CONTENT);\n\n if (contextShouldSendPrompts !== undefined) {\n return contextShouldSendPrompts;\n }\n\n return this._config.traceContent !== undefined\n ? this._config.traceContent\n : true;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@traceloop/instrumentation-bedrock",
3
- "version": "0.5.6",
3
+ "version": "0.5.19",
4
4
  "description": "Amazon Bedrock Instrumentation",
5
5
  "main": "dist/src/index.js",
6
6
  "types": "dist/src/index.d.ts",
@@ -39,7 +39,7 @@
39
39
  "@opentelemetry/core": "^1.22.0",
40
40
  "@opentelemetry/instrumentation": "^0.49.0",
41
41
  "@opentelemetry/semantic-conventions": "^1.22.0",
42
- "@traceloop/ai-semantic-conventions": "^0.5.6"
42
+ "@traceloop/ai-semantic-conventions": "^0.5.19"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@aws-sdk/client-bedrock-runtime": "^3.499.0",
@@ -48,5 +48,5 @@
48
48
  "@pollyjs/persister-fs": "^6.0.6"
49
49
  },
50
50
  "homepage": "https://github.com/traceloop/openllmetry-js/tree/main/packages/instrumentation-openai",
51
- "gitHead": "b2554324fad705dc547954d6976feef89dc769de"
51
+ "gitHead": "bc5b6fe576df03e8518c3721c1ef1b18565e9822"
52
52
  }