APILensAPILens
frameworks/lambda

AWS Lambda

API GW v1/v2

Serverless observability for API Gateway and Function URL handlers.

Wraps your Lambda handler function. Supports API Gateway v1/v2 event formats and Lambda Function URLs. Errors are re-thrown after being recorded.

processMetrics is disabled by default in Lambda (no persistent process). Each invocation is one log entry.

Install

bash
npm install auto-api-observe

Quick Start

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

lambda-quick-start.js
javascript
const { withLambdaObservability } = require('auto-api-observe');

const handler = async (event) => {
  return { statusCode: 200, body: JSON.stringify({ ok: true }) };
};

module.exports.handler = withLambdaObservability(handler, {
  apiKey: process.env.APILENS_KEY,
});

Full Example

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

lambda-full.js
javascript
const { withLambdaObservability, addField } = require('auto-api-observe');
const { DynamoDBClient, GetItemCommand } = require('@aws-sdk/client-dynamodb');

const dynamo = new DynamoDBClient({});

const handler = async (event) => {
  const userId = event.pathParameters?.userId ?? event.queryStringParameters?.userId;
  addField('userId', userId);

  const result = await dynamo.send(new GetItemCommand({
    TableName: 'Users',
    Key: { id: { S: userId } },
  }));

  if (!result.Item) return { statusCode: 404, body: JSON.stringify({ error: 'Not found' }) };
  return { statusCode: 200, body: JSON.stringify(result.Item) };
};

module.exports.handler = withLambdaObservability(handler, {
  apiKey:                 process.env.APILENS_KEY,
  slowThreshold:          200,
  tags:                   { service: 'users-lambda', env: process.env.STAGE },
  captureUnhandledErrors: true,
});

What's Tracked Automatically

  • httpMethod / requestContext.http.method
  • path / rawPath
  • statusCode from handler return
  • Headers including x-forwarded-for
  • Errors re-thrown after being recorded

Options Reference

OptionTypeDefault
apiKeystring
slowThresholdnumber1000
tagsRecord{}
captureUnhandledErrorsbooleanfalse

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 AWS Lambda app?

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

Get your free API key