@lokalise/fastify-extras 3.0.0 → 4.0.0
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/index.d.ts +4 -2
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/plugins/bugsnagPlugin.d.ts +5 -1
- package/dist/plugins/bugsnagPlugin.js +3 -1
- package/dist/plugins/bugsnagPlugin.js.map +1 -1
- package/dist/plugins/metricsPlugin.d.ts +9 -0
- package/dist/plugins/metricsPlugin.js +53 -0
- package/dist/plugins/metricsPlugin.js.map +1 -0
- package/dist/plugins/metricsPlugin.spec.d.ts +1 -0
- package/dist/plugins/metricsPlugin.spec.js +50 -0
- package/dist/plugins/metricsPlugin.spec.js.map +1 -0
- package/dist/plugins/newrelicTransactionManagerPlugin.js +17 -11
- package/dist/plugins/newrelicTransactionManagerPlugin.js.map +1 -1
- package/package.json +9 -3
package/dist/index.d.ts
CHANGED
|
@@ -2,5 +2,7 @@ export { bugsnagPlugin, reportErrorToBugsnag } from './plugins/bugsnagPlugin';
|
|
|
2
2
|
export type { ErrorReport } from './plugins/bugsnagPlugin';
|
|
3
3
|
export { requestContextProviderPlugin, getRequestIdFastifyAppConfig, } from './plugins/requestContextProviderPlugin';
|
|
4
4
|
export type { RequestContext } from './plugins/requestContextProviderPlugin';
|
|
5
|
-
export { newrelicTransactionManagerPlugin } from './plugins/newrelicTransactionManagerPlugin';
|
|
6
|
-
export type {
|
|
5
|
+
export { newrelicTransactionManagerPlugin, NewRelicTransactionManager, } from './plugins/newrelicTransactionManagerPlugin';
|
|
6
|
+
export type { NewRelicTransactionManagerOptions } from './plugins/newrelicTransactionManagerPlugin';
|
|
7
|
+
export { metricsPlugin } from './plugins/metricsPlugin';
|
|
8
|
+
export type { ErrorObjectResolver, MetricsPluginOptions } from './plugins/metricsPlugin';
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.newrelicTransactionManagerPlugin = exports.getRequestIdFastifyAppConfig = exports.requestContextProviderPlugin = exports.reportErrorToBugsnag = exports.bugsnagPlugin = void 0;
|
|
3
|
+
exports.metricsPlugin = exports.NewRelicTransactionManager = exports.newrelicTransactionManagerPlugin = exports.getRequestIdFastifyAppConfig = exports.requestContextProviderPlugin = exports.reportErrorToBugsnag = exports.bugsnagPlugin = void 0;
|
|
4
4
|
var bugsnagPlugin_1 = require("./plugins/bugsnagPlugin");
|
|
5
5
|
Object.defineProperty(exports, "bugsnagPlugin", { enumerable: true, get: function () { return bugsnagPlugin_1.bugsnagPlugin; } });
|
|
6
6
|
Object.defineProperty(exports, "reportErrorToBugsnag", { enumerable: true, get: function () { return bugsnagPlugin_1.reportErrorToBugsnag; } });
|
|
@@ -9,4 +9,7 @@ Object.defineProperty(exports, "requestContextProviderPlugin", { enumerable: tru
|
|
|
9
9
|
Object.defineProperty(exports, "getRequestIdFastifyAppConfig", { enumerable: true, get: function () { return requestContextProviderPlugin_1.getRequestIdFastifyAppConfig; } });
|
|
10
10
|
var newrelicTransactionManagerPlugin_1 = require("./plugins/newrelicTransactionManagerPlugin");
|
|
11
11
|
Object.defineProperty(exports, "newrelicTransactionManagerPlugin", { enumerable: true, get: function () { return newrelicTransactionManagerPlugin_1.newrelicTransactionManagerPlugin; } });
|
|
12
|
+
Object.defineProperty(exports, "NewRelicTransactionManager", { enumerable: true, get: function () { return newrelicTransactionManagerPlugin_1.NewRelicTransactionManager; } });
|
|
13
|
+
var metricsPlugin_1 = require("./plugins/metricsPlugin");
|
|
14
|
+
Object.defineProperty(exports, "metricsPlugin", { enumerable: true, get: function () { return metricsPlugin_1.metricsPlugin; } });
|
|
12
15
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":";;;AAAA,yDAA6E;AAApE,8GAAA,aAAa,OAAA;AAAE,qHAAA,oBAAoB,OAAA;AAG5C,uFAG+C;AAF7C,4IAAA,4BAA4B,OAAA;AAC5B,4IAAA,4BAA4B,OAAA;AAI9B,+
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":";;;AAAA,yDAA6E;AAApE,8GAAA,aAAa,OAAA;AAAE,qHAAA,oBAAoB,OAAA;AAG5C,uFAG+C;AAF7C,4IAAA,4BAA4B,OAAA;AAC5B,4IAAA,4BAA4B,OAAA;AAI9B,+FAGmD;AAFjD,oJAAA,gCAAgC,OAAA;AAChC,8IAAA,0BAA0B,OAAA;AAI5B,yDAAuD;AAA9C,8GAAA,aAAa,OAAA"}
|
|
@@ -8,4 +8,8 @@ export interface ErrorReport {
|
|
|
8
8
|
context?: Record<string, unknown>;
|
|
9
9
|
}
|
|
10
10
|
export declare const reportErrorToBugsnag: ({ error, severity, unhandled, context, }: ErrorReport) => false | void;
|
|
11
|
-
export
|
|
11
|
+
export interface BugsnagPluginConfig {
|
|
12
|
+
bugsnag: NodeConfig;
|
|
13
|
+
isEnabled: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare const bugsnagPlugin: import("fastify").FastifyPluginCallback<BugsnagPluginConfig, import("fastify").RawServerDefault, import("fastify").FastifyTypeProviderDefault, import("fastify").FastifyBaseLogger>;
|
|
@@ -14,7 +14,9 @@ const reportErrorToBugsnag = ({ error, severity = 'error', unhandled = true, con
|
|
|
14
14
|
});
|
|
15
15
|
exports.reportErrorToBugsnag = reportErrorToBugsnag;
|
|
16
16
|
function plugin(app, opts, done) {
|
|
17
|
-
|
|
17
|
+
if (opts.isEnabled) {
|
|
18
|
+
js_1.default.start(opts.bugsnag);
|
|
19
|
+
}
|
|
18
20
|
done();
|
|
19
21
|
}
|
|
20
22
|
exports.bugsnagPlugin = (0, fastify_plugin_1.default)(plugin, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bugsnagPlugin.js","sourceRoot":"","sources":["../../lib/plugins/bugsnagPlugin.ts"],"names":[],"mappings":";;;;AACA,6DAAiC;AAGjC,4EAA+B;AAWxB,MAAM,oBAAoB,GAAG,CAAC,EACnC,KAAK,EACL,QAAQ,GAAG,OAAO,EAClB,SAAS,GAAG,IAAI,EAChB,OAAO,GACK,EAAE,EAAE,CAChB,YAAO,CAAC,SAAS,EAAE;IACnB,YAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;QAC9B,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACzB,KAAK,CAAC,SAAS,GAAG,SAAS,CAAA;QAC3B,IAAI,OAAO,EAAE;YACX,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;SACtC;IACH,CAAC,CAAC,CAAA;AAbS,QAAA,oBAAoB,wBAa7B;
|
|
1
|
+
{"version":3,"file":"bugsnagPlugin.js","sourceRoot":"","sources":["../../lib/plugins/bugsnagPlugin.ts"],"names":[],"mappings":";;;;AACA,6DAAiC;AAGjC,4EAA+B;AAWxB,MAAM,oBAAoB,GAAG,CAAC,EACnC,KAAK,EACL,QAAQ,GAAG,OAAO,EAClB,SAAS,GAAG,IAAI,EAChB,OAAO,GACK,EAAE,EAAE,CAChB,YAAO,CAAC,SAAS,EAAE;IACnB,YAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;QAC9B,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACzB,KAAK,CAAC,SAAS,GAAG,SAAS,CAAA;QAC3B,IAAI,OAAO,EAAE;YACX,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;SACtC;IACH,CAAC,CAAC,CAAA;AAbS,QAAA,oBAAoB,wBAa7B;AAOJ,SAAS,MAAM,CAAC,GAAoB,EAAE,IAAyB,EAAE,IAAgB;IAC/E,IAAI,IAAI,CAAC,SAAS,EAAE;QAClB,YAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;KAC5B;IAED,IAAI,EAAE,CAAA;AACR,CAAC;AAEY,QAAA,aAAa,GAAG,IAAA,wBAAE,EAAC,MAAM,EAAE;IACtC,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,gBAAgB;CACvB,CAAC,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { PinoLoggerOptions } from 'fastify/types/logger';
|
|
2
|
+
export type ErrorObjectResolver = (err: unknown, correlationID?: string) => unknown;
|
|
3
|
+
export interface MetricsPluginOptions {
|
|
4
|
+
loggerOptions: PinoLoggerOptions | boolean;
|
|
5
|
+
disablePrometheusRequestLogging?: boolean;
|
|
6
|
+
bindAddress?: string;
|
|
7
|
+
errorObjectResolver: ErrorObjectResolver;
|
|
8
|
+
}
|
|
9
|
+
export declare const metricsPlugin: import("fastify").FastifyPluginCallback<MetricsPluginOptions, import("fastify").RawServerDefault, import("fastify").FastifyTypeProviderDefault, import("fastify").FastifyBaseLogger>;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.metricsPlugin = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const fastify_1 = tslib_1.__importDefault(require("fastify"));
|
|
6
|
+
const fastify_metrics_1 = tslib_1.__importDefault(require("fastify-metrics"));
|
|
7
|
+
const fastify_plugin_1 = tslib_1.__importDefault(require("fastify-plugin"));
|
|
8
|
+
const METRICS_PORT = 9080;
|
|
9
|
+
function plugin(app, opts) {
|
|
10
|
+
void app.register(fastify_metrics_1.default, {
|
|
11
|
+
defaultMetrics: { enabled: true },
|
|
12
|
+
endpoint: null,
|
|
13
|
+
clearRegisterOnInit: true,
|
|
14
|
+
name: 'metrics',
|
|
15
|
+
routeMetrics: { enabled: true },
|
|
16
|
+
});
|
|
17
|
+
const promServer = (0, fastify_1.default)({
|
|
18
|
+
logger: opts.loggerOptions,
|
|
19
|
+
disableRequestLogging: opts.disablePrometheusRequestLogging ?? true,
|
|
20
|
+
});
|
|
21
|
+
promServer.route({
|
|
22
|
+
url: '/metrics',
|
|
23
|
+
method: 'GET',
|
|
24
|
+
logLevel: 'info',
|
|
25
|
+
schema: {
|
|
26
|
+
// hide route from swagger plugins
|
|
27
|
+
// @ts-expect-error
|
|
28
|
+
hide: true,
|
|
29
|
+
},
|
|
30
|
+
handler: async (_, reply) => {
|
|
31
|
+
const metrics = await app.metrics.client.register.metrics();
|
|
32
|
+
return reply.type('text/plain').send(metrics);
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
app.addHook('onClose', async () => {
|
|
36
|
+
await promServer.close();
|
|
37
|
+
});
|
|
38
|
+
return promServer
|
|
39
|
+
.listen({
|
|
40
|
+
port: METRICS_PORT,
|
|
41
|
+
host: opts.bindAddress,
|
|
42
|
+
})
|
|
43
|
+
.catch((err) => {
|
|
44
|
+
const logObject = opts.errorObjectResolver(err);
|
|
45
|
+
promServer.log.error(logObject);
|
|
46
|
+
throw new Error('Critical error when trying to launch metrics server');
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
exports.metricsPlugin = (0, fastify_plugin_1.default)(plugin, {
|
|
50
|
+
fastify: '4.x',
|
|
51
|
+
name: 'metrics-plugin',
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=metricsPlugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metricsPlugin.js","sourceRoot":"","sources":["../../lib/plugins/metricsPlugin.ts"],"names":[],"mappings":";;;;AACA,8DAA6B;AAC7B,8EAA4C;AAC5C,4EAA+B;AAG/B,MAAM,YAAY,GAAG,IAAI,CAAA;AAWzB,SAAS,MAAM,CAAC,GAAoB,EAAE,IAA0B;IAC9D,KAAK,GAAG,CAAC,QAAQ,CAAC,yBAAc,EAAE;QAChC,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QACjC,QAAQ,EAAE,IAAI;QACd,mBAAmB,EAAE,IAAI;QACzB,IAAI,EAAE,SAAS;QACf,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;KAChC,CAAC,CAAA;IAEF,MAAM,UAAU,GAAG,IAAA,iBAAO,EAAC;QACzB,MAAM,EAAE,IAAI,CAAC,aAAa;QAC1B,qBAAqB,EAAE,IAAI,CAAC,+BAA+B,IAAI,IAAI;KACpE,CAAC,CAAA;IAEF,UAAU,CAAC,KAAK,CAAC;QACf,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,MAAM;QAChB,MAAM,EAAE;YACN,kCAAkC;YAClC,mBAAmB;YACnB,IAAI,EAAE,IAAI;SACX;QACD,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE;YAC1B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAA;YAC3D,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC/C,CAAC;KACF,CAAC,CAAA;IAEF,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAChC,MAAM,UAAU,CAAC,KAAK,EAAE,CAAA;IAC1B,CAAC,CAAC,CAAA;IAEF,OAAO,UAAU;SACd,MAAM,CAAC;QACN,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,IAAI,CAAC,WAAW;KACvB,CAAC;SACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACb,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAA;QAC/C,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QAC/B,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAA;IACxE,CAAC,CAAC,CAAA;AACN,CAAC;AAEY,QAAA,aAAa,GAAG,IAAA,wBAAE,EAAC,MAAM,EAAE;IACtC,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,gBAAgB;CACvB,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const node_core_1 = require("@lokalise/node-core");
|
|
5
|
+
const fastify_1 = tslib_1.__importDefault(require("fastify"));
|
|
6
|
+
const metricsPlugin_1 = require("./metricsPlugin");
|
|
7
|
+
async function initApp(errorObjectResolver = (err) => err) {
|
|
8
|
+
const app = (0, fastify_1.default)();
|
|
9
|
+
await app.register(metricsPlugin_1.metricsPlugin, {
|
|
10
|
+
bindAddress: '0.0.0.0',
|
|
11
|
+
loggerOptions: false,
|
|
12
|
+
errorObjectResolver,
|
|
13
|
+
});
|
|
14
|
+
await app.ready();
|
|
15
|
+
return app;
|
|
16
|
+
}
|
|
17
|
+
describe('metricsPlugin', () => {
|
|
18
|
+
let app;
|
|
19
|
+
beforeAll(async () => {
|
|
20
|
+
app = await initApp();
|
|
21
|
+
});
|
|
22
|
+
afterAll(async () => {
|
|
23
|
+
await app.close();
|
|
24
|
+
});
|
|
25
|
+
it('returns Prometheus metrics', async () => {
|
|
26
|
+
const response = await (0, node_core_1.sendGet)('http://127.0.0.1:9080', '/metrics');
|
|
27
|
+
expect(response.statusCode).toBe(200);
|
|
28
|
+
expect(response.body).toEqual(expect.any(String));
|
|
29
|
+
});
|
|
30
|
+
it('handles an error', async () => {
|
|
31
|
+
expect.assertions(2);
|
|
32
|
+
let handledError;
|
|
33
|
+
try {
|
|
34
|
+
await initApp((err) => {
|
|
35
|
+
handledError = err;
|
|
36
|
+
return err;
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
// eslint-disable-next-line jest/no-conditional-expect
|
|
41
|
+
expect(err).toMatchObject({
|
|
42
|
+
message: 'Critical error when trying to launch metrics server',
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
expect(handledError).toMatchObject({
|
|
46
|
+
code: 'EADDRINUSE',
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=metricsPlugin.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metricsPlugin.spec.js","sourceRoot":"","sources":["../../lib/plugins/metricsPlugin.spec.ts"],"names":[],"mappings":";;;AAAA,mDAA6C;AAE7C,8DAA6B;AAE7B,mDAA+C;AAE/C,KAAK,UAAU,OAAO,CAAC,sBAAsB,CAAC,GAAY,EAAE,EAAE,CAAC,GAAG;IAChE,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAA;IACrB,MAAM,GAAG,CAAC,QAAQ,CAAC,6BAAa,EAAE;QAChC,WAAW,EAAE,SAAS;QACtB,aAAa,EAAE,KAAK;QACpB,mBAAmB;KACpB,CAAC,CAAA;IAEF,MAAM,GAAG,CAAC,KAAK,EAAE,CAAA;IACjB,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAI,GAAoB,CAAA;IACxB,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,GAAG,GAAG,MAAM,OAAO,EAAE,CAAA;IACvB,CAAC,CAAC,CAAA;IACF,QAAQ,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,GAAG,CAAC,KAAK,EAAE,CAAA;IACnB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,QAAQ,GAAG,MAAM,IAAA,mBAAO,EAAC,uBAAuB,EAAE,UAAU,CAAC,CAAA;QAEnE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACrC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;QAChC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;QACpB,IAAI,YAAY,CAAA;QAChB,IAAI;YACF,MAAM,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACpB,YAAY,GAAG,GAAG,CAAA;gBAClB,OAAO,GAAG,CAAA;YACZ,CAAC,CAAC,CAAA;SACH;QAAC,OAAO,GAAG,EAAE;YACZ,sDAAsD;YACtD,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC;gBACxB,OAAO,EAAE,qDAAqD;aAC/D,CAAC,CAAA;SACH;QAED,MAAM,CAAC,YAAY,CAAC,CAAC,aAAa,CAAC;YACjC,IAAI,EAAE,YAAY;SACnB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -3,11 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.newrelicTransactionManagerPlugin = exports.NewRelicTransactionManager = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const fastify_plugin_1 = tslib_1.__importDefault(require("fastify-plugin"));
|
|
6
|
-
|
|
6
|
+
let newrelic;
|
|
7
7
|
class NewRelicTransactionManager {
|
|
8
8
|
isEnabled;
|
|
9
9
|
transactionMap;
|
|
10
10
|
constructor(isNewRelicEnabled) {
|
|
11
|
+
if (isNewRelicEnabled) {
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
13
|
+
newrelic = require('newrelic');
|
|
14
|
+
}
|
|
11
15
|
this.isEnabled = isNewRelicEnabled;
|
|
12
16
|
this.transactionMap = new Map();
|
|
13
17
|
}
|
|
@@ -15,8 +19,8 @@ class NewRelicTransactionManager {
|
|
|
15
19
|
if (!this.isEnabled) {
|
|
16
20
|
return;
|
|
17
21
|
}
|
|
18
|
-
|
|
19
|
-
this.transactionMap.set(jobName,
|
|
22
|
+
newrelic.startBackgroundTransaction(jobName, () => {
|
|
23
|
+
this.transactionMap.set(jobName, newrelic.getTransaction());
|
|
20
24
|
});
|
|
21
25
|
}
|
|
22
26
|
stop(jobId) {
|
|
@@ -35,16 +39,18 @@ exports.NewRelicTransactionManager = NewRelicTransactionManager;
|
|
|
35
39
|
function plugin(fastify, opts, done) {
|
|
36
40
|
const manager = new NewRelicTransactionManager(opts.isEnabled);
|
|
37
41
|
fastify.decorate('newrelicTransactionManager', manager);
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
(
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
if (opts.isEnabled) {
|
|
43
|
+
fastify.addHook('onClose', async () => {
|
|
44
|
+
return new Promise((resolve, reject) => {
|
|
45
|
+
newrelic.shutdown((error) => {
|
|
46
|
+
if (error) {
|
|
47
|
+
return reject(error);
|
|
48
|
+
}
|
|
49
|
+
resolve();
|
|
50
|
+
});
|
|
45
51
|
});
|
|
46
52
|
});
|
|
47
|
-
}
|
|
53
|
+
}
|
|
48
54
|
done();
|
|
49
55
|
}
|
|
50
56
|
exports.newrelicTransactionManagerPlugin = (0, fastify_plugin_1.default)(plugin, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"newrelicTransactionManagerPlugin.js","sourceRoot":"","sources":["../../lib/plugins/newrelicTransactionManagerPlugin.ts"],"names":[],"mappings":";;;;AACA,4EAA+B;
|
|
1
|
+
{"version":3,"file":"newrelicTransactionManagerPlugin.js","sourceRoot":"","sources":["../../lib/plugins/newrelicTransactionManagerPlugin.ts"],"names":[],"mappings":";;;;AACA,4EAA+B;AAc/B,IAAI,QAAkB,CAAA;AAYtB,MAAa,0BAA0B;IACpB,SAAS,CAAS;IAClB,cAAc,CAAgC;IAE/D,YAAY,iBAA0B;QACpC,IAAI,iBAAiB,EAAE;YACrB,mEAAmE;YACnE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;SAC/B;QAED,IAAI,CAAC,SAAS,GAAG,iBAAiB,CAAA;QAClC,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,EAAE,CAAA;IACjC,CAAC;IAEM,KAAK,CAAC,OAAe;QAC1B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,OAAM;SACP;QAED,QAAQ,CAAC,0BAA0B,CAAC,OAAO,EAAE,GAAG,EAAE;YAChD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAA;QAC7D,CAAC,CAAC,CAAA;IACJ,CAAC;IAEM,IAAI,CAAC,KAAa;QACvB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,OAAM;SACP;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAA;QAC1D,IAAI,IAAI,KAAK,WAAW,EAAE;YACxB,OAAM;SACP;QACD,WAAW,CAAC,GAAG,EAAE,CAAA;QACjB,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACnC,CAAC;CACF;AApCD,gEAoCC;AAED,SAAS,MAAM,CACb,OAAwB,EACxB,IAAuC,EACvC,IAAgB;IAEhB,MAAM,OAAO,GAAG,IAAI,0BAA0B,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAE9D,OAAO,CAAC,QAAQ,CAAC,4BAA4B,EAAE,OAAO,CAAC,CAAA;IAEvD,IAAI,IAAI,CAAC,SAAS,EAAE;QAClB,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;YACpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,QAAQ,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE;oBAC1B,IAAI,KAAK,EAAE;wBACT,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;qBACrB;oBACD,OAAO,EAAE,CAAA;gBACX,CAAC,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;KACH;IAED,IAAI,EAAE,CAAA;AACR,CAAC;AAEY,QAAA,gCAAgC,GAAG,IAAA,wBAAE,EAAC,MAAM,EAAE;IACzD,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,qCAAqC;CAC5C,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lokalise/fastify-extras",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0",
|
|
4
4
|
"description": "Opinionated set of fastify plugins, commonly used in Lokalise",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Lokalise",
|
|
@@ -48,11 +48,14 @@
|
|
|
48
48
|
"@bugsnag/js": "^7.18.0",
|
|
49
49
|
"@fastify/request-context": "^4.2.0",
|
|
50
50
|
"fastify": "^4.10.2",
|
|
51
|
-
"
|
|
51
|
+
"fastify-metrics": "^10.0.1",
|
|
52
|
+
"newrelic": "^9.7.4",
|
|
53
|
+
"pino": "^8.8.0"
|
|
52
54
|
},
|
|
53
55
|
"devDependencies": {
|
|
54
56
|
"@bugsnag/js": "^7.18.0",
|
|
55
57
|
"@fastify/request-context": "^4.2.0",
|
|
58
|
+
"@lokalise/node-core": "^2.0.1",
|
|
56
59
|
"@types/jest": "^29.2.5",
|
|
57
60
|
"@types/newrelic": "^9.4.0",
|
|
58
61
|
"@types/node": "^18.11.18",
|
|
@@ -65,13 +68,16 @@
|
|
|
65
68
|
"eslint-plugin-jest": "^27.2.0",
|
|
66
69
|
"eslint-plugin-prettier": "^4.2.1",
|
|
67
70
|
"fastify": "^4.11.0",
|
|
71
|
+
"fastify-metrics": "^10.0.1",
|
|
68
72
|
"jest": "^29.3.1",
|
|
69
73
|
"newrelic": "^9.7.4",
|
|
74
|
+
"pino": "^8.8.0",
|
|
70
75
|
"prettier": "^2.8.1",
|
|
71
76
|
"shx": "^0.3.4",
|
|
72
77
|
"ts-jest": "^29.0.3",
|
|
73
78
|
"ts-node": "^10.9.1",
|
|
74
|
-
"typescript": "4.9.4"
|
|
79
|
+
"typescript": "4.9.4",
|
|
80
|
+
"undici": "^5.14.0"
|
|
75
81
|
},
|
|
76
82
|
"engines": {
|
|
77
83
|
"node": ">=18"
|