The core protocol of WoopChain
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
woop/consensus/metrics.go

198 lines
5.6 KiB

package consensus
import (
"fmt"
"sync"
prom "github.com/harmony-one/harmony/api/service/prometheus"
"github.com/prometheus/client_golang/prometheus"
)
var (
preimageStartGauge = prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Namespace: "hmy",
Subsystem: "blockchain",
Name: "preimage_start",
Help: "the first block for which pre-image generation ran locally",
ConstLabels: map[string]string{},
},
[]string{
"shard",
},
)
preimageEndGauge = prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Namespace: "hmy",
Subsystem: "blockchain",
Name: "preimage_end",
Help: "the last block for which pre-image generation ran locally",
},
[]string{
"shard",
},
)
verifiedPreimagesGauge = prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Namespace: "hmy",
Subsystem: "blockchain",
Name: "verified_preimages",
Help: "the number of verified preimages",
},
[]string{
"shard",
},
)
lastPreimageImportGauge = prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Namespace: "hmy",
Subsystem: "blockchain",
Name: "last_preimage_import",
Help: "the last known block for which preimages were imported",
},
[]string{
"shard",
},
)
// consensusCounterVec is used to keep track of consensus reached
consensusCounterVec = prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: "hmy",
Subsystem: "consensus",
Name: "bingo",
Help: "counter of consensus",
},
[]string{
"consensus",
},
)
// consensusVCCounterVec is used to keep track of number of view change
consensusVCCounterVec = prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: "hmy",
Subsystem: "consensus",
Name: "viewchange",
Help: "counter of view chagne",
},
[]string{
"viewchange",
},
)
// consensusSyncCounterVec is used to keep track of consensus syncing state
consensusSyncCounterVec = prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: "hmy",
Subsystem: "consensus",
Name: "sync",
Help: "counter of blockchain syncing state",
},
[]string{
"consensus",
},
)
// consensusGaugeVec is used to keep track of gauge number of the consensus
consensusGaugeVec = prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Namespace: "hmy",
Subsystem: "consensus",
Name: "signatures",
Help: "number of signatures or commits",
},
[]string{
"consensus",
},
)
// consensusPubkeyVec is used to keep track of bls pubkeys
consensusPubkeyVec = prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Namespace: "hmy",
Subsystem: "consensus",
Name: "blskeys",
Help: "list of bls pubkey",
},
[]string{
"index", "pubkey",
},
)
// consensusFinalityHistogram is used to keep track of finality
// 10 ExponentialBuckets are in the unit of millisecond:
// 800, 1000, 1250, 1562, 1953, 2441, 3051, 3814, 4768, 5960, inf
consensusFinalityHistogram = prometheus.NewHistogram(
prometheus.HistogramOpts{
Namespace: "hmy",
Subsystem: "consensus",
Name: "finality",
Help: "the latency of the finality",
Buckets: prometheus.ExponentialBuckets(800, 1.25, 10),
},
)
onceMetrics sync.Once
// TODO: add last consensus timestamp, add view ID
// add last view change timestamp
)
// UpdateValidatorMetrics will udpate validator metrics
func (consensus *Consensus) UpdateValidatorMetrics(numSig float64, blockNum float64) {
consensusCounterVec.With(prometheus.Labels{"consensus": "bingo"}).Inc()
consensusGaugeVec.With(prometheus.Labels{"consensus": "signatures"}).Set(numSig)
consensusCounterVec.With(prometheus.Labels{"consensus": "signatures"}).Add(numSig)
consensusGaugeVec.With(prometheus.Labels{"consensus": "block_num"}).Set(blockNum)
}
// UpdateLeaderMetrics will udpate leader metrics
func (consensus *Consensus) UpdateLeaderMetrics(numCommits float64, blockNum float64) {
consensusCounterVec.With(prometheus.Labels{"consensus": "hooray"}).Inc()
consensusGaugeVec.With(prometheus.Labels{"consensus": "block_num"}).Set(blockNum)
consensusCounterVec.With(prometheus.Labels{"consensus": "num_commits"}).Add(numCommits)
consensusGaugeVec.With(prometheus.Labels{"consensus": "num_commits"}).Set(numCommits)
}
func (consensus *Consensus) UpdatePreimageGenerationMetrics(
preimageStart uint64,
preimageEnd uint64,
lastPreimageImport uint64,
verifiedAddresses uint64,
shard uint32,
) {
if lastPreimageImport > 0 {
lastPreimageImportGauge.With(prometheus.Labels{"shard": fmt.Sprintf("%d", shard)}).Set(float64(lastPreimageImport))
}
if preimageStart > 0 {
preimageStartGauge.With(prometheus.Labels{"shard": fmt.Sprintf("%d", shard)}).Set(float64(preimageStart))
}
if preimageEnd > 0 {
preimageEndGauge.With(prometheus.Labels{"shard": fmt.Sprintf("%d", shard)}).Set(float64(preimageEnd))
}
if verifiedAddresses > 0 {
verifiedPreimagesGauge.With(prometheus.Labels{"shard": fmt.Sprintf("%d", shard)}).Set(float64(verifiedAddresses))
}
}
// AddPubkeyMetrics add the list of blskeys to prometheus metrics
func (consensus *Consensus) AddPubkeyMetrics() {
keys := consensus.GetPublicKeys()
for i, key := range keys {
index := fmt.Sprintf("%d", i)
consensusPubkeyVec.With(prometheus.Labels{"index": index, "pubkey": key.Bytes.Hex()}).Set(float64(i))
}
}
func initMetrics() {
onceMetrics.Do(func() {
prom.PromRegistry().MustRegister(
consensusCounterVec,
consensusVCCounterVec,
consensusSyncCounterVec,
consensusGaugeVec,
consensusPubkeyVec,
consensusFinalityHistogram,
lastPreimageImportGauge,
preimageEndGauge,
preimageStartGauge,
verifiedPreimagesGauge,
)
})
}