Skip to content

Commit e2b4fac

Browse files
committed
feat: add OpenTelemetry SDK setup with feature flag
Set up the NodeSDK with OTLP/HTTP trace exporter, gated behind ENABLE_OTEL=true. Uses 1% sampling by default to limit collector load. Auto-instruments HTTP, Express and MongoDB while disabling high-volume fs and Redis instrumentations. Issue: CLDSRV-884
1 parent 0c0530c commit e2b4fac

File tree

4 files changed

+1351
-3
lines changed

4 files changed

+1351
-3
lines changed

index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,7 @@ require('werelogs').stderrUtils.catchAndTimestampStderr(
77
require('cluster').isPrimary ? 1 : null,
88
);
99

10+
// Initialize OpenTelemetry SDK before everything else
11+
require('./lib/otel.js');
12+
1013
require('./lib/server.js')();

lib/otel.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
'use strict';
2+
3+
const enableOtel = process.env.ENABLE_OTEL === 'true';
4+
5+
let sdk = null;
6+
7+
if (enableOtel) {
8+
const { NodeSDK } = require('@opentelemetry/sdk-node');
9+
const { Resource } = require('@opentelemetry/resources');
10+
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-http');
11+
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');
12+
const { TraceIdRatioBasedSampler } = require('@opentelemetry/sdk-trace-base');
13+
const { version } = require('../package.json');
14+
15+
const exportUrl = process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT ||
16+
'http://otel-collector.default.svc.cluster.local:4318/v1/traces';
17+
18+
const traceExporter = new OTLPTraceExporter({
19+
url: exportUrl,
20+
});
21+
22+
const parsedRatio = parseFloat(process.env.OTEL_SAMPLING_RATIO);
23+
const samplingRatio = Number.isFinite(parsedRatio) ? parsedRatio : 0.01;
24+
25+
sdk = new NodeSDK({
26+
resource: new Resource({
27+
'service.name': process.env.OTEL_SERVICE_NAME || 'cloudserver',
28+
'service.version': process.env.OTEL_SERVICE_VERSION || version,
29+
'service.namespace': process.env.OTEL_SERVICE_NAMESPACE || 'scality',
30+
}),
31+
traceExporter,
32+
sampler: new TraceIdRatioBasedSampler(samplingRatio),
33+
instrumentations: [
34+
getNodeAutoInstrumentations({
35+
'@opentelemetry/instrumentation-fs': { enabled: false },
36+
'@opentelemetry/instrumentation-redis': { enabled: false },
37+
'@opentelemetry/instrumentation-redis-4': { enabled: false },
38+
'@opentelemetry/instrumentation-http': { enabled: true },
39+
'@opentelemetry/instrumentation-express': { enabled: true },
40+
'@opentelemetry/instrumentation-mongodb': {
41+
enabled: true,
42+
enhancedDatabaseReporting: true,
43+
useCollectionName: false,
44+
captureCommandDetails: false,
45+
},
46+
'@opentelemetry/instrumentation-aws-sdk': { enabled: false },
47+
}),
48+
],
49+
});
50+
51+
sdk.start();
52+
53+
const shutdown = () => sdk.shutdown().catch(() => {});
54+
process.on('SIGTERM', shutdown);
55+
process.on('SIGINT', shutdown);
56+
}
57+
58+
module.exports = { sdk };

package.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@
2929
"@aws-sdk/signature-v4": "^3.374.0",
3030
"@azure/storage-blob": "^12.28.0",
3131
"@hapi/joi": "^17.1.1",
32+
"@opentelemetry/api": "^1.9.0",
33+
"@opentelemetry/auto-instrumentations-node": "^0.50.2",
34+
"@opentelemetry/exporter-trace-otlp-http": "^0.55.0",
35+
"@opentelemetry/resources": "^1.30.1",
36+
"@opentelemetry/sdk-node": "^0.55.0",
37+
"@opentelemetry/sdk-trace-base": "^1.28.0",
3238
"@smithy/node-http-handler": "^3.0.0",
3339
"arsenal": "git+https://github.com/scality/Arsenal#8.3.8",
3440
"async": "2.6.4",

0 commit comments

Comments
 (0)