Express

Express

Scout supports Express 4.x+.

1. Install the @scout_apm/scout-apm package:

yarn add @scout_apm/scout-apm

2. Create a scout.js file and require it before anything else in your entry point:

// scout.js
const { init } = require("@scout_apm/scout-apm");

init({
  name: process.env.SCOUT_NAME || "my-express-app",
  key: process.env.SCOUT_KEY,
  monitor: true,
});
// app.js
require("./scout"); // must be first

const express = require("express");
const { expressMiddleware, errorMiddleware } = require("@scout_apm/scout-apm");

const app = express();

app.use(expressMiddleware({ requestTimeoutMs: 0 }));

// your routes ...

app.use(errorMiddleware()); // must be after all routes
app.listen(3000);

3. Configure Scout via ENV variables:

export SCOUT_MONITOR=true
export SCOUT_KEY="[AVAILABLE IN THE SCOUT UI]"
export SCOUT_NAME="A FRIENDLY NAME FOR YOUR APP"

If you’ve installed Scout via the Heroku Addon, the provisioning process automatically sets SCOUT_MONITOR and SCOUT_KEY via config vars. Only SCOUT_NAME is required.

4. Deploy.

It takes just a few minutes for your data to first appear within the Scout UI.

Middleware Instrumentation

Scout automatically creates a sibling span for each named middleware function under the route’s Controller/{METHOD} {path} span — no code changes required:

app.use(async function dbSessionLoad(req, res, next) {
    req.session = await loadSession(req.cookies.sessionId);
    next();
});

app.use(function corsCheck(req, res, next) {
    next();
});

app.get("/users", async (req, res) => {
    res.json({ users: [] });
});

produces:

Controller/GET /users
  ├── Middleware/dbSessionLoad
  ├── Middleware/corsCheck
  └── ...route handler...

Works the same for app-level (app.use()) and router-level (express.Router()) middleware, including nested sub-routers. The span stays open until next() is called or the response finishes, so middleware that responds via res.send()/res.end() without calling next() is still timed correctly.

Anonymous Middleware

Anonymous middleware (no function name) is skipped by default — there’d be no useful name to show. To instrument it anyway (as Middleware/anonymous), set:

init({
    // ...
    expressInstrumentAnonymousMiddleware: true,
});

or via SCOUT_EXPRESS_INSTRUMENT_ANONYMOUS_MIDDLEWARE=true.

Supported Versions

Tested against Express 4.x. No runtime version check gates this.