Skip to content

Express — full setup

Complete Express integration: middleware, outbound fetch, OpenAI, shutdown.

Install

bash
npm install @amlexiahq/node express

Environment

env
AMLEXIA_SDK_KEY=am_...
AMLEXIA_INGEST_URL=https://ingest.amlexia.com
AMLEXIA_ENVIRONMENT=production

Application

typescript
import express from 'express';
import OpenAI from 'openai';
import { AmlexiaClient, wrapFetch, trackOpenAiCompletion } from '@amlexiahq/node';
import { AmlexiaMiddleware } from '@amlexiahq/node/express';

const client = new AmlexiaClient({
  sdkKey: process.env.AMLEXIA_SDK_KEY!,
  ingestUrl: process.env.AMLEXIA_INGEST_URL,
  environment: process.env.AMLEXIA_ENVIRONMENT,
  releaseVersion: process.env.AMLEXIA_RELEASE,
  sampleRate: 1,
  diagnostic: process.env.NODE_ENV !== 'production',
});

// Track outbound fetch (OpenAI, Stripe, etc.)
globalThis.fetch = wrapFetch(client, fetch);

const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

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

// Inbound API tracking
app.use(AmlexiaMiddleware(client, { serviceName: 'api' }));

app.get('/health', (_req, res) => res.json({ ok: true }));

app.get('/api/users/:id', (req, res) => {
  res.json({ id: req.params.id });
});

app.post('/webhooks/stripe', async (req, res) => {
  // Middleware tracks inbound; optionally add isWebhook in manual track if custom
  res.sendStatus(200);
});

app.post('/api/chat', async (req, res) => {
  const start = Date.now();
  try {
    const completion = await openai.chat.completions.create({
      model: 'gpt-4o-mini',
      messages: req.body.messages,
    });
    await trackOpenAiCompletion(client, {
      model: completion.model,
      statusCode: 200,
      latencyMs: Date.now() - start,
      usage: completion.usage,
    });
    res.json(completion);
  } catch (e) {
    await client.track({
      endpoint: 'POST /api/chat',
      method: 'POST',
      statusCode: 500,
      latencyMs: Date.now() - start,
      provider: 'openai',
      errorMessage: e instanceof Error ? e.message : 'error',
    });
    res.status(500).json({ error: 'chat failed' });
  }
});

const server = app.listen(process.env.PORT ?? 3000);

process.on('SIGTERM', async () => {
  await client.shutdown();
  server.close();
});

Middleware options

OptionDefaultDescription
serviceName'api'service_name on events

Middleware behavior

  • Path normalization (/users/42/users/:id)
  • traceparent response header
  • Reads x-session-id, x-user-id
  • Tracks on res.finish

Verify

bash
npx amlexia health
curl http://localhost:3000/health

Check Live and Overview on app.amlexia.com.