@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.
Files changed (42) hide show
  1. package/dist/config.d.ts +16 -0
  2. package/dist/{src/config.js → config.js} +4 -6
  3. package/dist/config.js.map +1 -0
  4. package/dist/const.d.ts +6 -0
  5. package/dist/const.js +9 -0
  6. package/dist/const.js.map +1 -0
  7. package/dist/http_wrapper.d.ts +2 -0
  8. package/dist/{src/http_wrapper.js → http_wrapper.js} +40 -27
  9. package/dist/http_wrapper.js.map +1 -0
  10. package/dist/index.d.ts +13 -0
  11. package/dist/index.js +64 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/tracer.d.ts +18 -0
  14. package/dist/{src/tracer.js → tracer.js} +13 -9
  15. package/dist/tracer.js.map +1 -0
  16. package/package.json +49 -32
  17. package/readme.md +1 -1
  18. package/dist/src/config.d.ts +0 -18
  19. package/dist/src/config.js.map +0 -1
  20. package/dist/src/example.d.ts +0 -1
  21. package/dist/src/example.js +0 -46
  22. package/dist/src/example.js.map +0 -1
  23. package/dist/src/http_wrapper.d.ts +0 -1
  24. package/dist/src/http_wrapper.js.map +0 -1
  25. package/dist/src/index.d.ts +0 -17
  26. package/dist/src/index.js +0 -55
  27. package/dist/src/index.js.map +0 -1
  28. package/dist/src/tracer.d.ts +0 -10
  29. package/dist/src/tracer.js.map +0 -1
  30. package/dist/tests/http-wrapper.test.d.ts +0 -1
  31. package/dist/tests/http-wrapper.test.js +0 -202
  32. package/dist/tests/http-wrapper.test.js.map +0 -1
  33. package/examples/example.ts +0 -39
  34. package/jest.config.js +0 -14
  35. package/nodemon.json +0 -6
  36. package/src/config.ts +0 -58
  37. package/src/example.ts +0 -39
  38. package/src/http_wrapper.ts +0 -114
  39. package/src/index.ts +0 -59
  40. package/src/tracer.ts +0 -77
  41. package/tests/http-wrapper.test.ts +0 -206
  42. package/tsconfig.json +0 -30
@@ -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;
@@ -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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"}
@@ -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
@@ -1,6 +0,0 @@
1
- {
2
- "ignore": ["**/*.test.ts", "**/*.spec.ts", ".git", "node_modules"],
3
- "watch": ["src"],
4
- "exec": "npm start",
5
- "ext": "ts"
6
- }
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
- });
@@ -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;