/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 iserror.
How Rootprint names an operation
An operation name comes from the first of these that the span carries:http.route— the templated route (/users/:id)url.pathhttp.targeturl.full- the span name
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 fromserver.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 fromhttp.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.
