|
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,28 @@ 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 | + span.setHttpStatus(res.status); |
| 73 | + return res; |
| 74 | + }, |
| 75 | + sendErrorToSentry, |
| 76 | + ); |
102 | 77 | })(); |
103 | 78 | }; |
0 commit comments