Skip to content

Commit 5b74e3d

Browse files
committed
Ensure waitUntilTrace ends spans on errors
1 parent d97074c commit 5b74e3d

2 files changed

Lines changed: 30 additions & 2 deletions

File tree

packages/otel-cf-workers/src/instrumentation/fetch.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,11 @@ function getParentContextFromRequest(request: Request): Context {
146146
export async function waitUntilTrace(fn: () => Promise<unknown>): Promise<void> {
147147
const tracer = trace.getTracer('waitUntil')
148148
return tracer.startActiveSpan('waitUntil', async (span) => {
149-
await fn()
150-
span.end()
149+
try {
150+
await fn()
151+
} finally {
152+
span.end()
153+
}
151154
})
152155
}
153156

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import type { Span, Tracer } from '@opentelemetry/api'
2+
import { trace } from '@opentelemetry/api'
3+
import { describe, expect, it, vitest } from 'vitest'
4+
import { waitUntilTrace } from '../../src/instrumentation/fetch'
5+
6+
describe('waitUntilTrace', () => {
7+
it('ends the span when traced background work rejects', async () => {
8+
const error = new Error('background work failed')
9+
const end = vitest.fn<() => void>()
10+
const span = { end } as unknown as Span
11+
const tracer = {
12+
async startActiveSpan(_name: string, fn: (span: Span) => Promise<void>) {
13+
return fn(span)
14+
},
15+
} as unknown as Tracer
16+
const getTracer = vitest.spyOn(trace, 'getTracer').mockReturnValue(tracer)
17+
18+
try {
19+
await expect(waitUntilTrace(async () => Promise.reject(error))).rejects.toBe(error)
20+
expect(end).toHaveBeenCalledTimes(1)
21+
} finally {
22+
getTracer.mockRestore()
23+
}
24+
})
25+
})

0 commit comments

Comments
 (0)