]>
Commit | Line | Data |
---|---|---|
1 | import { SequelizeInstrumentation } from 'opentelemetry-instrumentation-sequelize' | |
2 | import { context, diag, DiagLogLevel, trace } from '@opentelemetry/api' | |
3 | import { JaegerExporter } from '@opentelemetry/exporter-jaeger' | |
4 | import { registerInstrumentations } from '@opentelemetry/instrumentation' | |
5 | import { DnsInstrumentation } from '@opentelemetry/instrumentation-dns' | |
6 | import { ExpressInstrumentation } from '@opentelemetry/instrumentation-express' | |
7 | import FsInstrumentation from '@opentelemetry/instrumentation-fs' | |
8 | import { HttpInstrumentation } from '@opentelemetry/instrumentation-http' | |
9 | import { IORedisInstrumentation } from '@opentelemetry/instrumentation-ioredis' | |
10 | import { PgInstrumentation } from '@opentelemetry/instrumentation-pg' | |
11 | import { Resource } from '@opentelemetry/resources' | |
12 | import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base' | |
13 | import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node' | |
14 | import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions' | |
15 | import { logger } from '@server/helpers/logger' | |
16 | import { CONFIG } from '@server/initializers/config' | |
17 | ||
18 | const tracer = trace.getTracer('peertube') | |
19 | ||
20 | function registerOpentelemetryTracing () { | |
21 | if (CONFIG.OPEN_TELEMETRY.TRACING.ENABLED !== true) return | |
22 | ||
23 | logger.info('Registering Open Telemetry tracing') | |
24 | ||
25 | const customLogger = (level: string) => { | |
26 | return (message: string, ...args: unknown[]) => { | |
27 | let fullMessage = message | |
28 | ||
29 | for (const arg of args) { | |
30 | if (typeof arg === 'string') fullMessage += arg | |
31 | else break | |
32 | } | |
33 | ||
34 | logger[level](fullMessage) | |
35 | } | |
36 | } | |
37 | ||
38 | diag.setLogger({ | |
39 | error: customLogger('error'), | |
40 | warn: customLogger('warn'), | |
41 | info: customLogger('info'), | |
42 | debug: customLogger('debug'), | |
43 | verbose: customLogger('verbose') | |
44 | }, DiagLogLevel.INFO) | |
45 | ||
46 | const tracerProvider = new NodeTracerProvider({ | |
47 | resource: new Resource({ | |
48 | [SemanticResourceAttributes.SERVICE_NAME]: 'peertube' | |
49 | }) | |
50 | }) | |
51 | ||
52 | registerInstrumentations({ | |
53 | tracerProvider, | |
54 | instrumentations: [ | |
55 | new PgInstrumentation({ | |
56 | enhancedDatabaseReporting: true | |
57 | }), | |
58 | new DnsInstrumentation(), | |
59 | new HttpInstrumentation(), | |
60 | new ExpressInstrumentation(), | |
61 | new IORedisInstrumentation({ | |
62 | dbStatementSerializer: function (cmdName, cmdArgs) { | |
63 | return [ cmdName, ...cmdArgs ].join(' ') | |
64 | } | |
65 | }), | |
66 | new FsInstrumentation(), | |
67 | new SequelizeInstrumentation() | |
68 | ] | |
69 | }) | |
70 | ||
71 | tracerProvider.addSpanProcessor( | |
72 | new BatchSpanProcessor( | |
73 | new JaegerExporter({ endpoint: CONFIG.OPEN_TELEMETRY.TRACING.JAEGER_EXPORTER.ENDPOINT }) | |
74 | ) | |
75 | ) | |
76 | ||
77 | tracerProvider.register() | |
78 | } | |
79 | ||
80 | async function wrapWithSpanAndContext <T> (spanName: string, cb: () => Promise<T>) { | |
81 | const span = tracer.startSpan(spanName) | |
82 | const activeContext = trace.setSpan(context.active(), span) | |
83 | ||
84 | const result = await context.with(activeContext, () => cb()) | |
85 | span.end() | |
86 | ||
87 | return result | |
88 | } | |
89 | ||
90 | export { | |
91 | registerOpentelemetryTracing, | |
92 | tracer, | |
93 | wrapWithSpanAndContext | |
94 | } |