diff --git a/signature-aggregator/aggregator/aggregator.go b/signature-aggregator/aggregator/aggregator.go index 229e9385..7a0f441d 100644 --- a/signature-aggregator/aggregator/aggregator.go +++ b/signature-aggregator/aggregator/aggregator.go @@ -121,6 +121,12 @@ func (s *SignatureAggregator) CreateSignedMessage( s.metrics.FailuresToGetValidatorSet.Inc() return nil, fmt.Errorf("%s: %w", msg, err) } + s.metrics.ConnectedStakeWeightPercentage.WithLabelValues( + signingSubnet.String(), + ).Set( + float64(connectedValidators.ConnectedWeight) / + float64(connectedValidators.TotalValidatorWeight) * 100, + ) if !utils.CheckStakeWeightPercentageExceedsThreshold( big.NewInt(0).SetUint64(connectedValidators.ConnectedWeight), diff --git a/signature-aggregator/metrics/metrics.go b/signature-aggregator/metrics/metrics.go index 0383f7e8..37a7f6a7 100644 --- a/signature-aggregator/metrics/metrics.go +++ b/signature-aggregator/metrics/metrics.go @@ -31,6 +31,7 @@ var Opts = struct { InvalidSignatureResponses prometheus.CounterOpts SignatureCacheHits prometheus.CounterOpts SignatureCacheMisses prometheus.CounterOpts + ConnectedStakeWeightPercentage prometheus.GaugeOpts }{ AggregateSignaturesLatencyMS: prometheus.GaugeOpts{ Name: "agg_sigs_latency_ms", @@ -72,6 +73,10 @@ var Opts = struct { Name: "signature_cache_misses", Help: "Number of signatures that were not found in the cache", }, + ConnectedStakeWeightPercentage: prometheus.GaugeOpts{ + Name: "connected_stake_weight_percentage", + Help: "The percentage of connected stake weight for a specific subnet", + }, } type SignatureAggregatorMetrics struct { @@ -85,6 +90,7 @@ type SignatureAggregatorMetrics struct { InvalidSignatureResponses prometheus.Counter SignatureCacheHits prometheus.Counter SignatureCacheMisses prometheus.Counter + ConnectedStakeWeightPercentage *prometheus.GaugeVec // TODO: consider other failures to monitor. Issue #384 requires // "network failures", but we probably don't handle those directly. @@ -129,6 +135,10 @@ func NewSignatureAggregatorMetrics( SignatureCacheMisses: prometheus.NewCounter( Opts.SignatureCacheMisses, ), + ConnectedStakeWeightPercentage: prometheus.NewGaugeVec( + Opts.ConnectedStakeWeightPercentage, + []string{"subnetID"}, + ), } registerer.MustRegister(m.AggregateSignaturesLatencyMS) @@ -141,6 +151,7 @@ func NewSignatureAggregatorMetrics( registerer.MustRegister(m.InvalidSignatureResponses) registerer.MustRegister(m.SignatureCacheHits) registerer.MustRegister(m.SignatureCacheMisses) + registerer.MustRegister(m.ConnectedStakeWeightPercentage) return &m } diff --git a/tests/signature_aggregator_api.go b/tests/signature_aggregator_api.go index c0a2e393..4b00c23d 100644 --- a/tests/signature_aggregator_api.go +++ b/tests/signature_aggregator_api.go @@ -137,6 +137,15 @@ func SignatureAggregatorAPI(network interfaces.LocalNetwork) { {metrics.Opts.InvalidSignatureResponses.Name, "==", 0}, {metrics.Opts.SignatureCacheHits.Name, "==", 0}, {metrics.Opts.SignatureCacheMisses.Name, "==", 0}, + { + fmt.Sprintf( + "%s{subnetID=\"%s\"}", + metrics.Opts.ConnectedStakeWeightPercentage.Name, + subnetAInfo.SubnetID.String(), + ), + "==", + 100, + }, } { Expect(metricsSample[m.name]).Should( BeNumerically(m.op, m.value), @@ -191,6 +200,7 @@ func sampleMetrics(port uint16) map[string]uint64 { metrics.Opts.InvalidSignatureResponses.Name, metrics.Opts.SignatureCacheHits.Name, metrics.Opts.SignatureCacheMisses.Name, + metrics.Opts.ConnectedStakeWeightPercentage.Name, } { if strings.HasPrefix( line, @@ -199,7 +209,9 @@ func sampleMetrics(port uint16) map[string]uint64 { log.Debug("Found metric line", "line", line) parts := strings.Fields(line) - // Fetch the metric count from the last field of the line + metricName = strings.Replace(parts[0], "U__signature_2d_aggregator_", "", 1) + + // Parse the metric count from the last field of the line value, err := strconv.ParseUint(parts[len(parts)-1], 10, 64) if err != nil { log.Warn("failed to parse value from metric line")