Skip to main content
The Services page (at /services) turns the spans you already send into request rate, error rate, and latency per service, plus each service’s operations, downstream calls, and failing spans. It stays empty until spans are arriving. See Send traces, and check TRACE_INDEX_ID in Environment variables if spans should be there. It has a catalog of every service and a page per service at /services/<name>.

The summary strip

The summary strip is the same on every tab, and covers the current service and time range: A service can serve every request successfully while its outbound calls fail, so a non-zero Error spans count next to a 0% Error rate is a valid combination.

The catalog

/services shows the summary strip, three charts (p95 latency per service, request rate, error rate) and a table of every service with requests, error rate, p50 and p95. The table sorts by error rate, worst first. Click a service to open its page.

A service’s page

Every service has the same tabs: Each row in Operations and Dependencies links to the trace explorer, filtered to that row. View traces in the toolbar opens the explorer over the same time range, filtered to the service on a service’s page. Open in Traces on the Errors tab carries its filters over. Drag across any chart to narrow the whole page to that window.

What counts as a request

A request is an entry span: a server span (an inbound call), a consumer span (a consumed message), or a root span (a trace the service starts itself, such as a scheduled job). Client, producer, and internal spans with a parent are not requests, so a request crossing three services counts once in each of them. A request is an error when its span status is error.

How Rootprint names an operation

An operation name comes from the first of these that the span carries:
  1. http.route — the templated route (/users/:id)
  2. url.path
  3. http.target
  4. url.full
  5. the span name
A row whose name falls back to a bare HTTP method, such as GET, is marked Route unavailable. A raw path or URL makes one operation per distinct value, so /users/1 and /users/2 become two rows. If the table reads as a long tail of near-duplicates, enable HTTP route recording in the SDK or framework instrumentation that produces those spans.

Downstream calls

The Dependencies tab groups a service’s client and producer spans by span name, ranked by total time, with call count, p50, and p95. Each call lists up to three peers, read from server.address, so an HTTP client span shows which hosts it called.

Failing spans

The Errors tab lists error spans of every kind, newest first: time, service, kind, operation, message, HTTP status, and duration. A row opens its trace in a new tab with that span selected. The message is the span’s status message, or the message of its first exception event. HTTP status is read from http.response.status_code or http.status_code. Three filters narrow the list:
  • Kind — server, client, producer, consumer, or internal.
  • HTTP — 4xx, 5xx, or spans with no HTTP status at all.
  • Top operations — chips for the 20 operations with the most errors in the range. Click one to scope the list to it.

Limits

Next steps

Send traces

Point an OpenTelemetry SDK or Collector at the trace endpoint.

Service health API

GET /api/services and GET /api/services/errors, the endpoints behind the page, for your own dashboards.