diff --git a/package-lock.json b/package-lock.json index e566914f2..eeb337f72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -894,16 +894,6 @@ "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, - "@icebob/node-memwatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@icebob/node-memwatch/-/node-memwatch-2.1.0.tgz", - "integrity": "sha512-tP0D6XzNDajM5XTdC0XrFQJO7SdfybeJf93lm+leP9l9ph4CxiN7rL7Bi3jm1LpP24R5nS7HpPgrGXZLQoo6xg==", - "dev": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.14.1" - } - }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -2512,6 +2502,7 @@ "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "dev": true, + "optional": true, "requires": { "file-uri-to-path": "1.0.0" } @@ -4759,7 +4750,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true + "dev": true, + "optional": true }, "fill-range": { "version": "7.1.1", diff --git a/package.json b/package.json index dbceadd34..a0174c994 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,6 @@ "author": "MoleculerJS", "license": "MIT", "devDependencies": { - "@icebob/node-memwatch": "^2.1.0", "@sinonjs/fake-timers": "^9.1.2", "@types/bunyan": "^1.8.11", "@types/ioredis": "^4.28.10", diff --git a/src/tracing/exporters/jaeger.js b/src/tracing/exporters/jaeger.js index 59aab511e..563733f5e 100644 --- a/src/tracing/exporters/jaeger.js +++ b/src/tracing/exporters/jaeger.js @@ -1,6 +1,6 @@ /* * moleculer - * Copyright (c) 2020 MoleculerJS (https://github.com/moleculerjs/moleculer) + * Copyright (c) 2025 MoleculerJS (https://github.com/moleculerjs/moleculer) * MIT Licensed */ @@ -49,7 +49,10 @@ class JaegerTraceExporter extends BaseTraceExporter { tracerOptions: {}, /** @type {Object?} Default span tags */ - defaultTags: null + defaultTags: null, + + /** @type {boolean?} Use legacy mode with 64 bit trace ids*/ + legacyMode: true }); this.tracers = {}; @@ -199,8 +202,8 @@ class JaegerTraceExporter extends BaseTraceExporter { let parentCtx; if (span.parentID) { parentCtx = new Jaeger.SpanContext( - this.convertID(span.traceID), // traceId, - this.convertID(span.parentID), // spanId, + this.convertTraceID(span.traceID), // traceId, + this.convertSpanID(span.parentID), // spanId, null, // parentId, null, // traceIdStr null, // spanIdStr @@ -235,8 +238,8 @@ class JaegerTraceExporter extends BaseTraceExporter { ); const sc = jaegerSpan.context(); - sc.traceId = this.convertID(span.traceID); - sc.spanId = this.convertID(span.id); + sc.traceId = this.convertTraceID(span.traceID); + sc.spanId = this.convertSpanID(span.id); if (span.error) { this.addTags(jaegerSpan, Jaeger.opentracing.Tags.ERROR, true); @@ -291,11 +294,27 @@ class JaegerTraceExporter extends BaseTraceExporter { * @param {String} id * @returns {String} */ - convertID(id) { + convertSpanID(id) { if (id) return Buffer.from(id.replace(/-/g, "").substring(0, 16), "hex"); return null; } + + /** + * Convert Trace ID to Jaeger format. Return 128 bit IDs or 64 bit IDs if legacy is set. + * + * @param {String} id + * @returns {String} + */ + convertTraceID(id) { + if (id) + return Buffer.from( + id.replace(/-/g, "").substring(0, this.opts.legacyMode ? 16 : 32), + "hex" + ); + + return null; + } } module.exports = JaegerTraceExporter; diff --git a/test/unit/tracing/exporters/jaeger.spec.js b/test/unit/tracing/exporters/jaeger.spec.js index 561b14985..83961b644 100644 --- a/test/unit/tracing/exporters/jaeger.spec.js +++ b/test/unit/tracing/exporters/jaeger.spec.js @@ -56,6 +56,7 @@ describe("Test Jaeger tracing exporter class", () => { options: {} }, tracerOptions: {}, + legacyMode: true, defaultTags: null }); @@ -84,6 +85,7 @@ describe("Test Jaeger tracing exporter class", () => { safetyTags: false, endpoint: "http://jaeger:9411", host: "127.0.0.1", + legacyMode: true, port: 6832, sampler: { type: "Const", @@ -481,22 +483,71 @@ describe("Test Jaeger tracing exporter class", () => { }); }); - describe("Test convertID method", () => { + describe("Test convert ids", () => { const fakeTracer = { broker, logger: broker.logger }; - const exporter = new JaegerTraceExporter({}); + const legacyExporter = new JaegerTraceExporter({}); + legacyExporter.init(fakeTracer); + const exporter = new JaegerTraceExporter({ legacyMode: false }); exporter.init(fakeTracer); - it("should truncate ID", () => { - expect(exporter.convertID()).toBeNull(); - expect(exporter.convertID("")).toBeNull(); - expect(exporter.convertID("12345678")).toEqual(Buffer.from([18, 52, 86, 120])); - expect(exporter.convertID("123456789-0123456")).toEqual( + it("should truncate trace ID to 64 bit in legacy mode", () => { + expect(legacyExporter.convertTraceID()).toBeNull(); + expect(legacyExporter.convertTraceID("")).toBeNull(); + expect(legacyExporter.convertTraceID("12345678")).toEqual( + Buffer.from([18, 52, 86, 120]) + ); + expect(legacyExporter.convertTraceID("123456789-0123456")).toEqual( + Buffer.from([18, 52, 86, 120, 144, 18, 52, 86]) + ); + expect(legacyExporter.convertTraceID("123456789-0123456789-abcdef")).toEqual( Buffer.from([18, 52, 86, 120, 144, 18, 52, 86]) ); - expect(exporter.convertID("123456789-0123456789-abcdef")).toEqual( + expect(legacyExporter.convertTraceID("abcdef")).toEqual(Buffer.from([171, 205, 239])); + }); + + it("should truncate trace ID to 128bit in non legacy mode", () => { + expect(exporter.convertTraceID()).toBeNull(); + expect(exporter.convertTraceID("")).toBeNull(); + expect(exporter.convertTraceID("12345678")).toEqual(Buffer.from([18, 52, 86, 120])); + expect(exporter.convertTraceID("123456789-0123456")).toEqual( Buffer.from([18, 52, 86, 120, 144, 18, 52, 86]) ); - expect(exporter.convertID("abcdef")).toEqual(Buffer.from([171, 205, 239])); + expect(exporter.convertTraceID("123456789-0123456789-abcdef-abcdef-abcdef")).toEqual( + Buffer.from([ + 18, 52, 86, 120, 144, 18, 52, 86, 120, 154, 188, 222, 250, 188, 222, 250 + ]) + ); + expect(exporter.convertTraceID("abcdef")).toEqual(Buffer.from([171, 205, 239])); + }); + + it("should truncate span ID to 64 bit", () => { + expect(legacyExporter.convertSpanID()).toBeNull(); + expect(exporter.convertSpanID()).toBeNull(); + + expect(legacyExporter.convertSpanID("")).toBeNull(); + expect(exporter.convertSpanID("")).toBeNull(); + + expect(legacyExporter.convertSpanID("12345678")).toEqual( + Buffer.from([18, 52, 86, 120]) + ); + expect(exporter.convertSpanID("12345678")).toEqual(Buffer.from([18, 52, 86, 120])); + + expect(legacyExporter.convertSpanID("123456789-0123456")).toEqual( + Buffer.from([18, 52, 86, 120, 144, 18, 52, 86]) + ); + expect(exporter.convertSpanID("123456789-0123456")).toEqual( + Buffer.from([18, 52, 86, 120, 144, 18, 52, 86]) + ); + + expect(legacyExporter.convertSpanID("123456789-0123456789-abcdef")).toEqual( + Buffer.from([18, 52, 86, 120, 144, 18, 52, 86]) + ); + expect(exporter.convertSpanID("123456789-0123456")).toEqual( + Buffer.from([18, 52, 86, 120, 144, 18, 52, 86]) + ); + + expect(legacyExporter.convertSpanID("abcdef")).toEqual(Buffer.from([171, 205, 239])); + expect(exporter.convertSpanID("abcdef")).toEqual(Buffer.from([171, 205, 239])); }); });