Skip to content

Commit 2224753

Browse files
authored
feat: add run in span utils (#2)
1 parent e563387 commit 2224753

3 files changed

Lines changed: 68 additions & 0 deletions

File tree

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
},
3939
"dependencies": {
4040
"@google-cloud/pino-logging-gcp-config": "^1.3.1",
41+
"@opentelemetry/api": "^1.9.0",
4142
"pino": "^10.3.1"
4243
},
4344
"devDependencies": {

pnpm-lock.yaml

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/telemetry/index.ts

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import {
2+
type Span,
3+
type SpanOptions,
4+
SpanStatusCode,
5+
trace,
6+
} from '@opentelemetry/api';
7+
8+
export const runInSpan = async <T>(
9+
name: string,
10+
func: (span: Span) => Promise<T>,
11+
options?: SpanOptions,
12+
): Promise<T> =>
13+
trace
14+
.getTracer('runInSpan')
15+
.startActiveSpan(name, options ?? {}, async (span) => {
16+
try {
17+
return await func(span);
18+
} catch (originalError) {
19+
const err = originalError as Error;
20+
21+
span.recordException(err);
22+
span.setStatus({
23+
code: SpanStatusCode.ERROR,
24+
message: err?.message,
25+
});
26+
throw err;
27+
} finally {
28+
span.end();
29+
}
30+
}) as T;
31+
32+
export const runInSpanSync = <T>(
33+
name: string,
34+
func: (span: Span) => T,
35+
options?: SpanOptions,
36+
): T =>
37+
trace.getTracer('runInSpan').startActiveSpan(name, options ?? {}, (span) => {
38+
try {
39+
return func(span);
40+
} catch (originalError) {
41+
const err = originalError as Error;
42+
43+
span.recordException(err);
44+
span.setStatus({
45+
code: SpanStatusCode.ERROR,
46+
message: err?.message,
47+
});
48+
throw err;
49+
} finally {
50+
span.end();
51+
}
52+
}) as T;
53+
54+
export const runInRootSpan = async <T>(
55+
name: string,
56+
func: (span: Span) => Promise<T>,
57+
options?: SpanOptions,
58+
): Promise<T> => runInSpan(name, func, { ...options, root: true });
59+
60+
export const runInRootSpanSync = <T>(
61+
name: string,
62+
func: (span: Span) => T,
63+
options?: SpanOptions,
64+
): T => runInSpanSync(name, func, { ...options, root: true });

0 commit comments

Comments
 (0)