/express-sentry-proxy

express.js middleware that accepts Sentry requests and proxies them to an actual Sentry server

Primary LanguageJavaScriptMIT LicenseMIT

express-sentry-proxy

express.js Middleware that accepts Sentry requests and proxies them to an actual Sentry server

What problem does this Library solve?

Sentry is a service that captures Exceptions, both from backend as well as from frontend code. In order to capture Exceptions from frontend code, it must be included as a frontend library, either raven-js or the newer @sentry/browser. The sentry frontend library sends Exceptions to a backend Sentry service.

If your application is being served via HTTPS, the backend Sentry service must also be served via HTTPS. If it is only accessible via HTTP, the Browser will block the requests and no Exceptions will be captured.

This library adds an endpoint to your express.js application that looks like the Sentry API and redirects calls to an actual Sentry server. That way, the browser can talk to your backend service via HTTPS and your backend service will talk to the Sentry service via HTTP.

Sentry DSN

A Sentry DSN is a string that tells Sentry where to find a backend sentry Service. It looks like this:

http://123abc456@sentry.host.com/99

In this example, 123abc456 is a a sentry key, sentry.host.com is the actual host and 99 is the Sentry Project ID.

You can obtain a Sentry DSN by logging into Sentry and creating a new Project.

In order to get your frontend to talk to this library, your DSN must be rewritten and the Hostname must be replaced with the hostname of your application. This library does this automatically and adds the rewritten Sentry DSN to your Express Request object.

How to Use this Library

Install the Library via your favorite package manager

Load the middleware in your backend code

const expressSentryProxy = require('express-sentry-proxy');

Tell express to use the middleware.

Note that this snipped assumes your Sentry DSN is set in the environment variable SENTRY_DSN.

const app = express();

app.use(expressSentryProxy(process.env.SENTRY_DSN));

Pass updated Sentry DSN to Frontend

You now need to configure your frontend code to use a different Sentry DSN, so it knows that it must send its request to your backend service instead of the actual sentry service. This library adds a variable called SENTRY_DSN to your Express request object.

Assuming you are using an express view engine, you can pass the Sentry DSN as a view variable to your frontend code:

app.get('/', (req, res) => {
    res.render(
        'index',
        {
            SENTRY_DSN: req.SENTRY_DSN,
        }
    );
);

Configure Frontend

Follow the instructions of your Sentry Library. Below is an example using the (deprecated) raven-js library inside a handlebars template.

<!doctype html>
<html>
    <head>
{{#if SENTRY_DSN}}
    <script src="///cdn.ravenjs.com/3.26.2/raven.min.js" crossorigin="anonymous"></script>
    <script type="text/javascript">
        window.SENTRY_DSN = '{{SENTRY_DSN}}';
        Raven.config(window.SENTRY_DSN).install();
    </script>
{{/if}}

Endpoints added to your Express Application

  • This library adds a new POST Endpoint to your Express Application at /api/:projectId/store.
  • The rewritten Sentry DSN is added to the Express Request Object as SENTRY_DSN.

Development Setup

With local npm

Install Dependencies

npm install

Run Unit Tests

npm test

Without local npm

Install Dependencies

docker run --rm -it -v$(pwd):/app:delegated -w/app node:12-alpine npm install

Run Unit Tests

docker run --rm -it -v$(pwd):/app:delegated -w/app node:12-alpine npm test

Notes

  • This library is completely independent of the Sentry backend library @sentry/node, which is used to capture backend Exceptions.