Monitoring for any stack, built on OpenTelemetry
Know what broke, where, and since which deploy.
Traces, logs, errors, metrics, uptime checks and status pages, fed by whatever you already run. AdonisJS apps get a first-party agent that instruments routes, queries, jobs and mail on install.
- AdonisJS
- Express
- Fastify
- Hono
- NestJS
- Next.js
- Python
- Go
- Ruby
- PHP
- Java
- .NET
One bad deploy, minute by minute.
How an outage reads in Unhandled, from the first slow request to the status update. Each screen below is the real product running on sample data.
A checkout request crawls
Every request arrives as a trace: the route, each query, the outbound calls and the mail it sent, on one timeline. The slow part is the wide bar.
Stripe throws
The exception joins an issue with its stack, the trace that raised it, the users it reached and the release it first showed up in. Assign it, discuss it, link it to GitHub or Linear.
The health check fails
Uptime monitors call your public endpoints every minute from outside your network and open an incident when failures repeat.
Customers can see it too
Your public status page reads from the same monitors, so it changes when the service does. Post updates as you work, on a domain of your own if you want one.
Someone gets told
Threshold alerts on p95 latency, error rate and throughput post to Slack, Discord or a webhook, and land in each member’s inbox.
You ask from your editor
The built-in MCP server lets Claude, Cursor or any MCP client read issues, traces and deployments and post status updates for you.
- you
- Which release started the Stripe errors on billing-api?
- tools
- get_issue · list_occurrences · list_deployments
- you
- Tell the status page we rolled back and are watching.
- tools
- update_status_incident
Your stack, your exporter.
AdonisJS installs the full agent with one command. Node.js frameworks load an SDK, and every other language keeps its standard OpenTelemetry SDK.
The snippets use a sample DSN. Each service page fills in its own.
Unhandled SDKs
OpenTelemetry SDKs
Coding agents
Already on Sentry
Keep the official package and point its OTLP exporter at Unhandled. The Unhandled agent adds Lucid query, mail, queue and Ace command spans, exception source lines and job sampling. Guide
- 1
Set up @adonisjs/otel if it is not there yet
bashnode ace add @adonisjs/otelWrites config/otel.ts and otel.ts, imports otel.js first in bin/server.ts, and registers the provider and middleware. If bin/server.ts imports @adonisjs/core statically, load it with await import() after otel.js, or requests are not traced.
- 2
Point the exporter at Unhandled
.envOTEL_SERVICE_NAME=orders-api OTEL_EXPORTER_OTLP_ENDPOINT=https://ingest.example.com OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf OTEL_EXPORTER_OTLP_HEADERS=x-api-key=uh_live_7Hq2xR9vLp3sKd8mWn4tYb6c,x-unhandled-service-id=0b6f3c1e-8d2a-4f7b-9c5e-2a1d4e6f8b3c,x-unhandled-env=production APP_ENV=productionThe generated config passes APP_NAME as the service name, which wins over OTEL_SERVICE_NAME. Unhandled files the data under this service either way.
- 3
Start the app and send a request
bashnode ace build node build/bin/server.jsThe build does not copy .env, so set the variables where the server runs.
The short version.
- Ingest
- OTLP over HTTP. Any OpenTelemetry SDK or Collector can export to it with three headers taken from your DSN.
- Runtimes
- SDKs for Express, Fastify, Hono, NestJS and Next.js. Python, Go, Ruby, PHP, Java and .NET use their standard OpenTelemetry SDK.
- AdonisJS
- A first-party agent for versions 6 and 7. One command writes the config and wires routes, Lucid, mail, queue jobs and Ace commands.
- Signals
- Traces, logs, exceptions grouped into issues, metrics, deployments, uptime checks and public status pages.
- Notifications
- Slack, Discord, signed webhooks, email and an in-app inbox for every member.
- Retention
- 30 days on Starter, 90 days on Business.
- Leaving
- Your instrumentation is plain OpenTelemetry. Point the exporter somewhere else and nothing in your code changes.
Priced by the data you send
Every feature on every plan. 14-day trial.
- Starter€25/ month50 GB included · 30 days kept · €0.35 per extra GB
- Business€79/ month200 GB included · 90 days kept · €0.30 per extra GB
Point your exporter here before the next deploy.
One DSN, and the next request your app serves shows up as a trace.