diff --git a/CHANGELOG.md b/CHANGELOG.md index 536b89e10b6f..01f8efc42043 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -98,6 +98,9 @@ Main (unreleased) - Fixed a bug where UDP syslog messages were never processed (@joshuapare) +- Fix a bug where reloading the configuration of a `loki.write` component lead + to a panic. (@tpaschalis) + ### Enhancements - The `loki.write` WAL now has snappy compression enabled by default. (@thepalbi) diff --git a/component/common/loki/wal/watcher_metrics.go b/component/common/loki/wal/watcher_metrics.go index 697b111c69af..4064f8b22aac 100644 --- a/component/common/loki/wal/watcher_metrics.go +++ b/component/common/loki/wal/watcher_metrics.go @@ -80,13 +80,23 @@ func NewWatcherMetrics(reg prometheus.Registerer) *WatcherMetrics { } if reg != nil { - reg.MustRegister(m.recordsRead) - reg.MustRegister(m.recordDecodeFails) - reg.MustRegister(m.droppedWriteNotifications) - reg.MustRegister(m.segmentRead) - reg.MustRegister(m.currentSegment) - reg.MustRegister(m.watchersRunning) + m.recordsRead = mustRegisterOrGet(reg, m.recordsRead).(*prometheus.CounterVec) + m.recordDecodeFails = mustRegisterOrGet(reg, m.recordDecodeFails).(*prometheus.CounterVec) + m.droppedWriteNotifications = mustRegisterOrGet(reg, m.droppedWriteNotifications).(*prometheus.CounterVec) + m.segmentRead = mustRegisterOrGet(reg, m.segmentRead).(*prometheus.CounterVec) + m.currentSegment = mustRegisterOrGet(reg, m.currentSegment).(*prometheus.GaugeVec) + m.watchersRunning = mustRegisterOrGet(reg, m.watchersRunning).(*prometheus.GaugeVec) } return m } + +func mustRegisterOrGet(reg prometheus.Registerer, c prometheus.Collector) prometheus.Collector { + if err := reg.Register(c); err != nil { + if are, ok := err.(prometheus.AlreadyRegisteredError); ok { + return are.ExistingCollector + } + panic(err) + } + return c +}