@autofleet/outbreak 1.0.4 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config.d.ts +16 -0
- package/dist/{src/config.js → config.js} +4 -6
- package/dist/config.js.map +1 -0
- package/dist/const.d.ts +6 -0
- package/dist/const.js +9 -0
- package/dist/const.js.map +1 -0
- package/dist/http_wrapper.d.ts +2 -0
- package/dist/{src/http_wrapper.js → http_wrapper.js} +40 -27
- package/dist/http_wrapper.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +64 -0
- package/dist/index.js.map +1 -0
- package/dist/tracer.d.ts +18 -0
- package/dist/{src/tracer.js → tracer.js} +13 -9
- package/dist/tracer.js.map +1 -0
- package/package.json +49 -32
- package/readme.md +1 -1
- package/dist/src/config.d.ts +0 -18
- package/dist/src/config.js.map +0 -1
- package/dist/src/example.d.ts +0 -1
- package/dist/src/example.js +0 -46
- package/dist/src/example.js.map +0 -1
- package/dist/src/http_wrapper.d.ts +0 -1
- package/dist/src/http_wrapper.js.map +0 -1
- package/dist/src/index.d.ts +0 -17
- package/dist/src/index.js +0 -55
- package/dist/src/index.js.map +0 -1
- package/dist/src/tracer.d.ts +0 -10
- package/dist/src/tracer.js.map +0 -1
- package/dist/tests/http-wrapper.test.d.ts +0 -1
- package/dist/tests/http-wrapper.test.js +0 -202
- package/dist/tests/http-wrapper.test.js.map +0 -1
- package/examples/example.ts +0 -39
- package/jest.config.js +0 -14
- package/nodemon.json +0 -6
- package/src/config.ts +0 -58
- package/src/example.ts +0 -39
- package/src/http_wrapper.ts +0 -114
- package/src/index.ts +0 -59
- package/src/tracer.ts +0 -77
- package/tests/http-wrapper.test.ts +0 -206
- package/tsconfig.json +0 -30
package/dist/src/tracer.d.ts
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
/// <reference types="node" />
|
2
|
-
import asyncHooks from 'async_hooks';
|
3
|
-
declare const tracer: {
|
4
|
-
currentTrace: any;
|
5
|
-
traces: {};
|
6
|
-
};
|
7
|
-
export declare const enable: () => asyncHooks.AsyncHook;
|
8
|
-
export declare const newTrace: (type: any) => void;
|
9
|
-
export declare const getCurrentTrace: () => any;
|
10
|
-
export default tracer;
|
package/dist/src/tracer.js.map
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"tracer.js","sourceRoot":"","sources":["../../src/tracer.ts"],"names":[],"mappings":";;;;;AAAA,8DAAqC;AACrC,gDAAwB;AAExB,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB,MAAM,MAAM,GAAG;IACb,YAAY,EAAE,IAAI;IAClB,MAAM,EAAE,EAAE;CACX,CAAC;AAEF,SAAS,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,cAAc;IACzC,IAAI,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE;QACjC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;KACxD;AACH,CAAC;AAED,SAAS,MAAM,CAAC,OAAO;IACrB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;QAC3B,OAAO;KACR;IACD,UAAU,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC;IAC1C,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,KAAK,CAAC,OAAO;IACpB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;QAC3B,OAAO;KACR;IACD,MAAM,CAAC,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,OAAO,CAAC,OAAO;IACtB,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;QAC1B,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC;KAC5B;AACH,CAAC;AAED,MAAM,IAAI,GAAG,qBAAU,CAAC,UAAU,CAAC;IACjC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;CAC7B,CAAC,CAAC;AAEH,MAAM,KAAK;IAOT,YAAY,IAAI;QACd,IAAI,CAAC,EAAE,GAAG,cAAI,CAAC,EAAE,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;IAC3B,CAAC;CACF;AAED,IAAI,cAAc,GAAG,KAAK,CAAC;AAEd,QAAA,MAAM,GAAG,GAAyB,EAAE;IAC/C,IAAI,cAAc,EAAE;QAClB,OAAO,IAAI,CAAC;KACb;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;IACd,cAAc,GAAG,IAAI,CAAC;IACtB,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEW,QAAA,QAAQ,GAAG,CAAC,IAAI,EAAQ,EAAE;IACrC,cAAM,EAAE,CAAC;IACT,MAAM,CAAC,YAAY,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,CAAC,MAAM,CAAC,qBAAU,CAAC,gBAAgB,EAAE,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC;IACnE,OAAO,MAAM,CAAC,YAAY,CAAC;AAC7B,CAAC,CAAC;AAEW,QAAA,eAAe,GAAG,GAAQ,EAAE,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;AAEpE,kBAAe,MAAM,CAAC"}
|
@@ -1 +0,0 @@
|
|
1
|
-
export {};
|
@@ -1,202 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
9
|
-
});
|
10
|
-
};
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
13
|
-
};
|
14
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
15
|
-
if (mod && mod.__esModule) return mod;
|
16
|
-
var result = {};
|
17
|
-
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
18
|
-
result["default"] = mod;
|
19
|
-
return result;
|
20
|
-
};
|
21
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
22
|
-
const express_1 = __importDefault(require("express"));
|
23
|
-
const axios_1 = __importDefault(require("axios"));
|
24
|
-
const winston_1 = __importDefault(require("winston"));
|
25
|
-
const bluebird_1 = __importDefault(require("bluebird"));
|
26
|
-
const agentkeepalive_1 = __importDefault(require("agentkeepalive"));
|
27
|
-
const index_1 = __importStar(require("../src/index"));
|
28
|
-
const logger = winston_1.default.createLogger({
|
29
|
-
transports: [
|
30
|
-
new winston_1.default.transports.Console(),
|
31
|
-
],
|
32
|
-
});
|
33
|
-
const generateApp = (addEndpoints, port) => __awaiter(void 0, void 0, void 0, function* () {
|
34
|
-
const app = express_1.default();
|
35
|
-
addEndpoints(app);
|
36
|
-
const server = yield new Promise((resolve) => {
|
37
|
-
const s = app.listen(port, () => {
|
38
|
-
s.keepAliveTimeout = 600 * 1000;
|
39
|
-
console.log('Listen on port', port);
|
40
|
-
resolve(s);
|
41
|
-
});
|
42
|
-
});
|
43
|
-
return () => server.close();
|
44
|
-
});
|
45
|
-
describe('E2E', () => {
|
46
|
-
it('Basic functionality', () => __awaiter(void 0, void 0, void 0, function* () {
|
47
|
-
let server2TraceId = null;
|
48
|
-
index_1.default({
|
49
|
-
setAndPropagateCorrelationId: true,
|
50
|
-
headersToPropagate: [
|
51
|
-
'x-test-header',
|
52
|
-
],
|
53
|
-
headersPrefix: 'x-wakanda-',
|
54
|
-
winstonLogger: logger,
|
55
|
-
});
|
56
|
-
const closeServer1 = yield generateApp((app) => {
|
57
|
-
app.get('/', (req, res) => __awaiter(void 0, void 0, void 0, function* () {
|
58
|
-
setTimeout(() => __awaiter(void 0, void 0, void 0, function* () {
|
59
|
-
const { data: res1 } = yield axios_1.default.post('http://localhost:8082');
|
60
|
-
res.json(res1);
|
61
|
-
}), 10);
|
62
|
-
}));
|
63
|
-
}, 8081);
|
64
|
-
const closeServer2 = yield generateApp((app) => {
|
65
|
-
app.post('/', (req, res) => {
|
66
|
-
server2TraceId = req.headers['x-trace-id'];
|
67
|
-
res.json({
|
68
|
-
value: req.headers['x-test-header'],
|
69
|
-
wkanda: req.headers['x-wakanda-id'],
|
70
|
-
});
|
71
|
-
});
|
72
|
-
}, 8082);
|
73
|
-
const { data: res1, headers } = yield axios_1.default.get('http://localhost:8081', {
|
74
|
-
headers: {
|
75
|
-
'x-test-header': 'testHeader',
|
76
|
-
'x-wakanda-id': 'my-wakanda-id',
|
77
|
-
},
|
78
|
-
});
|
79
|
-
closeServer1();
|
80
|
-
closeServer2();
|
81
|
-
expect(headers['x-trace-id']).toEqual(server2TraceId);
|
82
|
-
expect(res1.value).toEqual('testHeader');
|
83
|
-
expect(res1.wkanda).toEqual('my-wakanda-id');
|
84
|
-
}));
|
85
|
-
it('Test on http keep alive and abort and bluebird, should create a new trace', () => __awaiter(void 0, void 0, void 0, function* () {
|
86
|
-
const server2TraceIds = [];
|
87
|
-
let error;
|
88
|
-
const httpAgent = new agentkeepalive_1.default({ keepAlive: true, maxSockets: 1 });
|
89
|
-
const instance = axios_1.default.create({
|
90
|
-
httpAgent,
|
91
|
-
});
|
92
|
-
index_1.default({
|
93
|
-
setAndPropagateCorrelationId: true,
|
94
|
-
headersToPropagate: [
|
95
|
-
'x-test-header',
|
96
|
-
],
|
97
|
-
headersPrefix: 'x-wakanda-',
|
98
|
-
winstonLogger: logger,
|
99
|
-
});
|
100
|
-
const closeServer1 = yield generateApp((app) => {
|
101
|
-
const serverHttpAgent = new agentkeepalive_1.default({ keepAlive: true, maxSockets: 2 });
|
102
|
-
const serverInstance = axios_1.default.create({
|
103
|
-
httpAgent: serverHttpAgent,
|
104
|
-
});
|
105
|
-
app.post('/', (req, res) => __awaiter(void 0, void 0, void 0, function* () {
|
106
|
-
const { id } = index_1.getCurrentContext();
|
107
|
-
setTimeout(() => __awaiter(void 0, void 0, void 0, function* () {
|
108
|
-
setTimeout(() => __awaiter(void 0, void 0, void 0, function* () {
|
109
|
-
const { data: res1 } = yield serverInstance.post('http://localhost:8082');
|
110
|
-
if (index_1.getCurrentContext().id !== id) {
|
111
|
-
throw new Error('Should be the same trace');
|
112
|
-
}
|
113
|
-
res.json(res1);
|
114
|
-
}), 10);
|
115
|
-
}), 100);
|
116
|
-
}));
|
117
|
-
}, 8081);
|
118
|
-
const closeServer2 = yield generateApp((app) => {
|
119
|
-
app.post('/', (req, res) => {
|
120
|
-
const { id } = index_1.getCurrentContext();
|
121
|
-
setTimeout(() => __awaiter(void 0, void 0, void 0, function* () {
|
122
|
-
yield bluebird_1.default.map([1, 2, 3], (value) => __awaiter(void 0, void 0, void 0, function* () {
|
123
|
-
if (value === 2) {
|
124
|
-
server2TraceIds.push(req.headers['x-trace-id']);
|
125
|
-
if (index_1.getCurrentContext().id !== id) {
|
126
|
-
throw new Error('Should be the same trace');
|
127
|
-
}
|
128
|
-
res.json({
|
129
|
-
value: req.headers['x-test-header'],
|
130
|
-
wkanda: req.headers['x-wakanda-id'],
|
131
|
-
});
|
132
|
-
}
|
133
|
-
}), { concurrency: 3 });
|
134
|
-
}), 10);
|
135
|
-
});
|
136
|
-
}, 8082);
|
137
|
-
try {
|
138
|
-
yield instance.post('http://localhost:8081', {}, {
|
139
|
-
headers: {
|
140
|
-
'x-test-header': 'testHeader111',
|
141
|
-
'x-wakanda-id': 'my-wakanda-id',
|
142
|
-
},
|
143
|
-
timeout: 1,
|
144
|
-
});
|
145
|
-
}
|
146
|
-
catch (e) {
|
147
|
-
error = e;
|
148
|
-
}
|
149
|
-
const [{ data: res1, headers: headers1 }, { data: res2, headers: headers2 }] = yield Promise.all([
|
150
|
-
instance.post('http://localhost:8081', { f: 1 }, {
|
151
|
-
headers: {
|
152
|
-
'x-test-header': 'testHeader1',
|
153
|
-
'x-wakanda-id': 'my-wakanda-id',
|
154
|
-
},
|
155
|
-
}),
|
156
|
-
instance.post('http://localhost:8081', { c: 3 }, {
|
157
|
-
headers: {
|
158
|
-
'x-test-header': 'testHeader1www',
|
159
|
-
'x-wakanda-id': 'my-wakanda-id',
|
160
|
-
},
|
161
|
-
}),
|
162
|
-
axios_1.default.post('http://localhost:8081', { f: 1 }, {
|
163
|
-
headers: {
|
164
|
-
'x-test-header': 'testHeader1dssds',
|
165
|
-
'x-wakanda-id': 'my-wakanda-id',
|
166
|
-
},
|
167
|
-
}),
|
168
|
-
axios_1.default.post('http://localhost:8081', { n: 3 }, {
|
169
|
-
headers: {
|
170
|
-
'x-test-header': 'testHeader2',
|
171
|
-
'x-wakanda-id': 'my-wakanda-id',
|
172
|
-
},
|
173
|
-
})
|
174
|
-
]);
|
175
|
-
const { data: res3, headers: headers3 } = yield instance.post('http://localhost:8081', {}, {
|
176
|
-
headers: {
|
177
|
-
'x-test-header': 'testHeader3',
|
178
|
-
'x-wakanda-id': 'my-wakanda-id',
|
179
|
-
},
|
180
|
-
});
|
181
|
-
yield axios_1.default.post('http://localhost:8081', { n: 3 }, {
|
182
|
-
headers: {
|
183
|
-
'x-test-header': 'testHeader2',
|
184
|
-
'x-wakanda-id': 'my-wakanda-id',
|
185
|
-
},
|
186
|
-
});
|
187
|
-
closeServer1();
|
188
|
-
closeServer2();
|
189
|
-
expect(error.code).toEqual('ECONNABORTED');
|
190
|
-
expect((new Set(server2TraceIds)).size).toEqual(7);
|
191
|
-
expect(headers1['x-trace-id']).not.toEqual(server2TraceIds[0]);
|
192
|
-
expect(headers2['x-trace-id']).not.toEqual(server2TraceIds[0]);
|
193
|
-
expect(headers3['x-trace-id']).not.toEqual(server2TraceIds[0]);
|
194
|
-
expect(res1.value).toEqual('testHeader1');
|
195
|
-
expect(res1.wkanda).toEqual('my-wakanda-id');
|
196
|
-
expect(res2.value).toEqual('testHeader1www');
|
197
|
-
expect(res2.wkanda).toEqual('my-wakanda-id');
|
198
|
-
expect(res3.value).toEqual('testHeader3');
|
199
|
-
expect(res2.wkanda).toEqual('my-wakanda-id');
|
200
|
-
}));
|
201
|
-
});
|
202
|
-
//# sourceMappingURL=http-wrapper.test.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"http-wrapper.test.js","sourceRoot":"","sources":["../../tests/http-wrapper.test.ts"],"names":[],"mappings":"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"}
|
package/examples/example.ts
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
import express from 'express';
|
2
|
-
import axios from 'axios';
|
3
|
-
import winston from 'winston';
|
4
|
-
|
5
|
-
import headersTracer from '../src/http-wrapper/index';
|
6
|
-
|
7
|
-
axios.defaults.adapter = require('axios/lib/adapters/http');
|
8
|
-
|
9
|
-
const logger = winston.createLogger({
|
10
|
-
transports: [
|
11
|
-
new winston.transports.Console(),
|
12
|
-
],
|
13
|
-
});
|
14
|
-
|
15
|
-
headersTracer({
|
16
|
-
setAndPropagateCorrelationId: true,
|
17
|
-
headersToPropagate: [
|
18
|
-
'x-text',
|
19
|
-
],
|
20
|
-
headersPrefix: 'x-af-',
|
21
|
-
winstonLogger: logger,
|
22
|
-
});
|
23
|
-
|
24
|
-
const app = express();
|
25
|
-
|
26
|
-
app.all('/', async (req, res) => {
|
27
|
-
const network = axios.create({ baseURL: 'http://localhost:8080/' });
|
28
|
-
const { data } = await network.get('/header-parrot');
|
29
|
-
res.json(data);
|
30
|
-
});
|
31
|
-
|
32
|
-
app.all('/header-parrot', (req, res) => {
|
33
|
-
logger.info('Test message', { t: 1 });
|
34
|
-
res.json(req.headers);
|
35
|
-
});
|
36
|
-
|
37
|
-
app.listen(8080, () => {
|
38
|
-
logger.info('App listen');
|
39
|
-
});
|
package/jest.config.js
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
module.exports = {
|
2
|
-
testEnvironment: 'node',
|
3
|
-
roots: ['<rootDir>/tests'],
|
4
|
-
transform: {
|
5
|
-
'^.+\\.tsx?$': 'ts-jest',
|
6
|
-
},
|
7
|
-
testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$',
|
8
|
-
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
|
9
|
-
coverageThreshold: {
|
10
|
-
global: {
|
11
|
-
lines: 70,
|
12
|
-
},
|
13
|
-
},
|
14
|
-
}
|
package/nodemon.json
DELETED
package/src/config.ts
DELETED
@@ -1,58 +0,0 @@
|
|
1
|
-
const correlationIdHeader = 'x-trace-id';
|
2
|
-
|
3
|
-
const validateHeaderList = (headers): void => {
|
4
|
-
if (!Array.isArray(headers)) {
|
5
|
-
throw new Error('Header list is not an array');
|
6
|
-
}
|
7
|
-
|
8
|
-
// could be tighter - ASCII code between 33 and 126 at the moment
|
9
|
-
const headerNameRegex = /^[\x21-\x7e]+$/i;
|
10
|
-
|
11
|
-
const invalidHeaders = headers.filter((h) => typeof h !== 'string' || !headerNameRegex.test(h));
|
12
|
-
|
13
|
-
if (invalidHeaders.length > 0) {
|
14
|
-
throw new Error(`Header list contains invalid headers: ${invalidHeaders}`);
|
15
|
-
}
|
16
|
-
};
|
17
|
-
|
18
|
-
interface Overrides {
|
19
|
-
setAndPropagateCorrelationId?: boolean;
|
20
|
-
propagateInResponses?: boolean;
|
21
|
-
headersToPropagate?: string[];
|
22
|
-
headersPrefix?: string;
|
23
|
-
}
|
24
|
-
|
25
|
-
const load = (overrides: Overrides = {}) => {
|
26
|
-
const {
|
27
|
-
setAndPropagateCorrelationId = true,
|
28
|
-
propagateInResponses = false,
|
29
|
-
headersToPropagate = [
|
30
|
-
'x-request-id',
|
31
|
-
'x-variant-id',
|
32
|
-
],
|
33
|
-
headersPrefix = 'x-af-',
|
34
|
-
} = overrides;
|
35
|
-
|
36
|
-
validateHeaderList(headersToPropagate);
|
37
|
-
|
38
|
-
const headersToCollect = headersToPropagate;
|
39
|
-
|
40
|
-
let headersToInject = headersToCollect;
|
41
|
-
if (setAndPropagateCorrelationId === true) {
|
42
|
-
headersToInject = [correlationIdHeader].concat(headersToCollect);
|
43
|
-
}
|
44
|
-
|
45
|
-
return {
|
46
|
-
setAndPropagateCorrelationId,
|
47
|
-
propagateInResponses,
|
48
|
-
correlationIdHeader,
|
49
|
-
headersToCollect,
|
50
|
-
headersToInject,
|
51
|
-
headersPrefix,
|
52
|
-
};
|
53
|
-
};
|
54
|
-
|
55
|
-
export default {
|
56
|
-
load,
|
57
|
-
correlationIdHeader,
|
58
|
-
};
|
package/src/example.ts
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
import express from 'express';
|
2
|
-
import axios from 'axios';
|
3
|
-
import winston from 'winston';
|
4
|
-
|
5
|
-
import headersTracer from './index';
|
6
|
-
|
7
|
-
axios.defaults.adapter = require('axios/lib/adapters/http');
|
8
|
-
|
9
|
-
const logger = winston.createLogger({
|
10
|
-
transports: [
|
11
|
-
new winston.transports.Console(),
|
12
|
-
],
|
13
|
-
});
|
14
|
-
|
15
|
-
headersTracer({
|
16
|
-
setAndPropagateCorrelationId: true,
|
17
|
-
headersToPropagate: [
|
18
|
-
'x-text',
|
19
|
-
],
|
20
|
-
headersPrefix: 'x-af-',
|
21
|
-
winstonLogger: logger,
|
22
|
-
});
|
23
|
-
|
24
|
-
const app = express();
|
25
|
-
|
26
|
-
app.all('/', async (req, res) => {
|
27
|
-
const network = axios.create({ baseURL: 'http://localhost:8080/' });
|
28
|
-
const { data } = await network.get('/header-parrot');
|
29
|
-
res.json(data);
|
30
|
-
});
|
31
|
-
|
32
|
-
app.all('/header-parrot', (req, res) => {
|
33
|
-
logger.info('Test message', { t: 1 });
|
34
|
-
res.json(req.headers);
|
35
|
-
});
|
36
|
-
|
37
|
-
app.listen(8080, () => {
|
38
|
-
logger.info('App listen');
|
39
|
-
});
|
package/src/http_wrapper.ts
DELETED
@@ -1,114 +0,0 @@
|
|
1
|
-
/* eslint-disable max-len */
|
2
|
-
import http from 'http';
|
3
|
-
import shortid from 'shortid';
|
4
|
-
import { URL } from 'url';
|
5
|
-
import express from 'express';
|
6
|
-
import tracer, { newTrace } from './tracer';
|
7
|
-
|
8
|
-
const originalHttpCreateServer = http.createServer;
|
9
|
-
const originalRequest = http.request;
|
10
|
-
const originalGet = http.get;
|
11
|
-
|
12
|
-
function setAndCollectCorrelationId(config, req, res): void {
|
13
|
-
let correlationId = req.headers[config.correlationIdHeader];
|
14
|
-
if (typeof correlationId === 'undefined') {
|
15
|
-
correlationId = shortid.generate();
|
16
|
-
}
|
17
|
-
tracer.currentTrace.context.set(config.correlationIdHeader, correlationId);
|
18
|
-
res.setHeader(config.correlationIdHeader, correlationId);
|
19
|
-
}
|
20
|
-
|
21
|
-
function collect(req, headers, headersPrefix): void {
|
22
|
-
const prefixHeaders = headersPrefix
|
23
|
-
? Object.keys(req.headers).filter((hn) => hn.includes(headersPrefix))
|
24
|
-
: [];
|
25
|
-
|
26
|
-
[...headers, ...prefixHeaders].forEach((header) => {
|
27
|
-
if (typeof req.headers[header] !== 'undefined') {
|
28
|
-
tracer.currentTrace.context.set(header, req.headers[header]);
|
29
|
-
}
|
30
|
-
});
|
31
|
-
}
|
32
|
-
|
33
|
-
function injectInResponse(response, headers): void {
|
34
|
-
if (tracer.currentTrace) {
|
35
|
-
headers.forEach((header) => {
|
36
|
-
response.setHeader(header, tracer.currentTrace.context.get(header));
|
37
|
-
});
|
38
|
-
}
|
39
|
-
}
|
40
|
-
|
41
|
-
function wrappedListener(config: any, listener: express.RequestListener): express.RequestListener {
|
42
|
-
return (req: http.IncomingMessage, res: http.ServerResponse, next: any, error: any): void => {
|
43
|
-
newTrace('httpRequest');
|
44
|
-
|
45
|
-
if (config.setAndPropagateCorrelationId === true) {
|
46
|
-
setAndCollectCorrelationId(config, req, res);
|
47
|
-
}
|
48
|
-
|
49
|
-
collect(req, config.headersToCollect, config.headersPrefix);
|
50
|
-
|
51
|
-
if (config.propagateInResponses) {
|
52
|
-
injectInResponse(res, [config.correlationIdHeader]);
|
53
|
-
}
|
54
|
-
|
55
|
-
listener(req, res, next, error);
|
56
|
-
};
|
57
|
-
}
|
58
|
-
|
59
|
-
function wrapHttpCreateServer(config) {
|
60
|
-
// args of http.createServer are ([options<Object>], [listener<Fn>]) Express only sends listener
|
61
|
-
return function _wrappedHttpCreateServer(listener): http.Server {
|
62
|
-
return originalHttpCreateServer(wrappedListener(config, listener));
|
63
|
-
};
|
64
|
-
}
|
65
|
-
|
66
|
-
function inject(options): void {
|
67
|
-
if (tracer.currentTrace) {
|
68
|
-
if (!options.headers) {
|
69
|
-
// eslint-disable-next-line no-param-reassign
|
70
|
-
options.headers = {};
|
71
|
-
}
|
72
|
-
[...(tracer.currentTrace.context.keys())].forEach((header) => {
|
73
|
-
// eslint-disable-next-line no-param-reassign
|
74
|
-
options.headers[header] = tracer.currentTrace.context.get(header);
|
75
|
-
});
|
76
|
-
}
|
77
|
-
}
|
78
|
-
|
79
|
-
function wrapHttpRequest(originalMethod): any {
|
80
|
-
// Return type
|
81
|
-
function urlFirst(url, options, cb): http.ClientRequest {
|
82
|
-
inject(options);
|
83
|
-
|
84
|
-
return originalMethod(url, options, cb);
|
85
|
-
}
|
86
|
-
|
87
|
-
function optionsFirst(options, cb): http.ClientRequest {
|
88
|
-
inject(options);
|
89
|
-
|
90
|
-
return originalMethod(options, cb);
|
91
|
-
}
|
92
|
-
|
93
|
-
function wrappedHttpRequest(options: string | http.RequestOptions | URL, callback?: (res: http.IncomingMessage) => void): http.ClientRequest;
|
94
|
-
function wrappedHttpRequest(url: string | URL, options: string | http.RequestOptions | string, callback?: (res: http.IncomingMessage) => void): http.ClientRequest;
|
95
|
-
function wrappedHttpRequest(...args): http.ClientRequest {
|
96
|
-
let options = {};
|
97
|
-
let url;
|
98
|
-
let callback;
|
99
|
-
|
100
|
-
if (args.length === 3) {
|
101
|
-
[options, url, callback] = args;
|
102
|
-
return urlFirst(url, options, callback);
|
103
|
-
}
|
104
|
-
[options, callback] = args;
|
105
|
-
return optionsFirst(options, callback);
|
106
|
-
}
|
107
|
-
return wrappedHttpRequest;
|
108
|
-
}
|
109
|
-
|
110
|
-
export default function wrapHttp(config): void { // args ([options<Object>])
|
111
|
-
http.createServer = wrapHttpCreateServer(config);
|
112
|
-
http.request = wrapHttpRequest(originalRequest);
|
113
|
-
http.get = wrapHttpRequest(originalGet);
|
114
|
-
}
|
package/src/index.ts
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
import winston, { format } from 'winston';
|
2
|
-
|
3
|
-
import httpWrapper from './http_wrapper';
|
4
|
-
import config from './config';
|
5
|
-
import * as tracer from './tracer';
|
6
|
-
|
7
|
-
interface Options {
|
8
|
-
winstonLogger?: winston.Logger;
|
9
|
-
loggerTraceKey? : string;
|
10
|
-
headersPrefix?: string;
|
11
|
-
setAndPropagateCorrelationId?: boolean;
|
12
|
-
headersToPropagate?: string[];
|
13
|
-
}
|
14
|
-
|
15
|
-
const addMetadataToLog = (loggerTraceKey) => format((info) => {
|
16
|
-
const currentTrace = tracer.getCurrentTrace();
|
17
|
-
if (currentTrace && currentTrace.context && currentTrace.context.get) {
|
18
|
-
// eslint-disable-next-line no-param-reassign
|
19
|
-
info[loggerTraceKey] = currentTrace.context.get(config.correlationIdHeader);
|
20
|
-
}
|
21
|
-
|
22
|
-
return info;
|
23
|
-
});
|
24
|
-
|
25
|
-
export default function (options: Options): void {
|
26
|
-
httpWrapper(config.load(options));
|
27
|
-
tracer.enable();
|
28
|
-
|
29
|
-
if (options.winstonLogger) {
|
30
|
-
const traceKey = options.loggerTraceKey || 'traceId';
|
31
|
-
// eslint-disable-next-line no-param-reassign
|
32
|
-
options.winstonLogger.format = format.combine(
|
33
|
-
addMetadataToLog(traceKey)(),
|
34
|
-
options.winstonLogger.format,
|
35
|
-
);
|
36
|
-
}
|
37
|
-
|
38
|
-
try {
|
39
|
-
// eslint-disable-next-line global-require, @typescript-eslint/no-var-requires
|
40
|
-
const bluebird = require('bluebird');
|
41
|
-
bluebird.config({
|
42
|
-
asyncHooks: true,
|
43
|
-
});
|
44
|
-
} catch (e) {
|
45
|
-
// Do nothing
|
46
|
-
} finally {
|
47
|
-
// Do nothing
|
48
|
-
}
|
49
|
-
}
|
50
|
-
|
51
|
-
export const getCurrentContext = (): any => tracer.getCurrentTrace();
|
52
|
-
|
53
|
-
export const { newTrace } = tracer;
|
54
|
-
|
55
|
-
export const traceTypes = {
|
56
|
-
HTTP_REQUEST: 'httpRequest',
|
57
|
-
WEB_SOCKET: 'webSocket',
|
58
|
-
RABBIT: 'rabbit',
|
59
|
-
};
|
package/src/tracer.ts
DELETED
@@ -1,77 +0,0 @@
|
|
1
|
-
import asyncHooks from 'async_hooks';
|
2
|
-
import uuid from 'uuid';
|
3
|
-
|
4
|
-
const prevStates = {};
|
5
|
-
|
6
|
-
const tracer = {
|
7
|
-
currentTrace: null,
|
8
|
-
traces: {},
|
9
|
-
};
|
10
|
-
|
11
|
-
function init(asyncId, type, triggerAsyncId): void {
|
12
|
-
if (tracer.traces[triggerAsyncId]) {
|
13
|
-
tracer.traces[asyncId] = tracer.traces[triggerAsyncId];
|
14
|
-
}
|
15
|
-
}
|
16
|
-
|
17
|
-
function before(asyncId): void {
|
18
|
-
if (!tracer.traces[asyncId]) {
|
19
|
-
return;
|
20
|
-
}
|
21
|
-
prevStates[asyncId] = tracer.currentTrace;
|
22
|
-
tracer.currentTrace = tracer.traces[asyncId];
|
23
|
-
}
|
24
|
-
|
25
|
-
function after(asyncId): void {
|
26
|
-
if (!tracer.traces[asyncId]) {
|
27
|
-
return;
|
28
|
-
}
|
29
|
-
tracer.currentTrace = prevStates[asyncId];
|
30
|
-
}
|
31
|
-
|
32
|
-
function destroy(asyncId): void {
|
33
|
-
if (tracer.traces[asyncId]) {
|
34
|
-
delete tracer.traces[asyncId];
|
35
|
-
delete prevStates[asyncId];
|
36
|
-
}
|
37
|
-
}
|
38
|
-
|
39
|
-
const hook = asyncHooks.createHook({
|
40
|
-
init, before, after, destroy,
|
41
|
-
});
|
42
|
-
|
43
|
-
class Trace {
|
44
|
-
id: string;
|
45
|
-
|
46
|
-
type: string;
|
47
|
-
|
48
|
-
context: Map<string, string>;
|
49
|
-
|
50
|
-
constructor(type) {
|
51
|
-
this.id = uuid.v1();
|
52
|
-
this.type = type;
|
53
|
-
this.context = new Map();
|
54
|
-
}
|
55
|
-
}
|
56
|
-
|
57
|
-
let isTraceEnabled = false;
|
58
|
-
|
59
|
-
export const enable = (): asyncHooks.AsyncHook => {
|
60
|
-
if (isTraceEnabled) {
|
61
|
-
return hook;
|
62
|
-
}
|
63
|
-
hook.enable();
|
64
|
-
isTraceEnabled = true;
|
65
|
-
return hook;
|
66
|
-
};
|
67
|
-
|
68
|
-
export const newTrace = (type): void => {
|
69
|
-
enable();
|
70
|
-
tracer.currentTrace = new Trace(type);
|
71
|
-
tracer.traces[asyncHooks.executionAsyncId()] = tracer.currentTrace;
|
72
|
-
return tracer.currentTrace;
|
73
|
-
};
|
74
|
-
|
75
|
-
export const getCurrentTrace = (): any => tracer.currentTrace || {};
|
76
|
-
|
77
|
-
export default tracer;
|