Skip to content

Commit 510a5d5

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 6d86b25 commit 510a5d5

4 files changed

Lines changed: 1348 additions & 4 deletions

File tree

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: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
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-ioredis': {
39+
enabled: true,
40+
requireParentSpan: true,
41+
},
42+
'@opentelemetry/instrumentation-http': { enabled: true },
43+
'@opentelemetry/instrumentation-express': { enabled: true },
44+
'@opentelemetry/instrumentation-mongodb': {
45+
enabled: true,
46+
enhancedDatabaseReporting: true,
47+
useCollectionName: false,
48+
captureCommandDetails: false,
49+
},
50+
'@opentelemetry/instrumentation-aws-sdk': { enabled: false },
51+
}),
52+
],
53+
});
54+
55+
sdk.start();
56+
57+
const shutdown = () => sdk.shutdown().catch(() => {});
58+
process.on('SIGTERM', shutdown);
59+
process.on('SIGINT', shutdown);
60+
}
61+
62+
module.exports = { sdk };

package.json

Lines changed: 8 additions & 1 deletion
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.9",
3440
"async": "2.6.4",
@@ -85,7 +91,8 @@
8591
"resolutions": {
8692
"jsonwebtoken": "^9.0.0",
8793
"nan": "v2.22.0",
88-
"fast-xml-parser": "^5.5.6"
94+
"fast-xml-parser": "^5.5.6",
95+
"@types/pg": "8.6.1"
8996
},
9097
"mocha": {
9198
"recursive": true,

0 commit comments

Comments
 (0)