panic: duplicate metrics collector registration attempted
bug
Hello,
After https://github.com/mholt/caddy-l4/pull/431 (https://github.com/mholt/caddy-l4/commit/afd4a761fad1b97d9203860c5324fc53b78badcb) Caddy panics with
```
panic: duplicate metrics collector registration attempted
```
OS:
``` console
% sw_vers
ProductName: macOS
ProductVersion: 26.5.1
BuildVersion: 25F80
```
Golang:
``` console
% go version
go version go1.26.4 darwin/arm64
```
Most recent succeeding commit is https://github.com/mholt/caddy-l4/commit/7b7abcbbb8afb7d7eeb359bfc0f6b24e6c5bbe02 (the one preceding https://github.com/mholt/caddy-l4/commit/afd4a761fad1b97d9203860c5324fc53b78badcb):
``` console
% xcaddy build 13a4c3f43c79ca04064457ab9cf95b376c294141 \
> --with=github.com/mholt/caddy-l4@7b7abcbbb8afb7d7eeb359bfc0f6b24e6c5bbe02
```
Failing commit https://github.com/mholt/caddy-l4/commit/afd4a761fad1b97d9203860c5324fc53b78badcb:
``` console
% xcaddy build 13a4c3f43c79ca04064457ab9cf95b376c294141 \
> --with=github.com/mholt/caddy-l4@afd4a761fad1b97d9203860c5324fc53b78badcb
```
Standard error after launching Caddy:
``` text
{"level":"info","ts":1783343714.3722398,"msg":"maxprocs: Leaving GOMAXPROCS=18: CPU quota undefined"}
{"level":"info","ts":1783343714.372309,"msg":"GOMEMLIMIT is updated","GOMEMLIMIT":123695058124,"previous":9223372036854775807}
{"level":"info","ts":1783343714.3723168,"msg":"using config from file","file":"/Users/manselmi/.config/caddy/Caddyfile"}
{"level":"info","ts":1783343714.3723211,"msg":"adapted config to JSON","adapter":"caddyfile"}
{"level":"info","ts":1783343714.3732102,"logger":"admin","msg":"admin endpoint started","address":"localhost:2019","enforce_origin":false,"origins":["//127.0.0.1:2019","//localhost:2019","//[::1]:2019"]}
{"level":"info","ts":1783343714.373295,"logger":"tls.cache.maintenance","msg":"started background certificate maintenance","cache":"0x24e6a8aefe80"}
{"level":"info","ts":1783343714.37465,"logger":"http.auto_https","msg":"automatic HTTPS is completely disabled for server","server_name":"https"}
panic: duplicate metrics collector registration attempted
goroutine 1 [running]:
github.com/prometheus/client_golang/prometheus.(*Registry).MustRegister(0x24e6a8da6b90, {0x24e6a9135a00?, 0x1, 0xc?})
github.com/prometheus/client_golang@v1.23.2/prometheus/registry.go:406 +0x78
github.com/prometheus/client_golang/prometheus/promauto.Factory.NewCounterVec({{0x1059dbae0?, 0x24e6a8da6b90?}}, {{0x104102555, 0x5}, {0x10411477d, 0xc}, {0x104121050, 0x11}, {0x104186f5c, 0x39}, ...}, ...)
github.com/prometheus/client_golang@v1.23.2/prometheus/promauto/auto.go:276 +0x168
github.com/mholt/caddy-l4/modules/l4proxy.newProxyMetrics(0x24e6a8da6b90)
github.com/mholt/caddy-l4@v0.1.2-0.20260703160116-bf180f4a228c/modules/l4proxy/metrics.go:35 +0xa4
github.com/mholt/caddy-l4/modules/l4proxy.(*Handler).Provision(0x24e6a92bc180, {{0x1059e0558, 0x24e6a8da6be0}, 0x24e6a8c0c480, 0x24e6a8aef580, {0x24e6a8e8b8c0, 0x2, 0x2}, {0x0, 0x0, ...}, ...})
github.com/mholt/caddy-l4@v0.1.2-0.20260703160116-bf180f4a228c/modules/l4proxy/proxy.go:83 +0x100
github.com/caddyserver/caddy/v2.Context.LoadModuleByID({{0x1059e0558, 0x24e6a8da6be0}, 0x24e6a8c0c480, 0x24e6a8aef580, {0x24e6a8e8b8c0, 0x2, 0x2}, {0x0, 0x0, 0x0}, ...}, ...)
github.com/caddyserver/caddy/v2@v2.11.5-0.20260622162543-13a4c3f43c79/context.go:426 +0x7c8
github.com/caddyserver/caddy/v2.Context.loadModuleInline({{0x1059e0558, 0x24e6a8da6be0}, 0x24e6a8c0c480, 0x24e6a8aef580, {0x24e6a9135520, 0x1, 0x1}, {0x0, 0x0, 0x0}, ...}, ...)
github.com/caddyserver/caddy/v2@v2.11.5-0.20260622162543-13a4c3f43c79/context.go:484 +0xfc
github.com/caddyserver/caddy/v2.Context.LoadModule({{0x1059e0558, 0x24e6a8da6be0}, 0x24e6a8c0c480, 0x24e6a8aef580, {0x24e6a9135520, 0x1, 0x1}, {0x0, 0x0, 0x0}, ...}, ...)
github.com/caddyserver/caddy/v2@v2.11.5-0.20260622162543-13a4c3f43c79/context.go:231 +0x6d4
github.com/mholt/caddy-l4/layer4.(*Route).Provision(0x24e6a8ab8840, {{0x1059e0558, 0x24e6a8da6be0}, 0x24e6a8c0c480, 0x24e6a8aef580, {0x24e6a9135520, 0x1, 0x1}, {0x0, 0x0, ...}, ...})
github.com/mholt/caddy-l4@v0.1.2-0.20260703160116-bf180f4a228c/layer4/routes.go:65 +0x150
github.com/mholt/caddy-l4/layer4.RouteList.Provision({0x24e6a90f4220, 0x1, 0x0?}, {{0x1059e0558, 0x24e6a8da6be0}, 0x24e6a8c0c480, 0x24e6a8aef580, {0x24e6a9135520, 0x1, 0x1}, ...})
github.com/mholt/caddy-l4@v0.1.2-0.20260703160116-bf180f4a228c/layer4/routes.go:90 +0x6c
github.com/mholt/caddy-l4/layer4.(*Server).Provision(0x24e6a8c68a80, {{0x1059e0558, 0x24e6a8da6be0}, 0x24e6a8c0c480, 0x24e6a8aef580, {0x24e6a9135520, 0x1, 0x1}, {0x0, 0x0, ...}, ...}, ...)
github.com/mholt/caddy-l4@v0.1.2-0.20260703160116-bf180f4a228c/layer4/server.go:81 +0x40c
github.com/mholt/caddy-l4/layer4.(*App).Provision(0x24e6a91000b0, {{0x1059e0558, 0x24e6a8da6be0}, 0x24e6a8c0c480, 0x24e6a8aef580, {0x24e6a9135520, 0x1, 0x1}, {0x0, 0x0, ...}, ...})
github.com/mholt/caddy-l4@v0.1.2-0.20260703160116-bf180f4a228c/layer4/app.go:56 +0x15c
github.com/caddyserver/caddy/v2.Context.LoadModuleByID({{0x1059e0558, 0x24e6a8da6be0}, 0x24e6a8c0c480, 0x24e6a8aef580, {0x24e6a9135520, 0x1, 0x1}, {0x0, 0x0, 0x0}, ...}, ...)
github.com/caddyserver/caddy/v2@v2.11.5-0.20260622162543-13a4c3f43c79/context.go:426 +0x7c8
github.com/caddyserver/caddy/v2.Context.App({{0x1059e0558, 0x24e6a8da6be0}, 0x24e6a8c0c480, 0x24e6a8aef580, {0x0, 0x0, 0x0}, {0x0, 0x0, 0x0}, ...}, ...)
github.com/caddyserver/caddy/v2@v2.11.5-0.20260622162543-13a4c3f43c79/context.go:514 +0x1e0
github.com/caddyserver/caddy/v2.provisionContext.func3(...)
github.com/caddyserver/caddy/v2@v2.11.5-0.20260622162543-13a4c3f43c79/caddy.go:575
github.com/caddyserver/caddy/v2.provisionContext(0xa?, 0x1)
github.com/caddyserver/caddy/v2@v2.11.5-0.20260622162543-13a4c3f43c79/caddy.go:580 +0x590
github.com/caddyserver/caddy/v2.run(0x24e6a92f3300?, 0x1)
github.com/caddyserver/caddy/v2@v2.11.5-0.20260622162543-13a4c3f43c79/caddy.go:420 +0x54
github.com/caddyserver/caddy/v2.unsyncedDecodeAndRun({0x24e6a92f1980, 0x18ce, 0x1980}, 0x1)
github.com/caddyserver/caddy/v2@v2.11.5-0.20260622162543-13a4c3f43c79/caddy.go:363 +0x114
github.com/caddyserver/caddy/v2.changeConfig({0x104100fb5, 0x4}, {0x104106e8d, 0x7}, {0x24e6a92f0000, 0x18ce, 0x1980}, {0x0, 0x0}, 0x1)
github.com/caddyserver/caddy/v2@v2.11.5-0.20260622162543-13a4c3f43c79/caddy.go:247 +0x7b4
github.com/caddyserver/caddy/v2.Load({0x24e6a92f0000?, 0x27?, 0x10410cedf?}, 0x9?)
github.com/caddyserver/caddy/v2@v2.11.5-0.20260622162543-13a4c3f43c79/caddy.go:136 +0x84
github.com/caddyserver/caddy/v2/cmd.cmdRun({0x0?})
github.com/caddyserver/caddy/v2@v2.11.5-0.20260622162543-13a4c3f43c79/cmd/commandfuncs.go:283 +0x61c
github.com/caddyserver/caddy/v2/cmd.init.1.func2.WrapCommandFuncForCobra.1(0x24e6a8d54308, {0x104101021?, 0x4?, 0x104100fed?})
github.com/caddyserver/caddy/v2@v2.11.5-0.20260622162543-13a4c3f43c79/cmd/cobra.go:151 +0x34
github.com/spf13/cobra.(*Command).execute(0x24e6a8d54308, {0x24e6a8e80500, 0x2, 0x2})
github.com/spf13/cobra@v1.10.2/command.go:1015 +0x814
github.com/spf13/cobra.(*Command).ExecuteC(0x24e6a8bc7b08)
github.com/spf13/cobra@v1.10.2/command.go:1148 +0x350
github.com/spf13/cobra.(*Command).Execute(...)
github.com/spf13/cobra@v1.10.2/command.go:1071
github.com/caddyserver/caddy/v2/cmd.Main()
github.com/caddyserver/caddy/v2@v2.11.5-0.20260622162543-13a4c3f43c79/cmd/main.go:72 +0x6c
main.main()
caddy/main.go:13 +0x1c
```
Caddyfile:
``` Caddyfile
{
log {
level INFO
}
grace_period 1s
layer4 {
tcp/:443 {
@biomappings tls sni biomappings-curation-app.localhost
route @biomappings {
proxy {
proxy_protocol v2
upstream tcp/localhost:8443
}
}
@tls tls
route @tls {
proxy {
proxy_protocol v2
upstream tcp/localhost:2443
}
}
}
udp/:443 {
# Caddy's implementation of PROXY protocol doesn't work with UDP, as the listener_wrappers
# directive supports only TCP connections. This is problematic for backends that, for example,
# obtain the client IP address from the X-Forwarded-For header.
#
# https://github.com/caddyserver/caddy/issues/6827
#
@quic quic
route @quic {
proxy udp/localhost:2443
}
}
}
http_port 2080
https_port 2443
auto_https off
skip_install_trust
servers :2443 {
name https
listener_wrappers {
proxy_protocol {
allow 127.0.0.1/32 ::1/128
fallback_policy reject
}
tls
}
strict_sni_host on
}
}
(response_headers) {
header >Alt-Svc "h3=\":443\"; ma=2592000; persist=1, h2=\":443\"; ma=2592000; persist=1"
}
(reverse_proxy_config) {
flush_interval -1
stream_timeout 1m
stream_close_delay 1m
transport http {
compression off
}
}
(tls) {
tls {env.TLS_CRT_PEM} {env.TLS_KEY_PEM}
}
jupyterlab.{$DOMAIN_LOCALHOST} {
import tls
handle_errors {
import response_headers
}
import response_headers
reverse_proxy http://[::1]:8889 {
import reverse_proxy_config
}
}
mermaid.{$DOMAIN_LOCALHOST} {
import tls
handle_errors {
import response_headers
}
import response_headers
reverse_proxy http://[::1]:5081 {
import reverse_proxy_config
}
}
seaweedfs-admin.{$DOMAIN_LOCALHOST} {
import tls
handle_errors {
import response_headers
}
import response_headers
reverse_proxy http://[::1]:23646 {
import reverse_proxy_config
}
}
seaweedfs-iceberg.{$DOMAIN_LOCALHOST} {
import tls
handle_errors {
import response_headers
}
import response_headers
reverse_proxy http://[::1]:8181 {
import reverse_proxy_config
}
}
seaweedfs-s3.{$DOMAIN_LOCALHOST} {
import tls
handle_errors {
import response_headers
}
import response_headers
reverse_proxy http://[::1]:8333 {
import reverse_proxy_config
}
}
syncthing.{$DOMAIN_LOCALHOST} {
import tls
handle_errors {
import response_headers
}
import response_headers
reverse_proxy http://[::1]:8384 {
import reverse_proxy_config
}
}
```
1 条评论