150 lines
5.0 KiB
Go
150 lines
5.0 KiB
Go
/*
|
|
Copyright IBM Corp. All Rights Reserved.
|
|
|
|
SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
package cluster
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/hyperledger/fabric/common/metrics"
|
|
)
|
|
|
|
var (
|
|
EgressQueueLengthOpts = metrics.GaugeOpts{
|
|
Namespace: "cluster",
|
|
Subsystem: "comm",
|
|
Name: "egress_queue_length",
|
|
Help: "Length of the egress queue.",
|
|
LabelNames: []string{"host", "msg_type", "channel"},
|
|
StatsdFormat: "%{#fqname}.%{host}.%{msg_type}.%{channel}",
|
|
}
|
|
|
|
EgressQueueCapacityOpts = metrics.GaugeOpts{
|
|
Namespace: "cluster",
|
|
Subsystem: "comm",
|
|
Name: "egress_queue_capacity",
|
|
Help: "Capacity of the egress queue.",
|
|
LabelNames: []string{"host", "msg_type", "channel"},
|
|
StatsdFormat: "%{#fqname}.%{host}.%{msg_type}.%{channel}",
|
|
}
|
|
|
|
EgressWorkersOpts = metrics.GaugeOpts{
|
|
Namespace: "cluster",
|
|
Subsystem: "comm",
|
|
Name: "egress_queue_workers",
|
|
Help: "Count of egress queue workers.",
|
|
LabelNames: []string{"channel"},
|
|
StatsdFormat: "%{#fqname}.%{channel}",
|
|
}
|
|
|
|
IngressStreamsCountOpts = metrics.GaugeOpts{
|
|
Namespace: "cluster",
|
|
Subsystem: "comm",
|
|
Name: "ingress_stream_count",
|
|
Help: "Count of streams from other nodes.",
|
|
StatsdFormat: "%{#fqname}",
|
|
}
|
|
|
|
EgressStreamsCountOpts = metrics.GaugeOpts{
|
|
Namespace: "cluster",
|
|
Subsystem: "comm",
|
|
Name: "egress_stream_count",
|
|
Help: "Count of streams to other nodes.",
|
|
LabelNames: []string{"channel"},
|
|
StatsdFormat: "%{#fqname}.%{channel}",
|
|
}
|
|
|
|
EgressTLSConnectionCountOpts = metrics.GaugeOpts{
|
|
Namespace: "cluster",
|
|
Subsystem: "comm",
|
|
Name: "egress_tls_connection_count",
|
|
Help: "Count of TLS connections to other nodes.",
|
|
StatsdFormat: "%{#fqname}",
|
|
}
|
|
|
|
MessageSendTimeOpts = metrics.HistogramOpts{
|
|
Namespace: "cluster",
|
|
Subsystem: "comm",
|
|
Name: "msg_send_time",
|
|
Help: "The time it takes to send a message in seconds.",
|
|
LabelNames: []string{"host", "channel"},
|
|
StatsdFormat: "%{#fqname}.%{host}.%{channel}",
|
|
}
|
|
|
|
MessagesDroppedCountOpts = metrics.CounterOpts{
|
|
Namespace: "cluster",
|
|
Subsystem: "comm",
|
|
Name: "msg_dropped_count",
|
|
Help: "Count of messages dropped.",
|
|
LabelNames: []string{"host", "channel"},
|
|
StatsdFormat: "%{#fqname}.%{host}.%{channel}",
|
|
}
|
|
)
|
|
|
|
// Metrics defines the metrics for the cluster.
|
|
type Metrics struct {
|
|
EgressQueueLength metrics.Gauge
|
|
EgressQueueCapacity metrics.Gauge
|
|
EgressWorkerCount metrics.Gauge
|
|
IngressStreamsCount metrics.Gauge
|
|
EgressStreamsCount metrics.Gauge
|
|
EgressTLSConnectionCount metrics.Gauge
|
|
MessageSendTime metrics.Histogram
|
|
MessagesDroppedCount metrics.Counter
|
|
}
|
|
|
|
// A MetricsProvider is an abstraction for a metrics provider. It is a factory for
|
|
// Counter, Gauge, and Histogram meters.
|
|
type MetricsProvider interface {
|
|
// NewCounter creates a new instance of a Counter.
|
|
NewCounter(opts metrics.CounterOpts) metrics.Counter
|
|
// NewGauge creates a new instance of a Gauge.
|
|
NewGauge(opts metrics.GaugeOpts) metrics.Gauge
|
|
// NewHistogram creates a new instance of a Histogram.
|
|
NewHistogram(opts metrics.HistogramOpts) metrics.Histogram
|
|
}
|
|
|
|
//go:generate mockery --dir . --name MetricsProvider --case underscore --output ./mocks/
|
|
|
|
// NewMetrics initializes new metrics for the cluster infrastructure.
|
|
func NewMetrics(provider MetricsProvider) *Metrics {
|
|
return &Metrics{
|
|
EgressQueueLength: provider.NewGauge(EgressQueueLengthOpts),
|
|
EgressQueueCapacity: provider.NewGauge(EgressQueueCapacityOpts),
|
|
EgressStreamsCount: provider.NewGauge(EgressStreamsCountOpts),
|
|
EgressTLSConnectionCount: provider.NewGauge(EgressTLSConnectionCountOpts),
|
|
EgressWorkerCount: provider.NewGauge(EgressWorkersOpts),
|
|
IngressStreamsCount: provider.NewGauge(IngressStreamsCountOpts),
|
|
MessagesDroppedCount: provider.NewCounter(MessagesDroppedCountOpts),
|
|
MessageSendTime: provider.NewHistogram(MessageSendTimeOpts),
|
|
}
|
|
}
|
|
|
|
func (m *Metrics) reportMessagesDropped(host, channel string) {
|
|
m.MessagesDroppedCount.With("host", host, "channel", channel).Add(1)
|
|
}
|
|
|
|
func (m *Metrics) reportQueueOccupancy(host string, msgType string, channel string, length, capacity int) {
|
|
m.EgressQueueLength.With("host", host, "msg_type", msgType, "channel", channel).Set(float64(length))
|
|
m.EgressQueueCapacity.With("host", host, "msg_type", msgType, "channel", channel).Set(float64(capacity))
|
|
}
|
|
|
|
func (m *Metrics) reportWorkerCount(channel string, count uint32) {
|
|
m.EgressWorkerCount.With("channel", channel).Set(float64(count))
|
|
}
|
|
|
|
func (m *Metrics) reportMsgSendTime(host string, channel string, duration time.Duration) {
|
|
m.MessageSendTime.With("host", host, "channel", channel).Observe(float64(duration.Seconds()))
|
|
}
|
|
|
|
func (m *Metrics) reportEgressStreamCount(channel string, count uint32) {
|
|
m.EgressStreamsCount.With("channel", channel).Set(float64(count))
|
|
}
|
|
|
|
func (m *Metrics) reportStreamCount(count uint32) {
|
|
m.IngressStreamsCount.Set(float64(count))
|
|
}
|