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.