jaegertracing/jaeger · error

failed getting call metrics: %w

Error message

failed getting call metrics: %w

What it means

GetErrorRates delegates to GetCallRates to distinguish 'no error-rate data' from 'no call-rate data at all'. When the call-rate range query fails, the error is wrapped with this prefix. Like [380], this indicates a failed Prometheus QueryRange call, not empty data.

Source

Thrown at internal/storage/metricstore/prometheus/metricstore/reader.go:232

				m.callsMetricName, p.serviceFilter, p.spanKindFilter, p.rate, p.groupBy,
				m.callsMetricName, p.serviceFilter, p.spanKindFilter, p.rate, p.groupBy,
			)
		},
	}
	errorMetrics, err := m.executeQuery(ctx, metricsParams)
	if err != nil {
		return nil, fmt.Errorf("failed getting error metrics: %w", err)
	}
	// Non-zero error rates are available.
	if len(errorMetrics.Metrics) > 0 {
		return errorMetrics, nil
	}

	// Check for the presence of call rate metrics to differentiate the absence of error rate from
	// the absence of call rate metrics altogether.
	callMetrics, err := m.GetCallRates(ctx, &metricstore.CallRateQueryParameters{BaseQueryParameters: requestParams.BaseQueryParameters})
	if err != nil {
		return nil, fmt.Errorf("failed getting call metrics: %w", err)
	}
	// No call rate metrics are available, and by association, means no error rate metrics are available.
	if len(callMetrics.Metrics) == 0 {
		return errorMetrics, nil
	}

	// Non-zero call rate metrics are available, which implies that there are just no errors, so we report a zero error rate.
	zeroErrorMetrics := make([]*metrics.Metric, 0, len(callMetrics.Metrics))
	for _, cm := range callMetrics.Metrics {
		zm := *cm
		for i := 0; i < len(zm.MetricPoints); i++ {
			zm.MetricPoints[i].Value = &metrics.MetricPoint_GaugeValue{GaugeValue: &metrics.GaugeValue{Value: &metrics.GaugeValue_DoubleValue{DoubleValue: 0.0}}}
		}
		zeroErrorMetrics = append(zeroErrorMetrics, &zm)
	}

	errorMetrics.Metrics = zeroErrorMetrics
	return errorMetrics, nil

View on GitHub (pinned to 806f444784)

Solutions

  1. Fix the underlying Prometheus connectivity/query problem identified by the wrapped inner error.
  2. Verify the configured Prometheus server URL and that call-rate metrics (jaeger_spans_calls_total family) exist in Prometheus.
  3. Check Prometheus /api/v1/status/flags and server logs for rejected queries.
  4. Confirm query range parameters (EndTime, Step) are valid and within Prometheus retention.
Defensive patterns

Strategy: try-catch

Validate before calling

if err := promClient.Query(ctx, promclient.NewClientV1(api.Config{}), `jaeger_spans_calls_total`); err != nil {
    return fmt.Errorf("call-rate metrics unavailable: %w", err)
}

Try / catch

callMetrics, err := m.GetCallRates(ctx, &metricstore.CallRateQueryParameters{...})
if err != nil {
    return nil, fmt.Errorf("failed getting call metrics: %w", err)
}

Prevention

When it happens

Trigger: Calling GetErrorRates where the nested GetCallRates -> executeQuery -> client.QueryRange call fails (connection error, invalid query, Prometheus API error, cancelled context).

Common situations: Same as error-rate failures: bad Prometheus URL, Prometheus outage, network partition, or call-rate query rejected by the server.

Related errors


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