Skip to content

Commit 57e7747

Browse files
IndraGunawandunglas
authored andcommitted
fix: duplicate metrics collector registration attempted panic
1 parent f109f04 commit 57e7747

1 file changed

Lines changed: 49 additions & 12 deletions

File tree

metrics.go

Lines changed: 49 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package frankenphp
22

33
import (
4-
"github.com/dunglas/frankenphp/internal/fastabs"
4+
"errors"
55
"regexp"
66
"sync"
77
"time"
88

9+
"github.com/dunglas/frankenphp/internal/fastabs"
10+
911
"github.com/prometheus/client_golang/prometheus"
1012
)
1113

@@ -153,7 +155,10 @@ func (m *PrometheusMetrics) TotalWorkers(name string, _ int) {
153155
Name: "total_workers",
154156
Help: "Total number of PHP workers for this worker",
155157
})
156-
m.registry.MustRegister(m.totalWorkers[identity])
158+
if err := m.registry.Register(m.totalWorkers[identity]); err != nil &&
159+
!errors.As(err, &prometheus.AlreadyRegisteredError{}) {
160+
panic(err)
161+
}
157162
}
158163

159164
if _, ok := m.workerCrashes[identity]; !ok {
@@ -163,7 +168,10 @@ func (m *PrometheusMetrics) TotalWorkers(name string, _ int) {
163168
Name: "worker_crashes",
164169
Help: "Number of PHP worker crashes for this worker",
165170
})
166-
m.registry.MustRegister(m.workerCrashes[identity])
171+
if err := m.registry.Register(m.workerCrashes[identity]); err != nil &&
172+
!errors.As(err, &prometheus.AlreadyRegisteredError{}) {
173+
panic(err)
174+
}
167175
}
168176

169177
if _, ok := m.workerRestarts[identity]; !ok {
@@ -173,7 +181,10 @@ func (m *PrometheusMetrics) TotalWorkers(name string, _ int) {
173181
Name: "worker_restarts",
174182
Help: "Number of PHP worker restarts for this worker",
175183
})
176-
m.registry.MustRegister(m.workerRestarts[identity])
184+
if err := m.registry.Register(m.workerRestarts[identity]); err != nil &&
185+
!errors.As(err, &prometheus.AlreadyRegisteredError{}) {
186+
panic(err)
187+
}
177188
}
178189

179190
if _, ok := m.readyWorkers[identity]; !ok {
@@ -183,7 +194,10 @@ func (m *PrometheusMetrics) TotalWorkers(name string, _ int) {
183194
Name: "ready_workers",
184195
Help: "Running workers that have successfully called frankenphp_handle_request at least once",
185196
})
186-
m.registry.MustRegister(m.readyWorkers[identity])
197+
if err := m.registry.Register(m.readyWorkers[identity]); err != nil &&
198+
!errors.As(err, &prometheus.AlreadyRegisteredError{}) {
199+
panic(err)
200+
}
187201
}
188202

189203
if _, ok := m.busyWorkers[identity]; !ok {
@@ -193,7 +207,10 @@ func (m *PrometheusMetrics) TotalWorkers(name string, _ int) {
193207
Name: "busy_workers",
194208
Help: "Number of busy PHP workers for this worker",
195209
})
196-
m.registry.MustRegister(m.busyWorkers[identity])
210+
if err := m.registry.Register(m.busyWorkers[identity]); err != nil &&
211+
!errors.As(err, &prometheus.AlreadyRegisteredError{}) {
212+
panic(err)
213+
}
197214
}
198215

199216
if _, ok := m.workerRequestTime[identity]; !ok {
@@ -202,7 +219,10 @@ func (m *PrometheusMetrics) TotalWorkers(name string, _ int) {
202219
Subsystem: subsystem,
203220
Name: "worker_request_time",
204221
})
205-
m.registry.MustRegister(m.workerRequestTime[identity])
222+
if err := m.registry.Register(m.workerRequestTime[identity]); err != nil &&
223+
!errors.As(err, &prometheus.AlreadyRegisteredError{}) {
224+
panic(err)
225+
}
206226
}
207227

208228
if _, ok := m.workerRequestCount[identity]; !ok {
@@ -211,7 +231,10 @@ func (m *PrometheusMetrics) TotalWorkers(name string, _ int) {
211231
Subsystem: subsystem,
212232
Name: "worker_request_count",
213233
})
214-
m.registry.MustRegister(m.workerRequestCount[identity])
234+
if err := m.registry.Register(m.workerRequestCount[identity]); err != nil &&
235+
!errors.As(err, &prometheus.AlreadyRegisteredError{}) {
236+
panic(err)
237+
}
215238
}
216239
}
217240

@@ -292,8 +315,15 @@ func (m *PrometheusMetrics) Shutdown() {
292315
m.workerCrashes = map[string]prometheus.Counter{}
293316
m.readyWorkers = map[string]prometheus.Gauge{}
294317

295-
m.registry.MustRegister(m.totalThreads)
296-
m.registry.MustRegister(m.busyThreads)
318+
if err := m.registry.Register(m.totalThreads); err != nil &&
319+
!errors.As(err, &prometheus.AlreadyRegisteredError{}) {
320+
panic(err)
321+
}
322+
323+
if err := m.registry.Register(m.busyThreads); err != nil &&
324+
!errors.As(err, &prometheus.AlreadyRegisteredError{}) {
325+
panic(err)
326+
}
297327
}
298328

299329
func getWorkerNameForMetrics(name string) string {
@@ -327,8 +357,15 @@ func NewPrometheusMetrics(registry prometheus.Registerer) *PrometheusMetrics {
327357
readyWorkers: map[string]prometheus.Gauge{},
328358
}
329359

330-
m.registry.MustRegister(m.totalThreads)
331-
m.registry.MustRegister(m.busyThreads)
360+
if err := m.registry.Register(m.totalThreads); err != nil &&
361+
!errors.As(err, &prometheus.AlreadyRegisteredError{}) {
362+
panic(err)
363+
}
364+
365+
if err := m.registry.Register(m.busyThreads); err != nil &&
366+
!errors.As(err, &prometheus.AlreadyRegisteredError{}) {
367+
panic(err)
368+
}
332369

333370
return m
334371
}

0 commit comments

Comments
 (0)