jaegertracing/jaeger · error
failed executing metrics query: %w
Error message
failed executing metrics query: %w
What it means
MetricsReader.executeSearch runs the Elasticsearch metrics query (histograms, call rates, error rates) through the query builder. If the underlying Execute call fails — transport error, bad query, index missing, cluster unavailable — the error is wrapped as 'failed executing metrics query' and logged to the tracing span before being returned to GetLatencies/GetCallRates/GetErrorRates callers.
Source
Thrown at internal/storage/metricstore/elasticsearch/reader.go:224
}
percentileKey := fmt.Sprintf("%.1f", percentileValue)
aggMapValue, ok := percentiles.Values[percentileKey]
if !ok {
return math.NaN()
}
return aggMapValue
}
return bucketsToPoints(buckets, valueExtractor)
}
// executeSearch performs the Elasticsearch search.
func (r MetricsReader) executeSearch(ctx context.Context, p MetricsQueryParams, timeRange TimeRange) (*esclient.SearchResponse, error) {
span := r.queryLogger.TraceQuery(ctx, p.metricName)
defer span.End()
searchResult, err := r.queryBuilder.Execute(ctx, p.boolQuery, p.aggQuery, timeRange)
if err != nil {
err = fmt.Errorf("failed executing metrics query: %w", err)
r.queryLogger.LogErrorToSpan(span, err)
return nil, err
}
r.queryLogger.LogAndTraceResult(span, searchResult)
// Return raw search result
return searchResult, nil
}
func calculateTimeRange(params *metricstore.BaseQueryParameters) (TimeRange, error) {
if params == nil || params.EndTime == nil || params.Lookback == nil {
return TimeRange{}, errors.New("invalid parameters")
}
endTime := *params.EndTime
startTime := endTime.Add(-*params.Lookback)
extendedStartTime := startTime.Add(-10 * time.Minute)
View on GitHub (pinned to 806f444784)
Solutions
- Inspect the wrapped cause (%w) for the concrete HTTP/transport error from Elasticsearch.
- Verify ES connectivity and credentials (curl the cluster's /_cluster/health).
- Confirm the target indices exist for the queried time range (ILM retention may have deleted them).
- Retry with backoff if the cause is a transient network/timeout error.
Example fix
// caller handling
metrics, err := reader.GetCallRates(ctx, params)
if err != nil {
log.Printf("metrics query failed: %v", err) // cause is wrapped, inspect it
return
} Defensive patterns
Strategy: retry
Validate before calling
// before querying
if err := esClient.Ping(ctx); err != nil {
return fmt.Errorf("elasticsearch unreachable: %w", err)
} Try / catch
metrics, err := reader.GetCallRates(ctx, params)
if err != nil {
if strings.Contains(err.Error(), "failed executing metrics query") {
// transient: retry with backoff; otherwise surface the wrapped cause
return retryWithBackoff(ctx, func() error { _, err = reader.GetCallRates(ctx, params); return err })
}
return err
} Prevention
- Monitor ES cluster health and configure connection/auth settings before enabling the metrics store.
- Keep ILM retention longer than the maximum metrics query window.
- Log the wrapped cause (%w) — it contains the concrete HTTP status/transport error.
- Add retry with backoff for transient network errors.
When it happens
Trigger: Calling GetLatencies, GetCallRates, or GetErrorRates when the Elasticsearch/OpenSearch cluster is unreachable, the response index doesn't exist, the query DSL is rejected (HTTP 400), or the request times out.
Common situations: Wrong ES server address/credentials in config; jaeger-span indices rolled over or deleted by ILM before the metrics window; metricstore storage type misconfigured; network/DNS failure between Jaeger and ES.
Related errors
- failed executing metrics query: %w
- invalid parameters
- failed to resolve backend version: %w
- failed to delete indices: %w
- failed to create index: %w
AI-assisted analysis of jaegertracing/jaeger@806f444784 (2026-09-01).
Data as JSON: /api/errors/381a3d124e34aead.
Report an issue: GitHub.