From 42e83452f363d6bedda5f6993069ee85f0a2c813 Mon Sep 17 00:00:00 2001 From: Jannik Luhn Date: Wed, 12 Aug 2026 19:04:25 +0200 Subject: [PATCH 1/2] metrics: use counters instead of gauges for monotonic totals TotalSuccessfulIdentityRegistration, TotalDecryptionKeysReceived and TotalFailedRPCCalls are only ever incremented, so Counter is the correct type. Series names are unchanged, so existing queries keep working, and rate() over them is now legitimate rather than an accident. --- metrics/metrics.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/metrics/metrics.go b/metrics/metrics.go index b1cb12c..5266130 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -2,24 +2,24 @@ package metrics import "github.com/prometheus/client_golang/prometheus" -var TotalSuccessfulIdentityRegistration = prometheus.NewGauge( - prometheus.GaugeOpts{ +var TotalSuccessfulIdentityRegistration = prometheus.NewCounter( + prometheus.CounterOpts{ Namespace: "shutter_api", Name: "total_successful_identities_registration", Help: "counter of successful identity registration", }, ) -var TotalDecryptionKeysReceived = prometheus.NewGauge( - prometheus.GaugeOpts{ +var TotalDecryptionKeysReceived = prometheus.NewCounter( + prometheus.CounterOpts{ Namespace: "shutter_api", Name: "total_decryption_keys_received", Help: "counter of total dec keys received", }, ) -var TotalFailedRPCCalls = prometheus.NewGauge( - prometheus.GaugeOpts{ +var TotalFailedRPCCalls = prometheus.NewCounter( + prometheus.CounterOpts{ Namespace: "shutter_api", Name: "total_failed_rpc_calls", Help: "Counter of failed rpc calls", From adc5105130b3606c2dcc4700878a792d2ef58414 Mon Sep 17 00:00:00 2001 From: Jannik Luhn Date: Fri, 14 Aug 2026 21:31:39 +0200 Subject: [PATCH 2/2] metrics: rename counters to the _total suffix convention Prometheus counters carry _total as a suffix, not a prefix, and the plural belongs on the thing being counted: shutter_api_total_successful_identities_registration -> shutter_api_successful_identity_registrations_total shutter_api_total_decryption_keys_received -> shutter_api_decryption_keys_received_total shutter_api_total_failed_rpc_calls -> shutter_api_failed_rpc_calls_total Go identifiers drop their now-redundant Total prefix to match. Existing series keep their history under the old names but stop being written to, so any dashboard or alert rule querying them needs updating. --- internal/usecase/crypto.go | 22 +++++++++++----------- internal/usecase/eventtrigger.go | 16 ++++++++-------- metrics/metrics.go | 24 ++++++++++++------------ watcher/watcher.go | 2 +- 4 files changed, 32 insertions(+), 32 deletions(-) diff --git a/internal/usecase/crypto.go b/internal/usecase/crypto.go index 215697f..883aa64 100644 --- a/internal/usecase/crypto.go +++ b/internal/usecase/crypto.go @@ -120,7 +120,7 @@ func (uc *CryptoUsecase) getSigner(ctx context.Context) (*bind.TransactOpts, *ht chainID, err := uc.ethClient.ChainID(ctx) if err != nil { log.Err(err).Msg("err encountered while querying chain id") - metrics.TotalFailedRPCCalls.Inc() + metrics.FailedRPCCalls.Inc() err := httpError.NewHttpError( "error encountered while querying chain id", "", @@ -168,7 +168,7 @@ func (uc *CryptoUsecase) GetDecryptionKey(ctx context.Context, identity string) registrationData, err := uc.shutterRegistryContract.Registrations(nil, [32]byte(identityBytes)) if err != nil { log.Err(err).Msg("err encountered while querying contract") - metrics.TotalFailedRPCCalls.Inc() + metrics.FailedRPCCalls.Inc() err := httpError.NewHttpError( "error while querying for identity from the contract", "", @@ -301,7 +301,7 @@ func (uc *CryptoUsecase) GetDataForEncryption(ctx context.Context, address strin blockNumber, err := uc.ethClient.BlockNumber(ctx) if err != nil { log.Err(err).Msg("err encountered while querying for recent block") - metrics.TotalFailedRPCCalls.Inc() + metrics.FailedRPCCalls.Inc() err := httpError.NewHttpError( "error encountered while querying for recent block", "", @@ -313,7 +313,7 @@ func (uc *CryptoUsecase) GetDataForEncryption(ctx context.Context, address strin eon, err := uc.keyperSetManagerContract.GetKeyperSetIndexByBlock(nil, blockNumber) if err != nil { log.Err(err).Msg("err encountered while querying keyper set index") - metrics.TotalFailedRPCCalls.Inc() + metrics.FailedRPCCalls.Inc() err := httpError.NewHttpError( "error encountered while querying for keyper set index", "", @@ -325,7 +325,7 @@ func (uc *CryptoUsecase) GetDataForEncryption(ctx context.Context, address strin eonKeyBytes, err := uc.keyBroadcastContract.GetEonKey(nil, eon) if err != nil { log.Err(err).Msg("err encountered while querying for eon key") - metrics.TotalFailedRPCCalls.Inc() + metrics.FailedRPCCalls.Inc() err := httpError.NewHttpError( "error encountered while querying for eon key", "", @@ -442,7 +442,7 @@ func (uc *CryptoUsecase) RegisterIdentity(ctx context.Context, decryptionTimesta blockNumber, err := uc.ethClient.BlockNumber(ctx) if err != nil { log.Err(err).Msg("err encountered while querying for recent block") - metrics.TotalFailedRPCCalls.Inc() + metrics.FailedRPCCalls.Inc() err := httpError.NewHttpError( "error encountered while querying for recent block", "", @@ -454,7 +454,7 @@ func (uc *CryptoUsecase) RegisterIdentity(ctx context.Context, decryptionTimesta eon, err := uc.keyperSetManagerContract.GetKeyperSetIndexByBlock(nil, blockNumber) if err != nil { log.Err(err).Msg("err encountered while querying keyper set index") - metrics.TotalFailedRPCCalls.Inc() + metrics.FailedRPCCalls.Inc() err := httpError.NewHttpError( "error encountered while querying for keyper set index", "", @@ -466,7 +466,7 @@ func (uc *CryptoUsecase) RegisterIdentity(ctx context.Context, decryptionTimesta eonKeyBytes, err := uc.keyBroadcastContract.GetEonKey(nil, eon) if err != nil { log.Err(err).Msg("err encountered while querying for eon key") - metrics.TotalFailedRPCCalls.Inc() + metrics.FailedRPCCalls.Inc() err := httpError.NewHttpError( "error encountered while querying for eon key", "", @@ -496,7 +496,7 @@ func (uc *CryptoUsecase) RegisterIdentity(ctx context.Context, decryptionTimesta registrationData, err := uc.shutterRegistryContract.Registrations(nil, [32]byte(identity)) if err != nil { log.Err(err).Msg("err encountered while querying contract") - metrics.TotalFailedRPCCalls.Inc() + metrics.FailedRPCCalls.Inc() err := httpError.NewHttpError( "error while querying for registrations from the contract", "", @@ -525,7 +525,7 @@ func (uc *CryptoUsecase) RegisterIdentity(ctx context.Context, decryptionTimesta tx, err := uc.shutterRegistryContract.Register(&opts, eon, identityPrefix, decryptionTimestamp) if err != nil { log.Err(err).Msg("failed to send transaction") - metrics.TotalFailedRPCCalls.Inc() + metrics.FailedRPCCalls.Inc() err := httpError.NewHttpError( "failed to register identity", "", @@ -537,7 +537,7 @@ func (uc *CryptoUsecase) RegisterIdentity(ctx context.Context, decryptionTimesta // we return the transaction hash in response to allow // users the ability to monitor it themselves - metrics.TotalSuccessfulIdentityRegistration.Inc() + metrics.SuccessfulIdentityRegistrations.Inc() return &RegisterIdentityResponse{ Eon: eon, Identity: common.PrefixWith0x(hex.EncodeToString(identity)), diff --git a/internal/usecase/eventtrigger.go b/internal/usecase/eventtrigger.go index 4d29e7f..f3a08e5 100644 --- a/internal/usecase/eventtrigger.go +++ b/internal/usecase/eventtrigger.go @@ -288,7 +288,7 @@ func (uc *CryptoUsecase) RegisterEventIdentity(ctx context.Context, eventTrigger blockNumber, err := uc.ethClient.BlockNumber(ctx) if err != nil { log.Err(err).Msg("err encountered while querying for recent block") - metrics.TotalFailedRPCCalls.Inc() + metrics.FailedRPCCalls.Inc() err := httpError.NewHttpError( "error encountered while querying for recent block", "", @@ -300,7 +300,7 @@ func (uc *CryptoUsecase) RegisterEventIdentity(ctx context.Context, eventTrigger eon, err := uc.keyperSetManagerContract.GetKeyperSetIndexByBlock(nil, blockNumber) if err != nil { log.Err(err).Msg("err encountered while querying keyper set index") - metrics.TotalFailedRPCCalls.Inc() + metrics.FailedRPCCalls.Inc() err := httpError.NewHttpError( "error encountered while querying for keyper set index", "", @@ -312,7 +312,7 @@ func (uc *CryptoUsecase) RegisterEventIdentity(ctx context.Context, eventTrigger eonKeyBytes, err := uc.keyBroadcastContract.GetEonKey(nil, eon) if err != nil { log.Err(err).Msg("err encountered while querying for eon key") - metrics.TotalFailedRPCCalls.Inc() + metrics.FailedRPCCalls.Inc() err := httpError.NewHttpError( "error encountered while querying for eon key", "", @@ -335,7 +335,7 @@ func (uc *CryptoUsecase) RegisterEventIdentity(ctx context.Context, eventTrigger chainId, err := uc.ethClient.ChainID(ctx) if err != nil { log.Err(err).Msg("err encountered while quering chain id") - metrics.TotalFailedRPCCalls.Inc() + metrics.FailedRPCCalls.Inc() err := httpError.NewHttpError( "error encountered while querying chain id", "", @@ -411,7 +411,7 @@ func (uc *CryptoUsecase) RegisterEventIdentity(ctx context.Context, eventTrigger tx, err := uc.shutterEventRegistryContract.Register(&opts, eon, identityPrefix, eventTriggerDefinition, ttl) if err != nil { log.Err(err).Msg("failed to send transaction") - metrics.TotalFailedRPCCalls.Inc() + metrics.FailedRPCCalls.Inc() err := httpError.NewHttpError( "failed to register identity", "", @@ -441,7 +441,7 @@ func (uc *CryptoUsecase) RegisterEventIdentity(ctx context.Context, eventTrigger go uc.updateEventIdentityExpirationBlockNumber(tx.Hash(), eon, identity, ttl) - metrics.TotalSuccessfulIdentityRegistration.Inc() + metrics.SuccessfulIdentityRegistrations.Inc() return &RegisterIdentityResponse{ Eon: eon, Identity: common.PrefixWith0x(hex.EncodeToString(identity)), @@ -560,7 +560,7 @@ func (uc *CryptoUsecase) GetEventDecryptionKey(ctx context.Context, identity str blockNumber, err := uc.ethClient.BlockNumber(ctx) if err != nil { log.Err(err).Msg("err encountered while querying for recent block") - metrics.TotalFailedRPCCalls.Inc() + metrics.FailedRPCCalls.Inc() err := httpError.NewHttpError( "error encountered while querying for recent block", "", @@ -572,7 +572,7 @@ func (uc *CryptoUsecase) GetEventDecryptionKey(ctx context.Context, identity str eonUint, err := uc.keyperSetManagerContract.GetKeyperSetIndexByBlock(nil, blockNumber) if err != nil { log.Err(err).Msg("err encountered while querying current eon") - metrics.TotalFailedRPCCalls.Inc() + metrics.FailedRPCCalls.Inc() err := httpError.NewHttpError( "error encountered while querying current eon", "", diff --git a/metrics/metrics.go b/metrics/metrics.go index 5266130..5d4488c 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -2,32 +2,32 @@ package metrics import "github.com/prometheus/client_golang/prometheus" -var TotalSuccessfulIdentityRegistration = prometheus.NewCounter( +var SuccessfulIdentityRegistrations = prometheus.NewCounter( prometheus.CounterOpts{ Namespace: "shutter_api", - Name: "total_successful_identities_registration", - Help: "counter of successful identity registration", + Name: "successful_identity_registrations_total", + Help: "Count of successful identity registrations.", }, ) -var TotalDecryptionKeysReceived = prometheus.NewCounter( +var DecryptionKeysReceived = prometheus.NewCounter( prometheus.CounterOpts{ Namespace: "shutter_api", - Name: "total_decryption_keys_received", - Help: "counter of total dec keys received", + Name: "decryption_keys_received_total", + Help: "Count of decryption keys received from the keypers.", }, ) -var TotalFailedRPCCalls = prometheus.NewCounter( +var FailedRPCCalls = prometheus.NewCounter( prometheus.CounterOpts{ Namespace: "shutter_api", - Name: "total_failed_rpc_calls", - Help: "Counter of failed rpc calls", + Name: "failed_rpc_calls_total", + Help: "Count of failed RPC calls.", }, ) func InitMetrics() { - prometheus.MustRegister(TotalSuccessfulIdentityRegistration) - prometheus.MustRegister(TotalDecryptionKeysReceived) - prometheus.MustRegister(TotalFailedRPCCalls) + prometheus.MustRegister(SuccessfulIdentityRegistrations) + prometheus.MustRegister(DecryptionKeysReceived) + prometheus.MustRegister(FailedRPCCalls) } diff --git a/watcher/watcher.go b/watcher/watcher.go index d5603dc..a282fd9 100644 --- a/watcher/watcher.go +++ b/watcher/watcher.go @@ -46,7 +46,7 @@ func (w *Watcher) Start(ctx context.Context, runner service.Runner) error { }); err != nil { log.Err(err).Msg("failed to insert decryption key") } - metrics.TotalDecryptionKeysReceived.Inc() + metrics.DecryptionKeysReceived.Inc() } } }