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, ) }) }