logger: make AddSystemTarget idempotent

Subscribe re-registered the console target on every console-log subscription, producing duplicate minio_logger_webhook_* series on each /minio/metrics/v3 scrape. Fixes #150

Signed-off-by: nikitapogromsky <129324283+nikitapogromsky@users.noreply.github.com>
This commit is contained in:
nikitapogromsky
2026-09-07 12:03:39 +03:00
parent f1687f402b
commit 5cb900bfad
2 changed files with 138 additions and 3 deletions
+33 -3
View File
@@ -59,11 +59,35 @@ func (tl *targetsList) get() []Target {
return tl.list
}
func (tl *targetsList) add(t Target) {
// contains reports whether t is already registered.
func (tl *targetsList) contains(t Target) bool {
tl.mu.RLock()
defer tl.mu.RUnlock()
return tl.indexOf(t) >= 0
}
// addIfAbsent appends t unless it is already registered.
// Returns true if t was added.
func (tl *targetsList) addIfAbsent(t Target) bool {
tl.mu.Lock()
defer tl.mu.Unlock()
if tl.indexOf(t) >= 0 {
return false
}
tl.list = append(tl.list, t)
return true
}
// indexOf must be called with tl.mu held.
func (tl *targetsList) indexOf(t Target) int {
for i, existing := range tl.list {
if existing == t {
return i
}
}
return -1
}
func (tl *targetsList) set(tgts []Target) {
@@ -125,8 +149,14 @@ func CurrentStats() map[string]types.TargetStats {
}
// AddSystemTarget adds a new logger target to the
// list of enabled loggers
// list of enabled loggers. Adding a target that is already
// registered is a no-op, so callers may safely re-register
// long-lived targets such as the console logger.
func AddSystemTarget(ctx context.Context, t Target) error {
if systemTargets.contains(t) {
return nil
}
if err := t.Init(ctx); err != nil {
return err
}
@@ -137,7 +167,7 @@ func AddSystemTarget(ctx context.Context, t Target) error {
}
}
systemTargets.add(t)
systemTargets.addIfAbsent(t)
return nil
}