APILensAPILens
frameworks/express

Express

v4 / v5

The most popular Node.js framework, done in one line.

Drop-in middleware for Express 4 and 5. Attaches to `app.use()` — every route is automatically observed with zero code changes.

Install

bash
npm install auto-api-observe

Quick Start

The minimal setup — import, configure, and you're observing.

express-quick-start.js
javascript
const express = require('express');
const observe  = require('auto-api-observe');

const app = express();

app.use(observe({
  apiKey: process.env.APILENS_KEY,
}));

app.get('/users', (req, res) => res.json({ users: [] }));
app.listen(3000);

Full Example

All available options with custom fields and real-world usage.

express-full.js
javascript
const express = require('express');
const { addField } = require('auto-api-observe');
const observe       = require('auto-api-observe');

const app = express();
app.use(express.json());

app.use(observe({
  apiKey:                   process.env.APILENS_KEY,
  slowThreshold:            800,
  skipRoutes:               ['/health', '/ping'],
  tags:                     { service: 'user-api', env: process.env.NODE_ENV },
  processMetrics:           30_000,
  captureUnhandledErrors:   true,
  autoInstrumentOutbound:   true,
  onResponse: (entry) => {
    if (entry.slow) console.warn('Slow request', entry.route, entry.latency);
  },
}));

app.get('/users/:id', async (req, res) => {
  addField('userId', req.params.id);
  const user = await db.query('SELECT * FROM users WHERE id = $1', [req.params.id]);
  res.json(user.rows[0]);
});

app.listen(3000, () => console.log('Listening on :3000'));

What's Tracked Automatically

  • Route pattern (e.g. /users/:id not /users/42)
  • HTTP method, status code, latency
  • Client IP (respects x-forwarded-for)
  • User-Agent header
  • request-size / response-size via Content-Length
  • DB queries via auto-instrumentation
  • Outbound HTTP calls (fetch / axios / undici)

Options Reference

OptionTypeDefault
apiKeystring
slowThresholdnumber1000
skipRoutesstring[][]
tagsRecord{}
sampleRatenumber1.0
processMetricsnumber | false30000
captureUnhandledErrorsbooleanfalse
autoInstrumentOutboundbooleantrue
loggerfunction|falseconsole.log
onRequestfunction
onResponsefunction

Custom Fields

Attach any business context to the current request via AsyncLocalStorage — scoped per request, works the same on every framework.

javascript
const { addField } = require('auto-api-observe');

// In any route handler:
addField('userId',  req.user.id);
addField('plan',    req.user.plan);
addField('country', req.headers['cf-ipcountry']);

// Sensitive keys are auto-redacted before shipping:
addField('authorization', token); // → "[REDACTED]"
addField('password',      pass);  // → "[REDACTED]"

Ready to observe your Express app?

Sign up free — get your API key in under 30 seconds. No credit card required.

Get your free API key