@sentry/core
Version:
Base implementation for all Sentry JavaScript SDKs
82 lines (78 loc) • 3.35 kB
JavaScript
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
const is = require('../../utils/is.js');
const spanstatus = require('../spanstatus.js');
const trace = require('../trace.js');
const utils = require('../ai/utils.js');
const streaming = require('./streaming.js');
const utils$1 = require('./utils.js');
function isReadableStream(value) {
return is.isObjectLike(value) && typeof value.pipeThrough === "function" && typeof value.getReader === "function";
}
function instrumentRun(originalRun, context, options) {
return function instrumentedRun(...args) {
const [model, inputs, runOptions] = args;
const operationName = utils$1.getOperationName(inputs);
const requestAttributes = utils$1.extractRequestAttributes(model, inputs, operationName);
const modelName = typeof model === "string" ? model : "unknown";
const isStreamRequested = !!inputs && typeof inputs === "object" && inputs.stream === true;
const returnsRawResponse = !!runOptions && typeof runOptions === "object" && (runOptions.returnRawResponse === true || runOptions.websocket === true);
const spanConfig = {
name: `${operationName} ${modelName}`,
op: `gen_ai.${operationName}`,
attributes: requestAttributes
};
if (isStreamRequested && !returnsRawResponse) {
return trace.startSpanManual(spanConfig, (span) => {
const handleError = (error) => {
span.setStatus({ code: spanstatus.SPAN_STATUS_ERROR, message: "internal_error" });
span.end();
throw error;
};
let originalResult;
try {
originalResult = originalRun.apply(context, args);
} catch (error) {
return handleError(error);
}
if (options.recordInputs) {
utils$1.addRequestAttributes(span, inputs, operationName, utils.shouldEnableTruncation(options.enableTruncation));
}
return originalResult.then((result) => {
if (isReadableStream(result)) {
return streaming.instrumentWorkersAiStream(result, span, options.recordOutputs);
}
utils$1.addResponseAttributes(span, result, options.recordOutputs);
span.end();
return result;
}, handleError);
});
}
return trace.startSpan(spanConfig, (span) => {
const originalResult = originalRun.apply(context, args);
if (options.recordInputs) {
utils$1.addRequestAttributes(span, inputs, operationName, utils.shouldEnableTruncation(options.enableTruncation));
}
return originalResult.then((result) => {
if (!returnsRawResponse) {
utils$1.addResponseAttributes(span, result, options.recordOutputs);
}
return result;
});
});
};
}
function instrumentWorkersAiClient(client, options) {
const resolvedOptions = utils.resolveAIRecordingOptions(options);
const instrumented = new Proxy(client, {
get(target, prop, receiver) {
const value = Reflect.get(target, prop, receiver);
if (prop === "run" && typeof value === "function") {
return instrumentRun(value, target, resolvedOptions);
}
return typeof value === "function" ? value.bind(target) : value;
}
});
return instrumented;
}
exports.instrumentWorkersAiClient = instrumentWorkersAiClient;
//# sourceMappingURL=index.js.map