thanos-io/thanos · error
Aborted
Aborted
Error message
fetching exemplars from exemplars client %v
What it means
exemplarsStream.receive calls the upstream store's Exemplars RPC and wraps any immediate RPC error with "fetching exemplars from exemplars client %v". Under PartialResponseStrategy_ABORT the wrapped error is returned (surfacing as codes.Aborted); otherwise it is forwarded to the client as a warning response and the stream continues.
Solutions
- Read the wrapped cause and client address in the message; health-check that specific store endpoint.
- Upgrade stores that return Unimplemented for the Exemplars method.
- If failures are tolerable, use a non-ABORT partial-response strategy so it degrades to a warning.
- Remove or repair unreachable stores from the store set.
Defensive patterns
Strategy: fallback
Try / catch
data, warnings, err := api.Exemplars(ctx, req)
if err != nil {
// store unreachable: degrade to empty result + alert instead of failing the page
log.Warnf("exemplars unavailable: %v", err)
return nil, err
} Prevention
- Health-check and periodically verify store endpoints support Exemplars.
- Upgrade pre-exemplar store versions to avoid Unimplemented errors.
- Keep request deadlines above store fan-out latency.
When it happens
Trigger: stream.client.Exemplars(ctx, stream.request) fails at call time — store unreachable, DNS failure, TLS error, storeAPI not supporting the Exemplars method (Unimplemented), or context deadline exceeded during fan-out at pkg/exemplars/proxy.go:177.
Common situations: Dead store gateways in the store set, stores running versions without exemplar support, network partition between query and store, per-RPC timeouts too short.
Related errors
AI-assisted analysis of thanos-io/thanos@35b8b99117 (2026-09-07).
Data as JSON: /api/errors/488ca26d9972efd0.
Report an issue: GitHub.
Appendix: source
Thrown at pkg/exemplars/proxy.go:177
}
}
return nil
}
func containsLabelName(name string, sets []labels.Labels) bool {
for _, ls := range sets {
if ls.Get(name) != "" {
return true
}
}
return false
}
func (stream *exemplarsStream) receive(ctx context.Context) error {
exemplars, err := stream.client.Exemplars(ctx, stream.request)
if err != nil {
err = errors.Wrapf(err, "fetching exemplars from exemplars client %v", stream.client)
if stream.request.PartialResponseStrategy == storepb.PartialResponseStrategy_ABORT {
return err
}
if serr := stream.server.Send(exemplarspb.NewWarningExemplarsResponse(err)); serr != nil {
return serr
}
// Not an error if response strategy is warning.
return nil
}
for {
exemplar, err := exemplars.Recv()
if err == io.EOF {
return nil
}
View on GitHub (pinned to 35b8b99117)