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
90
91
92
93
94
|
import { SequelizeInstrumentation } from 'opentelemetry-instrumentation-sequelize'
import { context, diag, DiagLogLevel, trace } from '@opentelemetry/api'
import { JaegerExporter } from '@opentelemetry/exporter-jaeger'
import { registerInstrumentations } from '@opentelemetry/instrumentation'
import { DnsInstrumentation } from '@opentelemetry/instrumentation-dns'
import { ExpressInstrumentation } from '@opentelemetry/instrumentation-express'
import FsInstrumentation from '@opentelemetry/instrumentation-fs'
import { HttpInstrumentation } from '@opentelemetry/instrumentation-http'
import { PgInstrumentation } from '@opentelemetry/instrumentation-pg'
import { RedisInstrumentation } from '@opentelemetry/instrumentation-redis-4'
import { Resource } from '@opentelemetry/resources'
import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base'
import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node'
import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'
import { logger } from '@server/helpers/logger'
import { CONFIG } from '@server/initializers/config'
const tracer = trace.getTracer('peertube')
function registerOpentelemetryTracing () {
if (CONFIG.OPEN_TELEMETRY.TRACING.ENABLED !== true) return
logger.info('Registering Open Telemetry tracing')
const customLogger = (level: string) => {
return (message: string, ...args: unknown[]) => {
let fullMessage = message
for (const arg of args) {
if (typeof arg === 'string') fullMessage += arg
else break
}
logger[level](fullMessage)
}
}
diag.setLogger({
error: customLogger('error'),
warn: customLogger('warn'),
info: customLogger('info'),
debug: customLogger('debug'),
verbose: customLogger('verbose')
}, DiagLogLevel.INFO)
const tracerProvider = new NodeTracerProvider({
resource: new Resource({
[SemanticResourceAttributes.SERVICE_NAME]: 'peertube'
})
})
registerInstrumentations({
tracerProvider,
instrumentations: [
new PgInstrumentation({
enhancedDatabaseReporting: true
}),
new DnsInstrumentation(),
new HttpInstrumentation(),
new ExpressInstrumentation(),
new RedisInstrumentation({
dbStatementSerializer: function (cmdName, cmdArgs) {
return [ cmdName, ...cmdArgs ].join(' ')
}
}),
new FsInstrumentation(),
new SequelizeInstrumentation()
]
})
tracerProvider.addSpanProcessor(
new BatchSpanProcessor(
new JaegerExporter({ endpoint: CONFIG.OPEN_TELEMETRY.TRACING.JAEGER_EXPORTER.ENDPOINT })
)
)
tracerProvider.register()
}
async function wrapWithSpanAndContext <T> (spanName: string, cb: () => Promise<T>) {
const span = tracer.startSpan(spanName)
const activeContext = trace.setSpan(context.active(), span)
const result = await context.with(activeContext, () => cb())
span.end()
return result
}
export {
registerOpentelemetryTracing,
tracer,
wrapWithSpanAndContext
}
|