Traces, logs & metrics

Follow every request,
span by span.

Every HTTP request, background job, and Ace command becomes a trace, even when it crosses services. Logs and metrics land right next to it, already connected. Nothing to wire by hand.

Distributed tracing

From the browser to the API to the worker

Correlated logs

Every log line knows its trace

Any OTel metric

Runtime, library, and custom

System metrics

CPU, memory, heap, and event loop

Find the request you care about in seconds

One search bar does both search and filtering. Type a field name to pick its values with their counts, or write the filter yourself.

  • Filter on any span or resource attribute: duration>=500ms, http.route^/api, service.name!=worker
  • Chart segments, P95, or average duration over time, grouped by any field
  • Drag across the chart to zoom, preview a trace with the keyboard, open it with Enter

See where it broke, and where the time went

Every span sits on one timeline, nested under its parent. Failed spans are red, and the span where the error started is marked, so you know where to look first.

  • The span panel shows the highlighted SQL query, the exception, HTTP bodies, and AI calls
  • Across services: network time between calls, and queue wait for jobs
  • Clock skew between machines is corrected automatically, and flagged when it is

Logs that know where they came from

Each log keeps the trace and span that were active when it was written. Go from a log line to the full request in one click, and back.

  • AdonisJS logger output is sent automatically and linked to the current trace
  • See the other logs of the same trace, or of the same service around that moment
  • Filter by level, service, or any attribute, and share the view with a link

Metrics, without building panels

Every OpenTelemetry metric your services send is listed and ready to chart: runtime metrics from the agent, metrics from libraries, and your own.

  • Sum, rate, average, and P50 to P99 for histograms
  • Group by any attribute, like host.name or service.instance.id
  • CPU, memory, V8 heap, and event loop per instance, on their own page

Your own spans, when you need them

The AdonisJS agent traces requests, database queries, Redis, outgoing HTTP calls, emails, queue jobs, and Ace commands out of the box. For business logic, wrap it in a span with one helper or a decorator.

  • record() handles sync and async callbacks and records exceptions for you
  • @span() and @spanAll() decorators for services
  • Standard OpenTelemetry under the hood, so any OTel SDK works too
app/services/report_service.ts
import { record } from '@monocle.sh/adonisjs-agent/helpers'

const report = await record('report.generate', async (span) => {
  span.setAttributes({ 'report.type': 'monthly', 'report.userId': userId })

  const data = await fetchReportData(userId)
  return generatePdf(data)
})
Works with

Plugs into your stack

AdonisJS

v6 and v7, zero config

Browser SDK

Frontend traces linked to your API

BullMQ & boringnode/queue

Jobs traced from enqueue to run

Drizzle & Kysely

Every query as a span

BentoCache

Cache hits and misses

Any OpenTelemetry SDK

Node.js or any other language

Early access

See what your apps
are really doing.

Traces, logs, errors and metrics for every app you ship. Bring it all into focus.