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
- Compare the span field against a literal constant instead of another span field.
- Split the query: fetch candidates with one constant comparison and post-filter reference-vs-reference matches in application code.
- 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
- Compare span fields only against literal constants.
- Post-filter field-to-field equality in application code.
- Avoid SQL-style column-to-column translations in query builders.
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
- file must begin with '['
- max spans count reached
- at least one storage backend is required
- cannot assign unique span ID, too many spans in the trace
- only one of basic auth (--es.username/--es.password), --es.t
AI-assisted analysis of jaegertracing/jaeger@806f444784 (2026-09-01).
Data as JSON: /api/errors/8bf228b6fb0a6a66.
Report an issue: GitHub.