Lambda tracing
AWS Lambda tracing with payloads
Ivy traces every invocation of the AWS Lambda functions you choose, with the event that triggered it, the response it returned, its logs and errors, and every AWS SDK and HTTP call it made, including the request and response bodies. A DynamoDB query looks like a DynamoDB query, not like an anonymous HTTPS POST.
What one trace contains
Each Lambda invocation becomes one trace: an invocation span with a child span for each outgoing call.
- The invocation: function name, AWS request ID, trigger (API Gateway, SQS, S3, EventBridge, a schedule, …), HTTP method, path and status code for HTTP triggers, cold start with the init duration, memory used, billed duration, and status.
- Payloads: the event and the handler's response, as JSON, capped at 16 KB each by default.
- Logs: every
console.*call during the invocation, with its level, on the timeline. - Errors: the exception type, message and stack trace (with the layer's own frames removed).
- Outgoing calls: every AWS SDK v3 call,
fetchandnode:httprequest, with its duration, status and bodies.
AWS-aware spans
Ivy's layer names and labels AWS calls the way you think about them:
| Service | What the span shows |
|---|---|
| DynamoDB | DynamoDB.GetItem on checkout-carts, the key, the item returned |
| S3 | bucket and key |
| SQS and SNS | queue or topic name, message ID, the message body |
| EventBridge | bus and detail types |
| Lambda | the invoked function and region |
| Other AWS services | <Service>.<Operation> with request and response |
| HTTP | POST api.stripe.com, the URL (query string redacted), status, headers and bodies |
The dashboard draws each trace as a service graph (your function and every service it called) next to a waterfall timeline. Click a node or a row to see its payloads. The home page has an interactive copy of the real trace page.
This also works when your bundler inlines the AWS SDK: Ivy recognizes signed AWS requests and still shows them as AWS calls.
Find the invocation you need
- Invocations: filter by function, status and time range; search by request ID, HTTP path or error message.
- Functions: invocations, errors, cold starts, throttles and duration percentiles per function.
- Errors: error groups by fingerprint (function, error type and normalized message), with counts and first and last seen.
- Workspaces and projects: keep
checkout-prodandcheckout-stagingapart, invite your team, and switch with ⌘K.
Safe by default
- Keys like
authorization,cookie,password,secret,tokenandapikeyare replaced with[redacted]at any depth, inside your function, before anything is sent. Add your own keys withIVY_REDACT_KEYS. - Payloads are capped (
IVY_MAX_PAYLOAD_BYTES, 16 KB by default) and marked when truncated. - Spans are exported after your function has responded, by a small Lambda extension written in Rust. If Ivy can't be reached, the extension retries briefly and then drops the spans; it never blocks or crashes the function.
- Need the data to stay in your network? Self-host the same software.
Fast by design
Spans are sent after your function has responded, so warm invocations show no measurable delay, and cold starts take about 20–45 ms longer. The export after the response adds its round trip to billed duration. See the measurements.
For your coding agent too
Every trace is also available as a compact text tree through the MCP server and the HTTP API, so an agent can read the failing request and its payload and fix the bug in the same session:
checkout-createOrder · API Gateway POST /orders → 500 · cold start · 212ms · ERROR
+0.0ms 212ms checkout-createOrder [invocation] API Gateway POST /orders → 500 ERROR
! TypeError: Cannot read properties of undefined (reading 'id')
+4.0ms 11.6ms DynamoDB.GetItem checkout-users (1 item returned) ok
+36.0ms 135ms POST api.stripe.com/v1/payment_intents → 402 ok