diff --git a/__snapshots__/diamorphosis.test.ts.js b/__snapshots__/diamorphosis.test.ts.js index 75827cdc..139867b5 100644 --- a/__snapshots__/diamorphosis.test.ts.js +++ b/__snapshots__/diamorphosis.test.ts.js @@ -64,7 +64,7 @@ exports['Diamorphosis Test should set json/console loggingvariables when nothing }, "printLogo": true, "log": { - "pattern": "%[[%d] [%p] %c%] %x{logTracer} %m", + "pattern": "%[[%d] [%p] %c%] %x{requestId}%m %x{logTracer}", "level": "debug", "console": true, "json": false @@ -192,24 +192,23 @@ exports['Diamorphosis Test should set json/console loggingvariables when nothing "logKeys": [ "requestId", "visitor", - "correlationId" + "correlationId", + "propagatedHeaders" ], - "istioTraceContextHeaders": { + "propagatedHeaders": { "enabled": true, "headers": [ + "cf-ray", "x-request-id", "x-b3-traceid", "x-b3-spanid", "x-b3-parentspanid", "x-b3-sampled", "x-b3-flags", - "x-ot-span-context" - ] - }, - "headerPropagation": { - "enabled": true, - "headers": [ - "cf-ray" + "x-ot-span-context", + "x-depth", + "x-parent-id", + "x-initiator-id" ] } } @@ -217,7 +216,7 @@ exports['Diamorphosis Test should set json/console loggingvariables when nothing exports['Diamorphosis Test should set json/console loggingvariables when console:not set, json:true, styles:[] shoud be console:false, json:true, styles:["json"] 1'] = { "log": { - "pattern": "%[[%d] [%p] %c%] %x{logTracer} %m", + "pattern": "%[[%d] [%p] %c%] %x{requestId}%m %x{logTracer}", "level": "debug", "console": false, "json": true @@ -411,24 +410,23 @@ exports['Diamorphosis Test should set json/console loggingvariables when console "logKeys": [ "requestId", "visitor", - "correlationId" + "correlationId", + "propagatedHeaders" ], - "istioTraceContextHeaders": { + "propagatedHeaders": { "enabled": true, "headers": [ + "cf-ray", "x-request-id", "x-b3-traceid", "x-b3-spanid", "x-b3-parentspanid", "x-b3-sampled", "x-b3-flags", - "x-ot-span-context" - ] - }, - "headerPropagation": { - "enabled": true, - "headers": [ - "cf-ray" + "x-ot-span-context", + "x-depth", + "x-parent-id", + "x-initiator-id" ] } } @@ -436,7 +434,7 @@ exports['Diamorphosis Test should set json/console loggingvariables when console exports['Diamorphosis Test should set json/console loggingvariables when console:true, json:true, styles:[] shoud be console:true, json:true, styles:["json"] 1'] = { "log": { - "pattern": "%[[%d] [%p] %c%] %x{logTracer} %m", + "pattern": "%[[%d] [%p] %c%] %x{requestId}%m %x{logTracer}", "level": "debug", "console": true, "json": true @@ -630,24 +628,23 @@ exports['Diamorphosis Test should set json/console loggingvariables when console "logKeys": [ "requestId", "visitor", - "correlationId" + "correlationId", + "propagatedHeaders" ], - "istioTraceContextHeaders": { + "propagatedHeaders": { "enabled": true, "headers": [ + "cf-ray", "x-request-id", "x-b3-traceid", "x-b3-spanid", "x-b3-parentspanid", "x-b3-sampled", "x-b3-flags", - "x-ot-span-context" - ] - }, - "headerPropagation": { - "enabled": true, - "headers": [ - "cf-ray" + "x-ot-span-context", + "x-depth", + "x-parent-id", + "x-initiator-id" ] } } @@ -655,7 +652,7 @@ exports['Diamorphosis Test should set json/console loggingvariables when console exports['Diamorphosis Test should set json/console loggingvariables when console:false, json:true, styles:[] shoud be console:false, json:true, styles:["json"] 1'] = { "log": { - "pattern": "%[[%d] [%p] %c%] %x{logTracer} %m", + "pattern": "%[[%d] [%p] %c%] %x{requestId}%m %x{logTracer}", "level": "debug", "console": false, "json": true @@ -849,24 +846,23 @@ exports['Diamorphosis Test should set json/console loggingvariables when console "logKeys": [ "requestId", "visitor", - "correlationId" + "correlationId", + "propagatedHeaders" ], - "istioTraceContextHeaders": { + "propagatedHeaders": { "enabled": true, "headers": [ + "cf-ray", "x-request-id", "x-b3-traceid", "x-b3-spanid", "x-b3-parentspanid", "x-b3-sampled", "x-b3-flags", - "x-ot-span-context" - ] - }, - "headerPropagation": { - "enabled": true, - "headers": [ - "cf-ray" + "x-ot-span-context", + "x-depth", + "x-parent-id", + "x-initiator-id" ] } } @@ -874,7 +870,7 @@ exports['Diamorphosis Test should set json/console loggingvariables when console exports['Diamorphosis Test should set json/console loggingvariables when console:not set, json:true, styles:["simple"] shoud be console:false, json:true, styles:["simple"] 1'] = { "log": { - "pattern": "%[[%d] [%p] %c%] %x{logTracer} %m", + "pattern": "%[[%d] [%p] %c%] %x{requestId}%m %x{logTracer}", "level": "debug", "console": false, "json": true @@ -1068,24 +1064,23 @@ exports['Diamorphosis Test should set json/console loggingvariables when console "logKeys": [ "requestId", "visitor", - "correlationId" + "correlationId", + "propagatedHeaders" ], - "istioTraceContextHeaders": { + "propagatedHeaders": { "enabled": true, "headers": [ + "cf-ray", "x-request-id", "x-b3-traceid", "x-b3-spanid", "x-b3-parentspanid", "x-b3-sampled", "x-b3-flags", - "x-ot-span-context" - ] - }, - "headerPropagation": { - "enabled": true, - "headers": [ - "cf-ray" + "x-ot-span-context", + "x-depth", + "x-parent-id", + "x-initiator-id" ] } } @@ -1213,7 +1208,7 @@ exports['Diamorphosis Test should set json/console loggingvariables when console }, "printLogo": false, "log": { - "pattern": "%[[%d] [%p] %c%] %x{logTracer} %m", + "pattern": "%[[%d] [%p] %c%] %x{requestId}%m %x{logTracer}", "level": "fatal", "console": true, "json": false @@ -1292,24 +1287,23 @@ exports['Diamorphosis Test should set json/console loggingvariables when console "logKeys": [ "requestId", "visitor", - "correlationId" + "correlationId", + "propagatedHeaders" ], - "istioTraceContextHeaders": { + "propagatedHeaders": { "enabled": true, "headers": [ + "cf-ray", "x-request-id", "x-b3-traceid", "x-b3-spanid", "x-b3-parentspanid", "x-b3-sampled", "x-b3-flags", - "x-ot-span-context" - ] - }, - "headerPropagation": { - "enabled": true, - "headers": [ - "cf-ray" + "x-ot-span-context", + "x-depth", + "x-parent-id", + "x-initiator-id" ] } } @@ -1437,7 +1431,7 @@ exports['Diamorphosis Test should set json/console loggingvariables when console }, "printLogo": false, "log": { - "pattern": "%[[%d] [%p] %c%] %x{logTracer} %m", + "pattern": "%[[%d] [%p] %c%] %x{requestId}%m %x{logTracer}", "level": "fatal", "console": true, "json": true @@ -1518,24 +1512,23 @@ exports['Diamorphosis Test should set json/console loggingvariables when console "logKeys": [ "requestId", "visitor", - "correlationId" + "correlationId", + "propagatedHeaders" ], - "istioTraceContextHeaders": { + "propagatedHeaders": { "enabled": true, "headers": [ + "cf-ray", "x-request-id", "x-b3-traceid", "x-b3-spanid", "x-b3-parentspanid", "x-b3-sampled", "x-b3-flags", - "x-ot-span-context" - ] - }, - "headerPropagation": { - "enabled": true, - "headers": [ - "cf-ray" + "x-ot-span-context", + "x-depth", + "x-parent-id", + "x-initiator-id" ] } } diff --git a/src/utils.ts b/src/utils.ts index 630abc0a..0cf49fe1 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -24,7 +24,7 @@ export const nodeVersionGreaterThanEqual = (requestedVersion: string, version = return true; }; -export function appendHeadersFromStore(properties, store, config) { +export function appendHeadersFromStore(properties: any, store: Map, config: any) { if (!config.requestContext.enabled) return; if (!config.requestContext.propagatedHeaders.enabled) return; properties.headers = properties.headers || {}; diff --git a/test/examples/json-appender.test.ts b/test/examples/json-appender.test.ts index e93f87a1..2e19f917 100644 --- a/test/examples/json-appender.test.ts +++ b/test/examples/json-appender.test.ts @@ -48,6 +48,7 @@ describe('json-appender', function () { message: 'hello world', context: pickBy({ requestId: 'test-id', + propagatedHeaders: {}, context: 'foo' }) }) @@ -78,6 +79,7 @@ describe('json-appender', function () { message: 'test - this was a test error', stack_trace: 'Error: test\n at /logError ', context: pickBy({ + propagatedHeaders: {}, requestId: 'test-id', context: 'foo' }) @@ -98,6 +100,7 @@ describe('json-appender', function () { component: 'koa', action: '/logError', params: { path: {}, query: {}, body: {}, requestId: 'test-id' }, + propagatedHeaders: {}, state: { riviereStartedAt: 1546300800000, requestId: 'test-id' }, requestId: 'test-id' }, diff --git a/test/examples/request-context-example.test.ts b/test/examples/request-context-example.test.ts index 2cf2f939..518f961d 100644 --- a/test/examples/request-context-example.test.ts +++ b/test/examples/request-context-example.test.ts @@ -102,7 +102,7 @@ describe('request-context', function () { describe('when feature flag is off', function () { beforeEach(function () { const config = require('../../examples/request-context-example/config.js'); - config.requestContext.headerPropagation = { enabled: false }; + config.requestContext.propagatedHeaders = { enabled: false }; }); it('should not propagate headers', async function () { @@ -118,7 +118,7 @@ describe('request-context', function () { it('/propagateTracingHeaders returns 200 and propagates whitelisted headers', async function () { const config = require('../../examples/request-context-example/config.js'); - config.requestContext.headerPropagation = { enabled: true, headers: ['header1', 'header2'] }; + config.requestContext.propagatedHeaders = { enabled: true, headers: ['header1', 'header2'] }; const propagatedRequestMock = nock('http://foo.com') .matchHeader('header1', 'header-value') diff --git a/test/initializers/rabbitmq/index.test.ts b/test/initializers/rabbitmq/index.test.ts index 8ac88155..1192aa10 100644 --- a/test/initializers/rabbitmq/index.test.ts +++ b/test/initializers/rabbitmq/index.test.ts @@ -26,7 +26,8 @@ describe('Test rabbitmq connection', function () { maxRetries: 0, retryDelay: 1000, connectDelay: 5000 - } + }, + requestContext: { enabled: true, propagatedHeaders: { enabled: true } } }; onStub = sandbox.stub(); stub = sandbox.stub().returns({ diff --git a/test/utils.test.ts b/test/utils.test.ts index 928df16f..e3631703 100644 --- a/test/utils.test.ts +++ b/test/utils.test.ts @@ -1,29 +1,135 @@ -import { nodeVersionGreaterThanEqual } from '../src/utils'; +import { appendHeadersFromStore, appendToStore, nodeVersionGreaterThanEqual } from '../src/utils'; +import { cloneDeep } from 'lodash'; +import * as sinon from 'sinon'; +import * as crypto from 'crypto'; -describe('utils', function() { - describe('nodeVersionGreaterThanEqual', function() { +const sandbox = sinon.createSandbox(); + +describe('utils', function () { + describe('nodeVersionGreaterThanEqual', function () { const version = 'v10.11.5'; - it('major greater than', function() { + it('major greater than', function () { nodeVersionGreaterThanEqual('v9.12.0', version).should.eql(true); }); - it('major less than', function() { + it('major less than', function () { nodeVersionGreaterThanEqual('v11.1.0', version).should.eql(false); }); - it('minor greater than', function() { + it('minor greater than', function () { nodeVersionGreaterThanEqual('v10.5.0', version).should.eql(true); }); - it('minor less than', function() { + it('minor less than', function () { nodeVersionGreaterThanEqual('v10.12.0', version).should.eql(false); }); - it('patch greater than', function() { + it('patch greater than', function () { nodeVersionGreaterThanEqual('v10.11.1', version).should.eql(true); }); - it('patch less than', function() { + it('patch less than', function () { nodeVersionGreaterThanEqual('v10.11.7', version).should.eql(false); }); - it('equal version', function() { + it('equal version', function () { nodeVersionGreaterThanEqual('v10.11.5', version).should.eql(true); }); }); + + describe('appendHeadersFromStore', function () { + const Config = { + traceHeaderName: 'foo', + requestContext: { enabled: true, propagatedHeaders: { enabled: true, headers: ['foo'] } } + }; + + afterEach(function () { + sandbox.restore(); + }); + + context('request context is disabled', function () { + it('does nothing', function () { + const config = cloneDeep(Config); + config.requestContext.enabled = false; + const properties = {}; + appendHeadersFromStore(properties, new Map([['propagatedHeaders', { foo: 'bar' }]]), config); + properties.should.eql({}); + }); + }); + + context('propagate headers is disabled', function () { + it('does nothing', function () { + const config = cloneDeep(Config); + config.requestContext.propagatedHeaders.enabled = false; + const properties = {}; + appendHeadersFromStore(properties, new Map([['propagatedHeaders', { foo: 'bar' }]]), config); + properties.should.eql({}); + }); + }); + + context('propagate headers is enabled', function () { + it('propagates headers from store to properties', function () { + const properties = {}; + appendHeadersFromStore(properties, new Map([['propagatedHeaders', { foo: 'bar' }]]), Config); + properties.should.eql({ headers: { foo: 'bar', 'x-depth': 1 } }); + }); + + it('propagates headers from store to properties chaning trace id', function () { + sandbox.stub(crypto, 'randomUUID').returns('new-uuid' as any); + const properties = {}; + + appendHeadersFromStore(properties, new Map([['propagatedHeaders', { foo: 'bar', 'x-depth': 1 }]]), Config); + properties.should.eql({ headers: { foo: 'orka:new-uuid', 'x-parent-id': 'bar', 'x-depth': 2 } }); + }); + + it('propagates headers from store to properties adding initiator id too', function () { + sandbox.stub(crypto, 'randomUUID').returns('new-uuid' as any); + const properties = {}; + + appendHeadersFromStore( + properties, + new Map([['propagatedHeaders', { foo: 'parent-id', 'x-depth': 3, 'x-parent-id': 'bar' }]]), + Config + ); + properties.should.eql({ + headers: { foo: 'orka:new-uuid', 'x-parent-id': 'parent-id', 'x-depth': 4, 'x-initiator-id': 'bar' } + }); + }); + }); + }); + + describe('appendToStore', function () { + const Config = { + traceHeaderName: 'foo', + requestContext: { enabled: true, propagatedHeaders: { enabled: true, headers: ['foo'] } } + }; + const properties = { headers: { foo: 'bar' } }; + + afterEach(function () { + sandbox.restore(); + }); + + context('request context is disabled', function () { + it('does nothing', function () { + const config = cloneDeep(Config); + config.requestContext.enabled = false; + const store = new Map(); + appendToStore(store, properties, config); + Object.fromEntries(store).should.eql({}); + }); + }); + + context('propagate headers is disabled', function () { + it('does nothing', function () { + const config = cloneDeep(Config); + config.requestContext.propagatedHeaders.enabled = false; + const store = new Map(); + appendToStore(store, properties, config); + Object.fromEntries(store).should.eql({}); + }); + }); + + context('propagate headers is enabled', function () { + it('propagates headers from store to properties', function () { + const store = new Map(); + appendToStore(store, properties, Config); + Object.fromEntries(store).should.eql({ propagatedHeaders: { foo: 'bar' } }); + }); + }); + }); });