@sveltejs/kit
Version:
SvelteKit is the fastest way to build Svelte apps
66 lines (61 loc) • 1.67 kB
JavaScript
/** @import { RecordSpan } from 'types' */
import { HttpError, Redirect } from '@sveltejs/kit/internal';
import { noop_span } from './noop.js';
import { otel } from './otel.js';
/** @type {RecordSpan} */
export async function record_span({ name, attributes, fn }) {
if (otel === null) {
return fn(noop_span);
}
const { SpanStatusCode, tracer } = await otel;
return tracer.startActiveSpan(name, { attributes }, async (span) => {
try {
return await fn(span);
} catch (error) {
if (error instanceof HttpError) {
span.setAttributes({
[`${name}.result.type`]: 'known_error',
[`${name}.result.status`]: error.status,
[`${name}.result.message`]: error.body.message
});
if (error.status >= 500) {
span.recordException({
name: 'HttpError',
message: error.body.message
});
span.setStatus({
code: SpanStatusCode.ERROR,
message: error.body.message
});
}
} else if (error instanceof Redirect) {
span.setAttributes({
[`${name}.result.type`]: 'redirect',
[`${name}.result.status`]: error.status,
[`${name}.result.location`]: error.location
});
} else if (error instanceof Error) {
span.setAttributes({
[`${name}.result.type`]: 'unknown_error'
});
span.recordException({
name: error.name,
message: error.message,
stack: error.stack
});
span.setStatus({
code: SpanStatusCode.ERROR,
message: error.message
});
} else {
span.setAttributes({
[`${name}.result.type`]: 'unknown_error'
});
span.setStatus({ code: SpanStatusCode.ERROR });
}
throw error;
} finally {
span.end();
}
});
}