mirror of https://github.com/poanetwork/gecko.git
88 lines
2.3 KiB
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.MillisecondsBuckets,
|
|
})
|
|
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.MillisecondsBuckets,
|
|
})
|
|
|
|
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()
|
|
}
|