|
1 | 1 | /* eslint-disable @sentry-internal/sdk/no-optional-chaining */
|
2 |
| -import { captureException, getCurrentHub, startTransaction } from '@sentry/node'; |
3 |
| -import type { Transaction } from '@sentry/types'; |
| 2 | +import type { Span } from '@sentry/core'; |
| 3 | +import { trace } from '@sentry/core'; |
| 4 | +import { captureException } from '@sentry/node'; |
4 | 5 | import {
|
5 | 6 | addExceptionMechanism,
|
6 | 7 | baggageHeaderToDynamicSamplingContext,
|
7 | 8 | extractTraceparentData,
|
8 |
| - isThenable, |
9 | 9 | objectify,
|
10 | 10 | } from '@sentry/utils';
|
11 | 11 | import type { Handle } from '@sveltejs/kit';
|
@@ -51,53 +51,30 @@ function sendErrorToSentry(e: unknown): unknown {
|
51 | 51 | */
|
52 | 52 | export const sentryHandle: Handle = ({ event, resolve }) => {
|
53 | 53 | return domain.create().bind(() => {
|
54 |
| - let maybePromiseResult; |
55 |
| - |
56 | 54 | const sentryTraceHeader = event.request.headers.get('sentry-trace');
|
57 | 55 | const baggageHeader = event.request.headers.get('baggage');
|
58 | 56 | const traceparentData = sentryTraceHeader ? extractTraceparentData(sentryTraceHeader) : undefined;
|
59 | 57 | const dynamicSamplingContext = baggageHeaderToDynamicSamplingContext(baggageHeader);
|
60 | 58 |
|
61 |
| - // transaction could be undefined if hub extensions were not added. |
62 |
| - const transaction: Transaction | undefined = startTransaction({ |
63 |
| - op: 'http.server', |
64 |
| - name: `${event.request.method} ${event.route.id}`, |
65 |
| - status: 'ok', |
66 |
| - ...traceparentData, |
67 |
| - metadata: { |
68 |
| - source: 'route', |
69 |
| - dynamicSamplingContext: traceparentData && !dynamicSamplingContext ? {} : dynamicSamplingContext, |
70 |
| - }, |
71 |
| - }); |
72 |
| - |
73 |
| - getCurrentHub().getScope()?.setSpan(transaction); |
74 |
| - |
75 |
| - try { |
76 |
| - maybePromiseResult = resolve(event); |
77 |
| - } catch (e) { |
78 |
| - transaction?.setStatus('internal_error'); |
79 |
| - const sentryError = sendErrorToSentry(e); |
80 |
| - transaction?.finish(); |
81 |
| - throw sentryError; |
82 |
| - } |
83 |
| - |
84 |
| - if (isThenable(maybePromiseResult)) { |
85 |
| - Promise.resolve(maybePromiseResult).then( |
86 |
| - response => { |
87 |
| - transaction?.setHttpStatus(response.status); |
88 |
| - transaction?.finish(); |
89 |
| - }, |
90 |
| - e => { |
91 |
| - transaction?.setStatus('internal_error'); |
92 |
| - sendErrorToSentry(e); |
93 |
| - transaction?.finish(); |
| 59 | + return trace( |
| 60 | + { |
| 61 | + op: 'http.server', |
| 62 | + name: `${event.request.method} ${event.route.id}`, |
| 63 | + status: 'ok', |
| 64 | + ...traceparentData, |
| 65 | + metadata: { |
| 66 | + source: 'route', |
| 67 | + dynamicSamplingContext: traceparentData && !dynamicSamplingContext ? {} : dynamicSamplingContext, |
94 | 68 | },
|
95 |
| - ); |
96 |
| - } else { |
97 |
| - transaction?.setHttpStatus(maybePromiseResult.status); |
98 |
| - transaction?.finish(); |
99 |
| - } |
100 |
| - |
101 |
| - return maybePromiseResult; |
| 69 | + }, |
| 70 | + async (span?: Span) => { |
| 71 | + const res = await resolve(event); |
| 72 | + if (span) { |
| 73 | + span.setHttpStatus(res.status); |
| 74 | + } |
| 75 | + return res; |
| 76 | + }, |
| 77 | + sendErrorToSentry, |
| 78 | + ); |
102 | 79 | })();
|
103 | 80 | };
|
0 commit comments