package eventbus
import (
"reflect"
"strings"
"github.com/libp2p/go-libp2p/p2p/metricshelper"
"github.com/prometheus/client_golang/prometheus"
)
const metricNamespace = "libp2p_eventbus"
var (
eventsEmitted = prometheus .NewCounterVec (
prometheus .CounterOpts {
Namespace : metricNamespace ,
Name : "events_emitted_total" ,
Help : "Events Emitted" ,
},
[]string {"event" },
)
totalSubscribers = prometheus .NewGaugeVec (
prometheus .GaugeOpts {
Namespace : metricNamespace ,
Name : "subscribers_total" ,
Help : "Number of subscribers for an event type" ,
},
[]string {"event" },
)
subscriberQueueLength = prometheus .NewGaugeVec (
prometheus .GaugeOpts {
Namespace : metricNamespace ,
Name : "subscriber_queue_length" ,
Help : "Subscriber queue length" ,
},
[]string {"subscriber_name" },
)
subscriberQueueFull = prometheus .NewGaugeVec (
prometheus .GaugeOpts {
Namespace : metricNamespace ,
Name : "subscriber_queue_full" ,
Help : "Subscriber Queue completely full" ,
},
[]string {"subscriber_name" },
)
subscriberEventQueued = prometheus .NewCounterVec (
prometheus .CounterOpts {
Namespace : metricNamespace ,
Name : "subscriber_event_queued" ,
Help : "Event Queued for subscriber" ,
},
[]string {"subscriber_name" },
)
collectors = []prometheus .Collector {
eventsEmitted ,
totalSubscribers ,
subscriberQueueLength ,
subscriberQueueFull ,
subscriberEventQueued ,
}
)
type MetricsTracer interface {
EventEmitted (typ reflect .Type )
AddSubscriber (typ reflect .Type )
RemoveSubscriber (typ reflect .Type )
SubscriberQueueLength (name string , n int )
SubscriberQueueFull (name string , isFull bool )
SubscriberEventQueued (name string )
}
type metricsTracer struct {}
var _ MetricsTracer = &metricsTracer {}
type metricsTracerSetting struct {
reg prometheus .Registerer
}
type MetricsTracerOption func (*metricsTracerSetting )
func WithRegisterer (reg prometheus .Registerer ) MetricsTracerOption {
return func (s *metricsTracerSetting ) {
if reg != nil {
s .reg = reg
}
}
}
func NewMetricsTracer (opts ...MetricsTracerOption ) MetricsTracer {
setting := &metricsTracerSetting {reg : prometheus .DefaultRegisterer }
for _ , opt := range opts {
opt (setting )
}
metricshelper .RegisterCollectors (setting .reg , collectors ...)
return &metricsTracer {}
}
func (m *metricsTracer ) EventEmitted (typ reflect .Type ) {
tags := metricshelper .GetStringSlice ()
defer metricshelper .PutStringSlice (tags )
*tags = append (*tags , strings .TrimPrefix (typ .String (), "event." ))
eventsEmitted .WithLabelValues (*tags ...).Inc ()
}
func (m *metricsTracer ) AddSubscriber (typ reflect .Type ) {
tags := metricshelper .GetStringSlice ()
defer metricshelper .PutStringSlice (tags )
*tags = append (*tags , strings .TrimPrefix (typ .String (), "event." ))
totalSubscribers .WithLabelValues (*tags ...).Inc ()
}
func (m *metricsTracer ) RemoveSubscriber (typ reflect .Type ) {
tags := metricshelper .GetStringSlice ()
defer metricshelper .PutStringSlice (tags )
*tags = append (*tags , strings .TrimPrefix (typ .String (), "event." ))
totalSubscribers .WithLabelValues (*tags ...).Dec ()
}
func (m *metricsTracer ) SubscriberQueueLength (name string , n int ) {
tags := metricshelper .GetStringSlice ()
defer metricshelper .PutStringSlice (tags )
*tags = append (*tags , name )
subscriberQueueLength .WithLabelValues (*tags ...).Set (float64 (n ))
}
func (m *metricsTracer ) SubscriberQueueFull (name string , isFull bool ) {
tags := metricshelper .GetStringSlice ()
defer metricshelper .PutStringSlice (tags )
*tags = append (*tags , name )
observer := subscriberQueueFull .WithLabelValues (*tags ...)
if isFull {
observer .Set (1 )
} else {
observer .Set (0 )
}
}
func (m *metricsTracer ) SubscriberEventQueued (name string ) {
tags := metricshelper .GetStringSlice ()
defer metricshelper .PutStringSlice (tags )
*tags = append (*tags , name )
subscriberEventQueued .WithLabelValues (*tags ...).Inc ()
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .