jaegertracing/jaeger · error

empty configuration

Error message

empty configuration

What it means

errRefAgainstConstant refuses an operand shape where both sides of a comparison read values off the span (reference vs reference) or otherwise cannot be evaluated against a constant. Matching span-to-span would require a per-span script, which this Elasticsearch backend deliberately does not run for cost reasons, so the predicate is rejected with tracestore.ErrFilterUnsupported.

Source

Thrown at cmd/internal/storageconfig/config.go:128

		backends = append(backends, "badger")
	}
	if cfg.GRPC != nil {
		backends = append(backends, "grpc")
	}
	if cfg.Cassandra != nil {
		backends = append(backends, "cassandra")
	}
	if cfg.Elasticsearch != nil {
		backends = append(backends, "elasticsearch")
	}
	if cfg.Opensearch != nil {
		backends = append(backends, "opensearch")
	}
	if cfg.ClickHouse != nil {
		backends = append(backends, "clickhouse")
	}
	if len(backends) == 0 {
		return errors.New("empty configuration")
	}
	if len(backends) > 1 {
		return fmt.Errorf("multiple backend types found for trace storage: %v", backends)
	}
	return nil
}

// Unmarshal implements confmap.Unmarshaler for MetricBackend.
func (cfg *MetricBackend) Unmarshal(conf *confmap.Conf) error {
	// apply defaults
	if conf.IsSet("prometheus") {
		v := prometheus.DefaultConfig()
		cfg.Prometheus = &PrometheusConfiguration{
			Configuration: v,
		}
	}
	if conf.IsSet("elasticsearch") {
		v := es.DefaultConfig()

View on GitHub (pinned to 806f444784)

Solutions

  1. Compare the span field against a literal constant instead of another span field.
  2. Split the query: fetch candidates with one constant comparison and post-filter reference-vs-reference matches in application code.
  3. Consider typed attribute indexing (RFC 0015) or a scripting-capable backend if ref-vs-ref is a hard requirement.

Example fix

// before
tag.http.status_code == tag.expected_status
// after
tag.http.status_code == 200
Defensive patterns

Strategy: fallback

Validate before calling

func refVsRef(c *expression.Call) bool {
    return len(c.Args) == 2 && isReference(c.Args[0]) && isReference(c.Args[1])
} // rewrite to constant comparison before submitting

Try / catch

q, err := buildFilterQuery(...)
if errors.Is(err, tracestore.ErrFilterUnsupported) {
    // split into constant comparison + client-side post-filter
}

Prevention

When it happens

Trigger: Submitting a filter comparing two span fields/attributes to each other (e.g. tag.a == tag.b) or a comparison whose right side is another reference rather than a constant, hitting refAndConstantArgs or refAndListArgs.

Common situations: Trying to find spans where one attribute equals another; porting SQL-style column-to-column comparisons into a Jaeger filter; a generic query translator emitting ref-vs-ref comparisons.

Related errors


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