{"record":{"id":"32fc747222c6178e","repo":"jaegertracing/jaeger","slug":"failed-to-obtain-purger-w","errorCode":null,"errorMessage":"failed to obtain purger: %w","messagePattern":"failed to obtain purger: %w","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/jaeger/internal/integration/storagecleaner/extension.go","lineNumber":48,"sourceCode":")\n\ntype storageCleaner struct {\n\tconfig *Config\n\tserver *http.Server\n\ttelset component.TelemetrySettings\n}\n\nfunc newStorageCleaner(config *Config, telset component.TelemetrySettings) *storageCleaner {\n\treturn &storageCleaner{\n\t\tconfig: config,\n\t\ttelset: telset,\n\t}\n}\n\nfunc (c *storageCleaner) Start(_ context.Context, host component.Host) error {\n\tpurger, err := jaegerstorage.GetPurger(c.config.TraceStorage, host)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to obtain purger: %w\", err)\n\t}\n\n\tpurgeHandler := func(w http.ResponseWriter, r *http.Request) {\n\t\tif err := purger.Purge(r.Context()); err != nil {\n\t\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\n\t\t\treturn\n\t\t}\n\t\tw.WriteHeader(http.StatusOK)\n\t\tw.Write([]byte(\"Purge request processed successfully\"))\n\t}\n\n\tmux := http.NewServeMux()\n\tmux.HandleFunc(\"POST \"+URL, purgeHandler)\n\tc.server = &http.Server{\n\t\tAddr:              \":\" + c.config.Port,\n\t\tHandler:           mux,\n\t\tReadHeaderTimeout: 3 * time.Second,\n\t}","sourceCodeStart":30,"sourceCodeEnd":66,"githubUrl":"https://github.com/jaegertracing/jaeger/blob/806f4447841ecdb60519f408b004a599d515f437/cmd/jaeger/internal/integration/storagecleaner/extension.go#L30-L66","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","solutions":["Verify the trace_storage name in the storagecleaner extension config exactly matches the name of a configured jaegerstorage extension","Check that the referenced storage backend implements storage.Purger (badger/memory support varies); switch to a backend with purge support for integration tests","Inspect the wrapped error (%w) in the log — it states whether the storage extension was not found or the factory lacks purge capability"],"exampleFix":"// before\nextensions:\n  storagecleaner:\n    trace_storage: some_trace_store\n// after\nextensions:\n  jaegerstorage:\n    backends:\n      some_trace_store:\n        badger:\n          directory: /tmp/jaeger\n  storagecleaner:\n    trace_storage: some_trace_store","handlingStrategy":"validation","validationCode":"// before starting the collector, ensure names match\n// config check:\n//   extensions.jaegerstorage.backends contains key == extensions.storagecleaner.trace_storage\n// and that the backend type supports purge (e.g. badger, memory via test backends)","typeGuard":null,"tryCatchPattern":"// component start\nif err := ext.Start(ctx, host); err != nil {\n    var cfgErr *configErr\n    if errors.As(err, &cfgErr) { /* fix trace_storage name */ }\n    return fmt.Errorf(\"storagecleaner start: %w\", err)\n}","preventionTips":["Keep trace_storage names in a shared config variable to avoid mismatch","Only use storagecleaner against backends implementing storage.Purger","Run `jaeger validate` / dry-run the OTel config before deploy"],"tags":["storage","configuration","otel-extension"],"backgroundTag":"storage-backend-not-found","analyzedSha":"806f4447841ecdb60519f408b004a599d515f437","analyzedAt":"2026-09-01T02:39:22.140Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}