docs

Quickstart

Create a service, install the SDK for your stack, set the DSN and see your first trace in Unhandled.

This page takes an app from no telemetry to its first trace. AdonisJS gets a first-party agent that instruments the whole framework, Node.js frameworks get an Unhandled SDK, and every other language uses its standard OpenTelemetry SDK. Pick your stack in the install step and the rest of the page follows it. The Node.js packages need Node.js 24 or later.

Install

  1. Create a service and copy its DSN

    Sign up at /signup. Unhandled creates an organization with you as its admin, a Default project, a General team that holds both, and a 14-day trial of the Starter plan.

    A service is one thing you deploy, such as an API, a worker or a web app. Each service has its own DSN.

    1. Open Settings at the bottom of the sidebar, then Services under Project.
    2. Click New service. Only organization admins see this button.
    3. Enter a Name, such as Shop API, and a Telemetry name, such as shop-api. The telemetry name becomes service.name on everything the service sends and cannot change later. It starts with a letter or digit and may contain letters, digits, ., _ and -, up to 120 characters.
    4. Click Create service. The dialog shows the DSN and a stack picker. Pick your stack and copy each step; the snippets already contain the DSN.

    A DSN looks like this. Core concepts breaks down each part.

    https://[email protected]/0b4f6c2e-8a1d-4c3e-9f7a-1234567890ab
  2. Install and configure

    The snippets use a sample DSN; paste your own. Install for your stack explains what each family of SDKs records and how the DSN maps to OpenTelemetry settings.

    Unhandled SDKs

    OpenTelemetry SDKs

    Coding agents

    Already on Sentry

    The full agent: routes, Lucid queries, mail, queue jobs and Ace commands, configured by one installer. Guide

    1. 1

      Install and configure the agent

      bash
      node ace add @unhandled/agent-adonisjs

      Writes config/unhandled.ts and otel.ts, and registers the provider and middleware.

    2. 2

      Add the environment variables

      .env
      UNHANDLED_DSN=https://[email protected]/0b6f3c1e-8d2a-4f7b-9c5e-2a1d4e6f8b3c
      APP_ENV=production

      APP_ENV decides which environment the data lands in: production, staging or development.

    3. 3

      Start the app and send a request

      bash
      node ace build
      node build/bin/server.js

      The build does not copy .env, so set the variables where the server runs.

    The Unhandled SDKs read the environment from UNHANDLED_ENV, then APP_ENV, then NODE_ENV. The value must be production, staging or development, and so must x-unhandled-env on other SDKs. Set it per host, so production sends production and staging sends staging.

    Each Node.js framework has its own page with the full setup: Node.js, Express, Fastify, Hono, NestJS and Next.js. Python, Go, Ruby, Java, .NET and other languages are on Any OpenTelemetry SDK.

  3. See your data

    Send a few requests to the app, then open Unhandled.

    1. Pick the environment you set with the Env selector in the top bar. Pages open on Production, so data sent as development shows only under DEV.
    2. Open Traces. Each request appears as a trace. Exporters send in batches every few seconds, so allow a moment.
    3. Open Settings, then Services. Your service now shows events and a Last seen time.

    To see an issue, make a route fail. With the AdonisJS agent, throw from a route and request it once:

    start/routes.ts
    import router from '@adonisjs/core/services/router'
    
    router.get('/orders/:id/refund', async () => {
      throw new Error('Refund provider is unavailable')
    })

    The exception handler reports it, and it appears under Exceptions with its stack trace and the source lines of your own files. Each SDK page has a Verify the setup section with the same check for its framework. With other SDKs, an exception shows up when an instrumentation or your code records it on a span, for example with span.recordException(error).

On AdonisJS, Users and exceptions and Custom tracing cover the same topics for the agent. BullMQ jobs need their instrumentation.