Skip to content

Commit a56a235

Browse files
authored
Fix metrics registration failure after panic (#830)
1 parent 676d813 commit a56a235

File tree

3 files changed

+62
-27
lines changed

3 files changed

+62
-27
lines changed

kafka/main.go

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/aws/aws-sdk-go-v2/aws"
1616
awsConfig "github.com/aws/aws-sdk-go-v2/config"
1717
"github.com/brave-intl/challenge-bypass-server/server"
18+
"github.com/brave-intl/challenge-bypass-server/utils/metrics"
1819
uuid "github.com/google/uuid"
1920
"github.com/prometheus/client_golang/prometheus"
2021
kafkaGo "github.com/segmentio/kafka-go"
@@ -103,14 +104,17 @@ func StartConsumers(ctx context.Context, providedServer *server.Server, logger *
103104
prometheusRegistry = prometheus.DefaultRegisterer
104105
}
105106

106-
prometheusRegistry.MustRegister(tokenIssuanceRequestTotal)
107-
prometheusRegistry.MustRegister(tokenIssuanceFailureTotal)
108-
prometheusRegistry.MustRegister(tokenRedeemRequestTotal)
109-
prometheusRegistry.MustRegister(tokenRedeemFailureTotal)
110-
prometheusRegistry.MustRegister(duplicateRedemptionTotal)
111-
prometheusRegistry.MustRegister(idempotentRedemptionTotal)
112-
prometheusRegistry.MustRegister(rebootFromPanicTotal)
113-
prometheusRegistry.MustRegister(kafkaErrorTotal)
107+
metrics.MustRegisterIfNotRegistered(
108+
prometheusRegistry,
109+
tokenIssuanceRequestTotal,
110+
tokenIssuanceFailureTotal,
111+
tokenRedeemRequestTotal,
112+
tokenRedeemFailureTotal,
113+
duplicateRedemptionTotal,
114+
idempotentRedemptionTotal,
115+
rebootFromPanicTotal,
116+
kafkaErrorTotal,
117+
)
114118

115119
if len(brokers) < 1 {
116120
brokers = strings.Split(os.Getenv("VPC_KAFKA_BROKERS"), ",")
@@ -386,8 +390,8 @@ func getDialer(ctx context.Context, logger *slog.Logger) (*kafkaGo.Dialer, error
386390
DualStack: true,
387391
SASLMechanism: aws_msk_iam_v2.NewMechanism(cfg),
388392
TLS: &tls.Config{
389-
MinVersion: tls.VersionTLS12,
390-
},
393+
MinVersion: tls.VersionTLS12,
394+
},
391395
}, nil
392396
} else {
393397
logger.Debug("generating Dialer")

server/server.go

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414

1515
"github.com/aws/aws-sdk-go/service/dynamodb"
1616
"github.com/brave-intl/bat-go/libs/middleware"
17+
"github.com/brave-intl/challenge-bypass-server/utils/metrics"
1718
"github.com/go-chi/chi/v5"
1819
chiware "github.com/go-chi/chi/v5/middleware"
1920
"github.com/go-chi/httplog/v3"
@@ -77,23 +78,26 @@ var (
7778

7879
// init - Register Metrics for Server
7980
func init() {
80-
// DB
81-
prometheus.MustRegister(fetchIssuerTotal)
82-
prometheus.MustRegister(createIssuerTotal)
83-
prometheus.MustRegister(redeemTokenTotal)
84-
prometheus.MustRegister(fetchRedemptionTotal)
85-
// DB latency
86-
prometheus.MustRegister(fetchIssuerByTypeDBDuration)
87-
prometheus.MustRegister(createIssuerDBDuration)
88-
prometheus.MustRegister(createRedemptionDBDuration)
89-
prometheus.MustRegister(fetchRedemptionDBDuration)
90-
// API Calls
91-
prometheus.MustRegister(v1BlindedTokenCallTotal)
92-
prometheus.MustRegister(v1IssuerCallTotal)
93-
prometheus.MustRegister(v2BlindedTokenCallTotal)
94-
prometheus.MustRegister(v2IssuerCallTotal)
95-
prometheus.MustRegister(v3BlindedTokenCallTotal)
96-
prometheus.MustRegister(v3IssuerCallTotal)
81+
metrics.MustRegisterIfNotRegistered(
82+
prometheus.DefaultRegisterer,
83+
// DB
84+
fetchIssuerTotal,
85+
createIssuerTotal,
86+
redeemTokenTotal,
87+
fetchRedemptionTotal,
88+
// DB latency
89+
fetchIssuerByTypeDBDuration,
90+
createIssuerDBDuration,
91+
createRedemptionDBDuration,
92+
fetchRedemptionDBDuration,
93+
// API Calls
94+
v1BlindedTokenCallTotal,
95+
v1IssuerCallTotal,
96+
v2BlindedTokenCallTotal,
97+
v2IssuerCallTotal,
98+
v3BlindedTokenCallTotal,
99+
v3IssuerCallTotal,
100+
)
97101
}
98102

99103
// Server - base server type

utils/metrics/register.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package metrics
2+
3+
import (
4+
"errors"
5+
6+
"github.com/prometheus/client_golang/prometheus"
7+
)
8+
9+
// When the service panics and restarts we get a prometheus error indicating that our
10+
// collectors are already registered. To handle this case, we check if a registration
11+
// failure is the result of an already registered collector and use that one if so.
12+
// This is all side effects due to the way that prometheus handles collectors as
13+
// interfaces with pointers etc.
14+
func MustRegisterIfNotRegistered(
15+
registry prometheus.Registerer,
16+
collectors ...prometheus.Collector,
17+
) {
18+
for _, collector := range collectors {
19+
err := registry.Register(collector)
20+
if err != nil {
21+
var alreadyRegisteredError prometheus.AlreadyRegisteredError
22+
if !errors.As(err, &alreadyRegisteredError) {
23+
panic(err)
24+
}
25+
}
26+
}
27+
}

0 commit comments

Comments
 (0)