From 537ef39a8d69c72ba5e9d1cf72c64dd5ee80ba92 Mon Sep 17 00:00:00 2001 From: Mrugesh Mohapatra <1884376+raisedadead@users.noreply.github.com> Date: Fri, 17 Feb 2023 18:22:00 +0530 Subject: [PATCH] feat(tools): sentry apm and other telemetry (#49385) * feat(tools): sentry apm and other telemetry * fix: use middleware json to remove duplication --------- Co-authored-by: Oliver Eyton-Williams --- api-server/package.json | 3 +- api-server/src/server/index.js | 30 ++- api-server/src/server/middleware.json | 3 +- .../middlewares/sentry-tracing-handler.js | 8 + package-lock.json | 174 ++++++++++++++++-- 5 files changed, 193 insertions(+), 25 deletions(-) create mode 100644 api-server/src/server/middlewares/sentry-tracing-handler.js diff --git a/api-server/package.json b/api-server/package.json index 8b2b9214fea..f01fec9df07 100644 --- a/api-server/package.json +++ b/api-server/package.json @@ -29,7 +29,8 @@ }, "dependencies": { "@freecodecamp/loopback-component-passport": "1.2.0", - "@sentry/node": "6.19.7", + "@sentry/node": "7.37.1", + "@sentry/tracing": "7.37.1", "accepts": "1.3.8", "axios": "0.23.0", "bad-words": "3.0.4", diff --git a/api-server/src/server/index.js b/api-server/src/server/index.js index 6c350cf2cfb..ccc32d80999 100644 --- a/api-server/src/server/index.js +++ b/api-server/src/server/index.js @@ -2,6 +2,7 @@ const path = require('path'); require('dotenv').config({ path: path.resolve(__dirname, '../../../.env') }); const Sentry = require('@sentry/node'); +const Tracing = require('@sentry/tracing'); const createDebugger = require('debug'); const _ = require('lodash'); const loopback = require('loopback'); @@ -14,15 +15,6 @@ const { setupPassport } = require('./component-passport'); const log = createDebugger('fcc:server'); const reqLogFormat = ':date[iso] :status :method :response-time ms - :url'; -if (sentry.dsn === 'dsn_from_sentry_dashboard') { - log('Sentry reporting disabled unless DSN is provided.'); -} else { - Sentry.init({ - dsn: sentry.dsn - }); - log('Sentry initialized'); -} - const app = loopback(); app.set('state namespace', '__fcc__'); @@ -62,6 +54,7 @@ db.on( 'connected', _.once(() => log('db connected')) ); + app.start = _.once(function () { const server = app.listen(app.get('port'), function () { app.emit('started'); @@ -89,6 +82,25 @@ app.start = _.once(function () { }); }); +if (sentry.dsn === 'dsn_from_sentry_dashboard') { + log('Sentry reporting disabled unless DSN is provided.'); +} else { + Sentry.init({ + dsn: sentry.dsn, + integrations: [ + new Sentry.Integrations.Http({ tracing: true }), + new Tracing.Integrations.Express({ + app + }) + ], + // Capture 20% of transactions to avoid + // overwhelming Sentry and remain within + // the usage quota + tracesSampleRate: 0.2 + }); + log('Sentry initialized'); +} + module.exports = app; if (require.main === module) { diff --git a/api-server/src/server/middleware.json b/api-server/src/server/middleware.json index df8d4ae9ff8..6f282616028 100644 --- a/api-server/src/server/middleware.json +++ b/api-server/src/server/middleware.json @@ -1,6 +1,7 @@ { "initial:before": { - "./middlewares/sentry-request-handler": {} + "./middlewares/sentry-request-handler": {}, + "./middlewares/sentry-tracing-handler": {} }, "initial": { "compression": {}, diff --git a/api-server/src/server/middlewares/sentry-tracing-handler.js b/api-server/src/server/middlewares/sentry-tracing-handler.js new file mode 100644 index 00000000000..41a04e306a9 --- /dev/null +++ b/api-server/src/server/middlewares/sentry-tracing-handler.js @@ -0,0 +1,8 @@ +import { Handlers } from '@sentry/node'; +import { sentry } from '../../../../config/secrets'; + +export default function sentryRequestHandler() { + return sentry.dsn === 'dsn_from_sentry_dashboard' + ? (req, res, next) => next() + : Handlers.tracingHandler(); +} diff --git a/package-lock.json b/package-lock.json index 3646a3c624d..324b72dd1c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -114,7 +114,8 @@ "license": "BSD-3-Clause", "dependencies": { "@freecodecamp/loopback-component-passport": "1.2.0", - "@sentry/node": "6.19.7", + "@sentry/node": "7.37.1", + "@sentry/tracing": "7.37.1", "accepts": "1.3.8", "axios": "0.23.0", "bad-words": "3.0.4", @@ -5387,20 +5388,53 @@ } }, "node_modules/@sentry/node": { - "version": "6.19.7", - "license": "BSD-3-Clause", + "version": "7.37.1", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.37.1.tgz", + "integrity": "sha512-nGerngIo5JwinJgl7m0SaL/xI+YRBlhb53gbkuLSAAcnoitBFzbp7LjywsqYFTWuWDIyk7O2t124GNxtolBAgA==", "dependencies": { - "@sentry/core": "6.19.7", - "@sentry/hub": "6.19.7", - "@sentry/types": "6.19.7", - "@sentry/utils": "6.19.7", + "@sentry/core": "7.37.1", + "@sentry/types": "7.37.1", + "@sentry/utils": "7.37.1", "cookie": "^0.4.1", "https-proxy-agent": "^5.0.0", "lru_map": "^0.3.3", "tslib": "^1.9.3" }, "engines": { - "node": ">=6" + "node": ">=8" + } + }, + "node_modules/@sentry/node/node_modules/@sentry/core": { + "version": "7.37.1", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.37.1.tgz", + "integrity": "sha512-eS5hoFDjAOl7POZg6K77J0oiypiqR1782oVSB49UkjK+D8tCZzZ5PxPMv0b/O0310p7x4oZ3WGRJaWEN3vY4KQ==", + "dependencies": { + "@sentry/types": "7.37.1", + "@sentry/utils": "7.37.1", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/node/node_modules/@sentry/types": { + "version": "7.37.1", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.37.1.tgz", + "integrity": "sha512-c2HWyWSgVA0V4+DSW2qVb0yjftrb1X/q2CzCom+ayjGHO72qyWC+9Tc+7ZfotU1mapRjqUWBgkXkbGmao8N8Ug==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/node/node_modules/@sentry/utils": { + "version": "7.37.1", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.37.1.tgz", + "integrity": "sha512-/4mJOyDsfysx+5TXyJgSI+Ihw2/0EVJbrHjCyXPDXW5ADwbtU8VdBZ0unOmF0hk4QfftqwM9cyEu3BN4iBJsEA==", + "dependencies": { + "@sentry/types": "7.37.1", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=8" } }, "node_modules/@sentry/react": { @@ -5421,6 +5455,53 @@ "react": "15.x || 16.x || 17.x || 18.x" } }, + "node_modules/@sentry/tracing": { + "version": "7.37.1", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.37.1.tgz", + "integrity": "sha512-3mQG2XtMCGqDkgfzhKpRJAIfRaokNAOF8WafgAmFmZQwEDsRAFjZ3pLoO+KiBUeQE5E5et7HyWBOl9rqHCkWnQ==", + "dependencies": { + "@sentry/core": "7.37.1", + "@sentry/types": "7.37.1", + "@sentry/utils": "7.37.1", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/tracing/node_modules/@sentry/core": { + "version": "7.37.1", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.37.1.tgz", + "integrity": "sha512-eS5hoFDjAOl7POZg6K77J0oiypiqR1782oVSB49UkjK+D8tCZzZ5PxPMv0b/O0310p7x4oZ3WGRJaWEN3vY4KQ==", + "dependencies": { + "@sentry/types": "7.37.1", + "@sentry/utils": "7.37.1", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/tracing/node_modules/@sentry/types": { + "version": "7.37.1", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.37.1.tgz", + "integrity": "sha512-c2HWyWSgVA0V4+DSW2qVb0yjftrb1X/q2CzCom+ayjGHO72qyWC+9Tc+7ZfotU1mapRjqUWBgkXkbGmao8N8Ug==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/tracing/node_modules/@sentry/utils": { + "version": "7.37.1", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.37.1.tgz", + "integrity": "sha512-/4mJOyDsfysx+5TXyJgSI+Ihw2/0EVJbrHjCyXPDXW5ADwbtU8VdBZ0unOmF0hk4QfftqwM9cyEu3BN4iBJsEA==", + "dependencies": { + "@sentry/types": "7.37.1", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@sentry/types": { "version": "6.19.7", "license": "BSD-3-Clause", @@ -55587,7 +55668,8 @@ "@babel/preset-env": "7.18.0", "@babel/register": "7.17.7", "@freecodecamp/loopback-component-passport": "1.2.0", - "@sentry/node": "6.19.7", + "@sentry/node": "7.37.1", + "@sentry/tracing": "7.37.1", "accepts": "1.3.8", "axios": "0.23.0", "babel-core": "7.0.0-bridge.0", @@ -57572,16 +57654,43 @@ } }, "@sentry/node": { - "version": "6.19.7", + "version": "7.37.1", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.37.1.tgz", + "integrity": "sha512-nGerngIo5JwinJgl7m0SaL/xI+YRBlhb53gbkuLSAAcnoitBFzbp7LjywsqYFTWuWDIyk7O2t124GNxtolBAgA==", "requires": { - "@sentry/core": "6.19.7", - "@sentry/hub": "6.19.7", - "@sentry/types": "6.19.7", - "@sentry/utils": "6.19.7", + "@sentry/core": "7.37.1", + "@sentry/types": "7.37.1", + "@sentry/utils": "7.37.1", "cookie": "^0.4.1", "https-proxy-agent": "^5.0.0", "lru_map": "^0.3.3", "tslib": "^1.9.3" + }, + "dependencies": { + "@sentry/core": { + "version": "7.37.1", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.37.1.tgz", + "integrity": "sha512-eS5hoFDjAOl7POZg6K77J0oiypiqR1782oVSB49UkjK+D8tCZzZ5PxPMv0b/O0310p7x4oZ3WGRJaWEN3vY4KQ==", + "requires": { + "@sentry/types": "7.37.1", + "@sentry/utils": "7.37.1", + "tslib": "^1.9.3" + } + }, + "@sentry/types": { + "version": "7.37.1", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.37.1.tgz", + "integrity": "sha512-c2HWyWSgVA0V4+DSW2qVb0yjftrb1X/q2CzCom+ayjGHO72qyWC+9Tc+7ZfotU1mapRjqUWBgkXkbGmao8N8Ug==" + }, + "@sentry/utils": { + "version": "7.37.1", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.37.1.tgz", + "integrity": "sha512-/4mJOyDsfysx+5TXyJgSI+Ihw2/0EVJbrHjCyXPDXW5ADwbtU8VdBZ0unOmF0hk4QfftqwM9cyEu3BN4iBJsEA==", + "requires": { + "@sentry/types": "7.37.1", + "tslib": "^1.9.3" + } + } } }, "@sentry/react": { @@ -57595,6 +57704,43 @@ "tslib": "^1.9.3" } }, + "@sentry/tracing": { + "version": "7.37.1", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.37.1.tgz", + "integrity": "sha512-3mQG2XtMCGqDkgfzhKpRJAIfRaokNAOF8WafgAmFmZQwEDsRAFjZ3pLoO+KiBUeQE5E5et7HyWBOl9rqHCkWnQ==", + "requires": { + "@sentry/core": "7.37.1", + "@sentry/types": "7.37.1", + "@sentry/utils": "7.37.1", + "tslib": "^1.9.3" + }, + "dependencies": { + "@sentry/core": { + "version": "7.37.1", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.37.1.tgz", + "integrity": "sha512-eS5hoFDjAOl7POZg6K77J0oiypiqR1782oVSB49UkjK+D8tCZzZ5PxPMv0b/O0310p7x4oZ3WGRJaWEN3vY4KQ==", + "requires": { + "@sentry/types": "7.37.1", + "@sentry/utils": "7.37.1", + "tslib": "^1.9.3" + } + }, + "@sentry/types": { + "version": "7.37.1", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.37.1.tgz", + "integrity": "sha512-c2HWyWSgVA0V4+DSW2qVb0yjftrb1X/q2CzCom+ayjGHO72qyWC+9Tc+7ZfotU1mapRjqUWBgkXkbGmao8N8Ug==" + }, + "@sentry/utils": { + "version": "7.37.1", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.37.1.tgz", + "integrity": "sha512-/4mJOyDsfysx+5TXyJgSI+Ihw2/0EVJbrHjCyXPDXW5ADwbtU8VdBZ0unOmF0hk4QfftqwM9cyEu3BN4iBJsEA==", + "requires": { + "@sentry/types": "7.37.1", + "tslib": "^1.9.3" + } + } + } + }, "@sentry/types": { "version": "6.19.7" },