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

  1. Inspect the wrapped cause (%w) for the concrete HTTP/transport error from Elasticsearch.
  2. Verify ES connectivity and credentials (curl the cluster's /_cluster/health).
  3. Confirm the target indices exist for the queried time range (ILM retention may have deleted them).
  4. 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

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


AI-assisted analysis of jaegertracing/jaeger@806f444784 (2026-09-01). Data as JSON: /api/errors/381a3d124e34aead. Report an issue: GitHub.