Skip to content

Commit

Permalink
Don't panic on collectors that are already registered.
Browse files Browse the repository at this point in the history
  • Loading branch information
sbruens committed Feb 8, 2025
1 parent 94b68dd commit 215f54a
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 3 deletions.
4 changes: 3 additions & 1 deletion outlinecaddy/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"errors"
"fmt"
"log/slog"
"strings"

outline_prometheus "github.com/Jigsaw-Code/outline-ss-server/prometheus"
outline "github.com/Jigsaw-Code/outline-ss-server/service"
Expand Down Expand Up @@ -127,7 +128,8 @@ func (app *OutlineApp) defineMetrics() error {
func registerCollector[T prometheus.Collector](registerer prometheus.Registerer, coll T) (T, error) {
if err := registerer.Register(coll); err != nil {
are := &prometheus.AlreadyRegisteredError{}
if !errors.As(err, are) {
dupeErr := strings.Contains(err.Error(), "duplicate metrics collector registration attempted")
if !errors.As(err, are) || dupeErr {
// This collector has been registered before. This is expected during a config reload.
coll = are.ExistingCollector.(T)
} else {
Expand Down
12 changes: 10 additions & 2 deletions service/shadowsocks.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,17 +63,25 @@ func NewShadowsocksHandlers(opts ...Option) (StreamHandler, AssociationHandler)
opt(s)
}

var (
tcpShadowsocksConnMetrics ShadowsocksConnMetrics
udpShadowsocksConnMetrics ShadowsocksConnMetrics
)
if s.metrics != nil {
tcpShadowsocksConnMetrics = &ssConnMetrics{s.metrics.AddTCPCipherSearch}
udpShadowsocksConnMetrics = &ssConnMetrics{s.metrics.AddUDPCipherSearch}
}
// TODO: Register initial data metrics at zero.
sh := NewStreamHandler(
NewShadowsocksStreamAuthenticator(s.ciphers, s.replayCache, &ssConnMetrics{s.metrics.AddTCPCipherSearch}, s.logger),
NewShadowsocksStreamAuthenticator(s.ciphers, s.replayCache, tcpShadowsocksConnMetrics, s.logger),
tcpReadTimeout,
)
if s.streamDialer != nil {
sh.SetTargetDialer(s.streamDialer)
}
sh.SetLogger(s.logger)

ah := NewAssociationHandler(s.ciphers, &ssConnMetrics{s.metrics.AddUDPCipherSearch})
ah := NewAssociationHandler(s.ciphers, udpShadowsocksConnMetrics)
if s.packetListener != nil {
ah.SetTargetPacketListener(s.packetListener)
}
Expand Down

0 comments on commit 215f54a

Please sign in to comment.