diff --git a/.github/workflows/staging-backend.yml b/.github/workflows/staging-backend.yml index 894e3d89..73cbb1ee 100644 --- a/.github/workflows/staging-backend.yml +++ b/.github/workflows/staging-backend.yml @@ -3,7 +3,7 @@ name: Release staging backend on: push: branches: - - main + - trunk paths: - 'backend/**' - '.github/workflows/staging-backend.yml' @@ -29,3 +29,19 @@ jobs: tags: toska/back-grappa2:staging build-args: | GIT_SHA=${{ github.sha }} + sentry-release: + runs-on: ubuntu-latest + needs: build + + steps: + - uses: actions/checkout@v2 + - name: Create Sentry release + uses: getsentry/action-release@v1 + env: + SENTRY_URL: https://sentry.cs.helsinki.fi + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + SENTRY_ORG: toska + SENTRY_PROJECT: grappa + with: + environment: staging + set_commits: 'skip' diff --git a/.github/workflows/staging-frontend.yml b/.github/workflows/staging-frontend.yml index e9885e24..c5225547 100644 --- a/.github/workflows/staging-frontend.yml +++ b/.github/workflows/staging-frontend.yml @@ -3,7 +3,7 @@ name: Release staging frontend on: push: branches: - - main + - trunk paths: - 'frontend/**' - '.github/workflows/staging-frontend.yml' @@ -29,5 +29,32 @@ jobs: push: true tags: toska/front-grappa2:staging build-args: | + NODE_ENV=staging BASE_PATH=/staging/ GIT_SHA=${{ github.sha }} + + sentry-release: + runs-on: ubuntu-latest + needs: build + + steps: + - uses: actions/checkout@v2 + + - name: Pull image and create a container + run: docker create --name front-grappa2 toska/front-grappa2:staging + + - name: Copy assets from the container + run: docker cp front-grappa2:/usr/src/app/build ./build + + - name: Create Sentry release + uses: getsentry/action-release@v1 + env: + SENTRY_URL: https://sentry.cs.helsinki.fi + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + SENTRY_ORG: toska + SENTRY_PROJECT: grappa + with: + environment: staging + set_commits: 'skip' + sourcemaps: './build/static/js' + url_prefix: '~/staging/static/js' diff --git a/backend/index.js b/backend/index.js index 8d32ee52..0f6a1d45 100644 --- a/backend/index.js +++ b/backend/index.js @@ -2,18 +2,24 @@ require('dotenv').config() require('babel-core/register') require('babel-polyfill') const express = require('express') -const Raven = require('raven') +const Sentry = require('@sentry/node') const cors = require('cors') const gracefulExit = require('express-graceful-exit') const logger = require('./src/util/logger') const routes = require('./src/routes.js') const errorHandler = require('./src/util/errorHandler') +const initializeSentry = require('./src/util/sentry') const app = express() + +initializeSentry(app) + +app.use(Sentry.Handlers.requestHandler()) +app.use(Sentry.Handlers.tracingHandler()) + const server = require('http').createServer(app) -Raven.config(process.env.SENTRY_ADDR).install() app.listen(3100, () => { logger.info('Grappa app listening on port 3100!') diff --git a/backend/package-lock.json b/backend/package-lock.json index 20b55df5..33978306 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -126,6 +126,87 @@ } } }, + "@sentry/core": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.4.1.tgz", + "integrity": "sha512-Lx13oTiP+Tjvm5VxulcCszNVd2S1wY4viSnr+ygq62ySVERR+t7uOZDSARZ0rZ259GwW6nkbMh9dDmD0d6VCGQ==", + "requires": { + "@sentry/hub": "6.4.1", + "@sentry/minimal": "6.4.1", + "@sentry/types": "6.4.1", + "@sentry/utils": "6.4.1", + "tslib": "^1.9.3" + } + }, + "@sentry/hub": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.4.1.tgz", + "integrity": "sha512-7IZRP5buDE6s/c3vWzzPR/ySE+8GUuHPgTEPiDCPOCWwUN11zXDafJDKkJqY3muJfebUKmC/JG67RyBx+XlnlQ==", + "requires": { + "@sentry/types": "6.4.1", + "@sentry/utils": "6.4.1", + "tslib": "^1.9.3" + } + }, + "@sentry/minimal": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.4.1.tgz", + "integrity": "sha512-4x/PRbDZACCKJqjta9EkhiIMyGMf7VgBX13EEWEDVWLP7ymFukBuTr4ap/Tz9429kB/yXZuDGGMIZp/G618H3g==", + "requires": { + "@sentry/hub": "6.4.1", + "@sentry/types": "6.4.1", + "tslib": "^1.9.3" + } + }, + "@sentry/node": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-6.4.1.tgz", + "integrity": "sha512-w4IFRA7UFZxKL9xVXmQU8eAjVMY/sr0fJcTV8Wma4uZqa1FQVX4p6xgfylLrcaA8VsolE3l9LRrP1XYxCVwvOw==", + "requires": { + "@sentry/core": "6.4.1", + "@sentry/hub": "6.4.1", + "@sentry/tracing": "6.4.1", + "@sentry/types": "6.4.1", + "@sentry/utils": "6.4.1", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + }, + "dependencies": { + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + } + } + }, + "@sentry/tracing": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-6.4.1.tgz", + "integrity": "sha512-EPRadE9n/wpUjx4jqP/8vXdOAZBk7vjlzRKniJgKgQUO3v03i0ui6xydaal2mvhplIyOCI2muXdGhjUO7ga4uw==", + "requires": { + "@sentry/hub": "6.4.1", + "@sentry/minimal": "6.4.1", + "@sentry/types": "6.4.1", + "@sentry/utils": "6.4.1", + "tslib": "^1.9.3" + } + }, + "@sentry/types": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.4.1.tgz", + "integrity": "sha512-sTu/GaLsLYk1AkAqpkMT4+4q665LtZjhV0hkgiTD4N3zPl5uSf1pCIzxPRYjOpe7NEANmWv8U4PaGKGtc2eMfA==" + }, + "@sentry/utils": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.4.1.tgz", + "integrity": "sha512-xJ1uVa5fvg23pXQfulvCIBb9pQ3p1awyd1PapK2AYi+wKjTuYl4B9edmhjRREEQEExznl/d2OVm78fRXLq7M9Q==", + "requires": { + "@sentry/types": "6.4.1", + "tslib": "^1.9.3" + } + }, "@sinonjs/commons": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.2.tgz", @@ -213,6 +294,29 @@ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==" }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "ajv": { "version": "6.12.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", @@ -1977,11 +2081,6 @@ "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", "dev": true }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" - }, "checkit": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/checkit/-/checkit-0.7.0.tgz", @@ -2435,11 +2534,6 @@ "which": "^1.2.9" } }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" - }, "crypto-random-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", @@ -4830,6 +4924,30 @@ "sshpk": "^1.7.0" } }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "hullabaloo-config-manager": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/hullabaloo-config-manager/-/hullabaloo-config-manager-1.1.1.tgz", @@ -6023,6 +6141,11 @@ "yallist": "^2.1.2" } }, + "lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=" + }, "magic-string": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.1.tgz", @@ -6103,16 +6226,6 @@ "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", "dev": true }, - "md5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", - "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", - "requires": { - "charenc": "~0.0.1", - "crypt": "~0.0.1", - "is-buffer": "~1.1.1" - } - }, "md5-hex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-2.0.0.tgz", @@ -7440,30 +7553,6 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, - "raven": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/raven/-/raven-2.6.4.tgz", - "integrity": "sha512-6PQdfC4+DQSFncowthLf+B6Hr0JpPsFBgTVYTAOq7tCmx/kR4SXbeawtPch20+3QfUcQDoJBLjWW1ybvZ4kXTw==", - "requires": { - "cookie": "0.3.1", - "md5": "^2.2.1", - "stack-trace": "0.0.10", - "timed-out": "4.0.1", - "uuid": "3.3.2" - }, - "dependencies": { - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - } - } - }, "raw-body": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", @@ -9040,7 +9129,8 @@ "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true }, "tiny-inflate": { "version": "1.0.3", @@ -9144,6 +9234,11 @@ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", diff --git a/backend/package.json b/backend/package.json index c0097f81..daaa22da 100755 --- a/backend/package.json +++ b/backend/package.json @@ -26,6 +26,7 @@ }, "homepage": "https://github.com/UniversityOfHelsinkiCS/back-grappa2#readme", "dependencies": { + "@sentry/node": "^6.4.1", "axios": "^0.19.2", "babel-core": "^6.26.3", "babel-polyfill": "^6.26.0", @@ -50,7 +51,6 @@ "nodemailer": "^4.6.8", "pdfkit": "^0.8.3", "pg": "^7.6.1", - "raven": "^2.6.4", "request": "^2.88.0", "utf8": "^3.0.0", "uuid": "^3.3.2", diff --git a/backend/src/routes.js b/backend/src/routes.js index 0cd24a51..3d42047b 100644 --- a/backend/src/routes.js +++ b/backend/src/routes.js @@ -36,6 +36,9 @@ const accessLogger = morgan((tokens, req, res) => { }) module.exports = (app) => { + app.use('/sandbox', (req, res) => { //eslint-disable-line + throw new Error('Grappa ei toimi :eitoimi:') + }) app.use(auditLogger) app.use(login) app.use(auth.checkAuth, accessLogger) diff --git a/backend/src/util/sentry.js b/backend/src/util/sentry.js new file mode 100644 index 00000000..e9a4c464 --- /dev/null +++ b/backend/src/util/sentry.js @@ -0,0 +1,23 @@ +const Sentry = require('@sentry/node') +const Tracing = require('@sentry/tracing') // eslint-disable-line + +const { GIT_SHA, NODE_ENV } = process.env +const IN_PRODUCTION = NODE_ENV === 'development' || NODE_ENV === 'staging' + + +const initializeSentry = (app) => { + if (!IN_PRODUCTION) return + + Sentry.init({ + dsn: 'https://937cdbbab78348eaa445788e08bdba9c@sentry.cs.helsinki.fi/8', + release: GIT_SHA, + integrations: [ + new Sentry.Integrations.Http({ tracing: true }), + new Tracing.Integrations.Express({ app }) + ], + environment: NODE_ENV, + tracesSampleRate: 1.0 + }) +} + +module.exports = initializeSentry diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 40a7d6e7..3615b5a7 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -226,6 +226,98 @@ } } }, + "@sentry/browser": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-6.4.1.tgz", + "integrity": "sha512-3cDud6GWutnJqcnheIq0lPNTsUJbrRLevQ+g1YfawVXFUxfmmY2bOsGd/Mxq17LxYeBHgKTitXv3DU1bsQ+WBQ==", + "requires": { + "@sentry/core": "6.4.1", + "@sentry/types": "6.4.1", + "@sentry/utils": "6.4.1", + "tslib": "^1.9.3" + } + }, + "@sentry/core": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.4.1.tgz", + "integrity": "sha512-Lx13oTiP+Tjvm5VxulcCszNVd2S1wY4viSnr+ygq62ySVERR+t7uOZDSARZ0rZ259GwW6nkbMh9dDmD0d6VCGQ==", + "requires": { + "@sentry/hub": "6.4.1", + "@sentry/minimal": "6.4.1", + "@sentry/types": "6.4.1", + "@sentry/utils": "6.4.1", + "tslib": "^1.9.3" + } + }, + "@sentry/hub": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.4.1.tgz", + "integrity": "sha512-7IZRP5buDE6s/c3vWzzPR/ySE+8GUuHPgTEPiDCPOCWwUN11zXDafJDKkJqY3muJfebUKmC/JG67RyBx+XlnlQ==", + "requires": { + "@sentry/types": "6.4.1", + "@sentry/utils": "6.4.1", + "tslib": "^1.9.3" + } + }, + "@sentry/minimal": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.4.1.tgz", + "integrity": "sha512-4x/PRbDZACCKJqjta9EkhiIMyGMf7VgBX13EEWEDVWLP7ymFukBuTr4ap/Tz9429kB/yXZuDGGMIZp/G618H3g==", + "requires": { + "@sentry/hub": "6.4.1", + "@sentry/types": "6.4.1", + "tslib": "^1.9.3" + } + }, + "@sentry/react": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-6.4.1.tgz", + "integrity": "sha512-/rbp9jFgFc+m3DWhI58uKSLQxXtIW5bKqu5eVO/9jedhLzGRGBp0eOlJ5qtZ3KtYKSyPbA4uEBY5qI0rGwipeA==", + "requires": { + "@sentry/browser": "6.4.1", + "@sentry/minimal": "6.4.1", + "@sentry/types": "6.4.1", + "@sentry/utils": "6.4.1", + "hoist-non-react-statics": "^3.3.2", + "tslib": "^1.9.3" + }, + "dependencies": { + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + } + } + } + }, + "@sentry/tracing": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-6.4.1.tgz", + "integrity": "sha512-EPRadE9n/wpUjx4jqP/8vXdOAZBk7vjlzRKniJgKgQUO3v03i0ui6xydaal2mvhplIyOCI2muXdGhjUO7ga4uw==", + "requires": { + "@sentry/hub": "6.4.1", + "@sentry/minimal": "6.4.1", + "@sentry/types": "6.4.1", + "@sentry/utils": "6.4.1", + "tslib": "^1.9.3" + } + }, + "@sentry/types": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.4.1.tgz", + "integrity": "sha512-sTu/GaLsLYk1AkAqpkMT4+4q665LtZjhV0hkgiTD4N3zPl5uSf1pCIzxPRYjOpe7NEANmWv8U4PaGKGtc2eMfA==" + }, + "@sentry/utils": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.4.1.tgz", + "integrity": "sha512-xJ1uVa5fvg23pXQfulvCIBb9pQ3p1awyd1PapK2AYi+wKjTuYl4B9edmhjRREEQEExznl/d2OVm78fRXLq7M9Q==", + "requires": { + "@sentry/types": "6.4.1", + "tslib": "^1.9.3" + } + }, "@types/node": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-9.3.0.tgz", @@ -15946,6 +16038,11 @@ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 01f840e1..90f4c887 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -13,6 +13,8 @@ "lint": "eslint --ext .js src || true" }, "dependencies": { + "@sentry/react": "^6.4.1", + "@sentry/tracing": "^6.4.1", "autoprefixer": "7.2.5", "axios": "^0.17.1", "babel-core": "6.26.0", diff --git a/frontend/public/index.html b/frontend/public/index.html index 34d3d51b..c2bc4994 100644 --- a/frontend/public/index.html +++ b/frontend/public/index.html @@ -4,7 +4,6 @@ -