{"record":{"id":"c9f0aca1beff99ac","repo":"jaegertracing/jaeger","slug":"cannot-find-metrics-storage-factory-w","errorCode":null,"errorMessage":"cannot find metrics storage factory: %w","messagePattern":"cannot find metrics storage factory: %w","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/jaeger/internal/extension/jaegerquery/server.go","lineNumber":239,"sourceCode":"\t\treturn nil, nil\n\t}\n\twriter, err := f.CreateTraceWriter()\n\tif err != nil {\n\t\ts.telset.Logger.Error(\"Cannot init traces archive storage writer\", zap.Error(err))\n\t\treturn nil, nil\n\t}\n\treturn reader, writer\n}\n\nfunc (s *server) createMetricReader(host component.Host) (metricstore.Reader, error) {\n\tif s.config.Storage.Metrics == \"\" {\n\t\ts.telset.Logger.Info(\"Metric storage not configured\")\n\t\treturn disabled.NewMetricsReader()\n\t}\n\n\tmsf, err := jaegerstorage.GetMetricStorageFactory(s.config.Storage.Metrics, host)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"cannot find metrics storage factory: %w\", err)\n\t}\n\n\tmetricsReader, err := msf.CreateMetricsReader()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"cannot create metrics reader %w\", err)\n\t}\n\n\treturn metricsReader, nil\n}\n\nfunc (s *server) Shutdown(_ context.Context) error {\n\tif s.aiHealth != nil {\n\t\ts.aiHealth.Stop()\n\t}\n\tif s.server != nil {\n\t\treturn s.server.Close()\n\t}\n\treturn nil","sourceCodeStart":221,"sourceCodeEnd":257,"githubUrl":"https://github.com/jaegertracing/jaeger/blob/806f4447841ecdb60519f408b004a599d515f437/cmd/jaeger/internal/extension/jaegerquery/server.go#L221-L257","documentation":"createMetricReader runs only when metrics storage is configured; it fetches the metric storage factory via jaegerstorage.GetMetricStorageFactory using the Storage.Metrics name. If no such factory is registered in the host, the error 'cannot find metrics storage factory' is returned and Start aborts.","triggerScenarios":"config.Storage.Metrics is set but no jaeger_storage backend providing a metric storage factory (GetMetricStorageFactory) exists under that name.","commonSituations":"Enabling metrics query (SPM) but forgetting to configure a metrics backend (e.g. Prometheus/ClickHouse) in jaeger_storage; name mismatch between storage.metrics and the backend key; using a backend that only implements trace storage, not metric storage.","solutions":["Configure a jaeger_storage backend that implements metric storage (e.g. prometheus) with the exact name referenced by storage.metrics","Fix the storage.metrics name in the query extension config","If metrics query is not needed, clear storage.metrics so the disabled metrics reader is used","Verify the backend implements CreateMetricsReader for your jaeger version"],"exampleFix":"// before\njaeger_query:\n  storage:\n    metrics: prom  # undefined backend\n// after\njaeger_storage:\n  backends:\n    prom: {prometheus: {endpoint: \"http://prom:9090\"}}\njaeger_query:\n  storage:\n    metrics: prom","handlingStrategy":"validation","validationCode":"// Only enable metrics if a metric-capable backend is defined\nif cfg.Storage.Metrics != \"\" {\n\tif _, ok := storageBackends[cfg.Storage.Metrics]; !ok {\n\t\treturn fmt.Errorf(\"metrics backend %q not defined\", cfg.Storage.Metrics)\n\t}\n}","typeGuard":null,"tryCatchPattern":"if err := ext.Start(ctx, host); err != nil {\n\tif strings.Contains(err.Error(), \"cannot find metrics storage factory\") {\n\t\tlog.Fatalf(\"metrics backend %q missing — define a prometheus/clickhouse backend or unset storage.metrics\", metricsName)\n\t}\n\treturn err\n}","preventionTips":["Define a metric-capable backend (e.g. prometheus) whenever storage.metrics is set","Unset storage.metrics to run with the disabled metrics reader","Keep backend names copy-paste identical between jaeger_storage and jaeger_query","Verify the chosen backend implements CreateMetricsReader before enabling SPM"],"tags":["go","config","storage","metrics"],"backgroundTag":"storage-factory-not-found","analyzedSha":"806f4447841ecdb60519f408b004a599d515f437","analyzedAt":"2026-09-01T02:39:22.140Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}