jaegertracing/jaeger · error

failed to obtain purger: %w

Error message

failed to obtain purger: %w

What it means

The storage-cleaner integration extension calls jaegerstorage.GetPurger(c.config.TraceStorage, host) during Start to look up the storage backend named in its config. GetPurger returns an error when no storage extension with that name exists, or when the resolved storage factory does not implement the Purger capability. This extension wraps that failure with 'failed to obtain purger' so the operator knows the cleaner cannot run at all and Start fails immediately.

Source

Thrown at cmd/jaeger/internal/integration/storagecleaner/extension.go:48

)

type storageCleaner struct {
	config *Config
	server *http.Server
	telset component.TelemetrySettings
}

func newStorageCleaner(config *Config, telset component.TelemetrySettings) *storageCleaner {
	return &storageCleaner{
		config: config,
		telset: telset,
	}
}

func (c *storageCleaner) Start(_ context.Context, host component.Host) error {
	purger, err := jaegerstorage.GetPurger(c.config.TraceStorage, host)
	if err != nil {
		return fmt.Errorf("failed to obtain purger: %w", err)
	}

	purgeHandler := func(w http.ResponseWriter, r *http.Request) {
		if err := purger.Purge(r.Context()); err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
			return
		}
		w.WriteHeader(http.StatusOK)
		w.Write([]byte("Purge request processed successfully"))
	}

	mux := http.NewServeMux()
	mux.HandleFunc("POST "+URL, purgeHandler)
	c.server = &http.Server{
		Addr:              ":" + c.config.Port,
		Handler:           mux,
		ReadHeaderTimeout: 3 * time.Second,
	}

View on GitHub (pinned to 806f444784)

Solutions

  1. Verify the trace_storage name in the storagecleaner extension config exactly matches the name of a configured jaegerstorage extension
  2. Check that the referenced storage backend implements storage.Purger (badger/memory support varies); switch to a backend with purge support for integration tests
  3. Inspect the wrapped error (%w) in the log — it states whether the storage extension was not found or the factory lacks purge capability

Example fix

// before
extensions:
  storagecleaner:
    trace_storage: some_trace_store
// after
extensions:
  jaegerstorage:
    backends:
      some_trace_store:
        badger:
          directory: /tmp/jaeger
  storagecleaner:
    trace_storage: some_trace_store
Defensive patterns

Strategy: validation

Validate before calling

// before starting the collector, ensure names match
// config check:
//   extensions.jaegerstorage.backends contains key == extensions.storagecleaner.trace_storage
// and that the backend type supports purge (e.g. badger, memory via test backends)

Try / catch

// component start
if err := ext.Start(ctx, host); err != nil {
    var cfgErr *configErr
    if errors.As(err, &cfgErr) { /* fix trace_storage name */ }
    return fmt.Errorf("storagecleaner start: %w", err)
}

Prevention

When it happens

Trigger: Start() is called and GetPurger fails: the trace_storage name in the storagecleaner config does not match any registered jaegerstorage extension, or the referenced backend does not implement storage.Purger (e.g. a memory or older backend without purge support).

Common situations: Typo or mismatch between the storagecleaner extension's trace_storage value and the jaegerstorage extension name in the OTel config; running integration tests against a storage backend that lacks purge support; forgetting to configure the jaegerstorage extension entirely.

Related errors


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