gecko/snow/consensus/snowman/metrics.go

88 lines
2.3 KiB
Go

// (c) 2019-2020, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package snowman
import (
"fmt"
"time"
"github.com/prometheus/client_golang/prometheus"
"github.com/ava-labs/gecko/ids"
"github.com/ava-labs/gecko/utils/logging"
"github.com/ava-labs/gecko/utils/timer"
)
type metrics struct {
numProcessing prometheus.Gauge
latAccepted, latRejected prometheus.Histogram
clock timer.Clock
processing map[[32]byte]time.Time
}
// Initialize implements the Engine interface
func (m *metrics) Initialize(log logging.Logger, namespace string, registerer prometheus.Registerer) error {
m.processing = make(map[[32]byte]time.Time)
m.numProcessing = prometheus.NewGauge(
prometheus.GaugeOpts{
Namespace: namespace,
Name: "processing",
Help: "Number of currently processing blocks",
})
m.latAccepted = prometheus.NewHistogram(
prometheus.HistogramOpts{
Namespace: namespace,
Name: "accepted",
Help: "Latency of accepting from the time the block was issued in milliseconds",
Buckets: timer.Buckets,
})
m.latRejected = prometheus.NewHistogram(
prometheus.HistogramOpts{
Namespace: namespace,
Name: "rejected",
Help: "Latency of rejecting from the time the block was issued in milliseconds",
Buckets: timer.Buckets,
})
if err := registerer.Register(m.numProcessing); err != nil {
return fmt.Errorf("Failed to register processing statistics due to %w", err)
}
if err := registerer.Register(m.latAccepted); err != nil {
return fmt.Errorf("Failed to register accepted statistics due to %w", err)
}
if err := registerer.Register(m.latRejected); err != nil {
return fmt.Errorf("Failed to register rejected statistics due to %w", err)
}
return nil
}
func (m *metrics) Issued(id ids.ID) {
m.processing[id.Key()] = m.clock.Time()
m.numProcessing.Inc()
}
func (m *metrics) Accepted(id ids.ID) {
key := id.Key()
start := m.processing[key]
end := m.clock.Time()
delete(m.processing, key)
m.latAccepted.Observe(float64(end.Sub(start).Milliseconds()))
m.numProcessing.Dec()
}
func (m *metrics) Rejected(id ids.ID) {
key := id.Key()
start := m.processing[key]
end := m.clock.Time()
delete(m.processing, key)
m.latRejected.Observe(float64(end.Sub(start).Milliseconds()))
m.numProcessing.Dec()
}