-
-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathinstrumentation.ts
89 lines (78 loc) · 2.42 KB
/
instrumentation.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import { CloudPropagator } from '@google-cloud/opentelemetry-cloud-trace-propagator';
import { trace } from '@opentelemetry/api';
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
import { NodeSDK } from '@opentelemetry/sdk-node';
import {
BatchSpanProcessor,
SimpleSpanProcessor,
} from '@opentelemetry/sdk-trace-base';
import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';
import * as Sentry from '@sentry/node';
if (process.env.SENTRY_DSN) {
Sentry.init({
dsn: process.env.SENTRY_DSN,
environment: process.env.NODE_ENV || 'unknown',
release: process.env.K_REVISION,
});
}
const sdk = new NodeSDK({
instrumentations: getNodeAutoInstrumentations({
'@opentelemetry/instrumentation-mysql2': {
addSqlCommenterCommentToQueries: true,
},
}),
});
const provider = new NodeTracerProvider();
let propagator: CloudPropagator | undefined;
if (process.env.K_SERVICE) {
const { TraceExporter } = await import(
'@google-cloud/opentelemetry-cloud-trace-exporter'
);
provider.addSpanProcessor(
new BatchSpanProcessor(
new TraceExporter({
resourceFilter: /.*/, // TODO: filter by our service name?
}),
),
);
propagator = new CloudPropagator();
}
if (process.env.NODE_ENV === 'development') {
const { OTLPTraceExporter } = await import(
'@opentelemetry/exporter-trace-otlp-proto'
);
provider.addSpanProcessor(
new SimpleSpanProcessor(
new OTLPTraceExporter({
url: 'http://jaeger:4318/v1/traces',
}),
),
);
}
provider.register({
propagator,
});
export const tracer = trace.getTracer('activitypub');
try {
sdk.start();
} catch (e) {
console.error(e);
}
export function spanWrapper<TArgs extends unknown[], TReturn>(
fn: (...args: TArgs) => TReturn | Promise<TReturn>,
) {
return (...args: TArgs) => {
return tracer.startActiveSpan(fn.name || 'anonymous', async (span) => {
try {
const result = await Promise.resolve(fn(...args));
span.end();
return result;
} catch (error) {
span.recordException(error as Error);
span.setStatus({ code: 2 }); // OpenTelemetry ERROR status
span.end();
throw error;
}
});
};
}