aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/lib/opentelemetry/tracing.ts
diff options
context:
space:
mode:
authorChocobozzz <me@florianbigard.com>2023-07-31 14:34:36 +0200
committerChocobozzz <me@florianbigard.com>2023-08-11 15:02:33 +0200
commit3a4992633ee62d5edfbb484d9c6bcb3cf158489d (patch)
treee4510b39bdac9c318fdb4b47018d08f15368b8f0 /server/lib/opentelemetry/tracing.ts
parent04d1da5621d25d59bd5fa1543b725c497bf5d9a8 (diff)
downloadPeerTube-3a4992633ee62d5edfbb484d9c6bcb3cf158489d.tar.gz
PeerTube-3a4992633ee62d5edfbb484d9c6bcb3cf158489d.tar.zst
PeerTube-3a4992633ee62d5edfbb484d9c6bcb3cf158489d.zip
Migrate server to ESM
Sorry for the very big commit that may lead to git log issues and merge conflicts, but it's a major step forward: * Server can be faster at startup because imports() are async and we can easily lazy import big modules * Angular doesn't seem to support ES import (with .js extension), so we had to correctly organize peertube into a monorepo: * Use yarn workspace feature * Use typescript reference projects for dependencies * Shared projects have been moved into "packages", each one is now a node module (with a dedicated package.json/tsconfig.json) * server/tools have been moved into apps/ and is now a dedicated app bundled and published on NPM so users don't have to build peertube cli tools manually * server/tests have been moved into packages/ so we don't compile them every time we want to run the server * Use isolatedModule option: * Had to move from const enum to const (https://www.typescriptlang.org/docs/handbook/enums.html#objects-vs-enums) * Had to explictely specify "type" imports when used in decorators * Prefer tsx (that uses esbuild under the hood) instead of ts-node to load typescript files (tests with mocha or scripts): * To reduce test complexity as esbuild doesn't support decorator metadata, we only test server files that do not import server models * We still build tests files into js files for a faster CI * Remove unmaintained peertube CLI import script * Removed some barrels to speed up execution (less imports)
Diffstat (limited to 'server/lib/opentelemetry/tracing.ts')
-rw-r--r--server/lib/opentelemetry/tracing.ts94
1 files changed, 0 insertions, 94 deletions
diff --git a/server/lib/opentelemetry/tracing.ts b/server/lib/opentelemetry/tracing.ts
deleted file mode 100644
index 9a81680b2..000000000
--- a/server/lib/opentelemetry/tracing.ts
+++ /dev/null
@@ -1,94 +0,0 @@
1import { SequelizeInstrumentation } from 'opentelemetry-instrumentation-sequelize'
2import { context, diag, DiagLogLevel, trace } from '@opentelemetry/api'
3import { JaegerExporter } from '@opentelemetry/exporter-jaeger'
4import { registerInstrumentations } from '@opentelemetry/instrumentation'
5import { DnsInstrumentation } from '@opentelemetry/instrumentation-dns'
6import { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'
7import FsInstrumentation from '@opentelemetry/instrumentation-fs'
8import { HttpInstrumentation } from '@opentelemetry/instrumentation-http'
9import { IORedisInstrumentation } from '@opentelemetry/instrumentation-ioredis'
10import { PgInstrumentation } from '@opentelemetry/instrumentation-pg'
11import { Resource } from '@opentelemetry/resources'
12import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base'
13import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node'
14import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'
15import { logger } from '@server/helpers/logger'
16import { CONFIG } from '@server/initializers/config'
17
18const tracer = trace.getTracer('peertube')
19
20function 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
80async 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
90export {
91 registerOpentelemetryTracing,
92 tracer,
93 wrapWithSpanAndContext
94}