{"record":{"id":"7c31690d91ee6b82","repo":"caddyserver/caddy","slug":"no-metrics-registry-found","errorCode":null,"errorMessage":"no metrics registry found","messagePattern":"no metrics registry found","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"modules/metrics/adminmetrics.go","lineNumber":53,"sourceCode":"type AdminMetrics struct {\n\tregistry *prometheus.Registry\n\n\tmetricsHandler http.Handler\n}\n\n// CaddyModule returns the Caddy module information.\nfunc (AdminMetrics) CaddyModule() caddy.ModuleInfo {\n\treturn caddy.ModuleInfo{\n\t\tID:  \"admin.api.metrics\",\n\t\tNew: func() caddy.Module { return new(AdminMetrics) },\n\t}\n}\n\n// Provision -\nfunc (m *AdminMetrics) Provision(ctx caddy.Context) error {\n\tm.registry = ctx.GetMetricsRegistry()\n\tif m.registry == nil {\n\t\treturn errors.New(\"no metrics registry found\")\n\t}\n\tm.metricsHandler = createMetricsHandler(nil, false, m.registry)\n\treturn nil\n}\n\n// Routes returns a route for the /metrics endpoint.\nfunc (m *AdminMetrics) Routes() []caddy.AdminRoute {\n\treturn []caddy.AdminRoute{{Pattern: \"/metrics\", Handler: caddy.AdminHandlerFunc(m.serveHTTP)}}\n}\n\nfunc (m *AdminMetrics) serveHTTP(w http.ResponseWriter, r *http.Request) error {\n\tm.metricsHandler.ServeHTTP(w, r)\n\treturn nil\n}\n\n// Interface guards\nvar (\n\t_ caddy.Provisioner = (*AdminMetrics)(nil)","sourceCodeStart":35,"sourceCodeEnd":71,"githubUrl":"https://github.com/caddyserver/caddy/blob/50e54ee279aa1e504fe218ca49ab6ae16c100410/modules/metrics/adminmetrics.go#L35-L71","documentation":"AdminMetrics.Provision fails when ctx.GetMetricsRegistry() returns nil while provisioning the 'admin.api.metrics' module, which serves Prometheus metrics on the admin endpoint. The registry is created by the metrics module (metrics.Metrics Provision) registering its registry into the context; if that has not happened, the admin metrics module cannot build its handler and refuses to start.","triggerScenarios":"Loading a config that includes the admin.api.metrics module (or enabling the /metrics admin endpoint) without the 'http.handlers.metrics' server-timing/metrics module having initialized the registry first; custom builds where the metrics module is not compiled in; module provisioning order edge cases.","commonSituations":"Manually adding admin.api.metrics to JSON config without the corresponding server metrics handler; using a stripped-down custom Caddy binary that omits the standard metrics module; config ordering issues in embedded caddy.Server runs.","solutions":["Add the metrics handler to your server's route handling (global_metrics handler or 'metrics' directive in each site) so the registry is initialized","If running a custom build, ensure the standard imports (caddy/modules/standard) include modules/metrics","Run caddy validate on the config to confirm module wiring before starting","If you only need app-level metrics via admin endpoint, prefer enabling server_metrics via the documented 'servers > metrics' config rather than hand-inserting admin.api.metrics"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always pair the admin metrics endpoint with the metrics handler in server config","Use caddy validate before deploying configs that touch admin.api modules","Keep custom builds including modules/metrics via standard imports"],"tags":["metrics","admin-api","configuration","provisioning"],"backgroundTag":null,"analyzedSha":"50e54ee279aa1e504fe218ca49ab6ae16c100410","analyzedAt":"2026-08-15T09:20:21.641Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}