docs

Introduction

What Unhandled records from your services in any language, which pages fill in on their own, and where to start reading.

Unhandled stores the traces, logs and metrics your services send over OpenTelemetry. It groups exceptions into issues and builds dashboards for requests, queries, jobs, emails and more from the same data. It works with any language or framework that exports OpenTelemetry. AdonisJS has a first-party agent that instruments the whole framework on install, Node.js frameworks have Unhandled SDKs, and every other runtime uses its standard OpenTelemetry SDK.

The project overview, the first page you see once data arrives.

What fills in on its own

A service that sends data with a valid DSN populates these pages. You create no dashboards and write no queries for them.

Emails show mail sends from spans that carry email.system. Commands show CLI commands and scheduled tasks, and how long they ran. The AdonisJS agent creates both kinds of span for @adonisjs/mail and Ace. Other stacks fill both pages by following the semantic conventions.

What needs an instrumentation

These pages stay empty until matching spans arrive. Each one has a package or a convention to follow.

Beyond telemetry

Built on OpenTelemetry

Unhandled receives standard OTLP over HTTP, as protobuf or JSON, on /v1/traces, /v1/logs and /v1/metrics. Nothing you instrument depends on an Unhandled API.

  • @unhandled/node builds the OpenTelemetry Node SDK. The framework packages and the AdonisJS agent build on @unhandled/node.
  • Other languages use their OpenTelemetry SDK directly.
  • The destinations option of @unhandled/node sends the same data to other OTLP endpoints at the same time. See Extra destinations.
  • Any SDK or Collector with an OTLP/HTTP exporter works. Point it at the origin of your DSN and send the x-api-key, x-unhandled-service-id and x-unhandled-env headers. Any OpenTelemetry SDK has the full contract.