mirror of
https://github.com/libp2p/go-libp2p-core.git
synced 2025-03-19 11:50:07 +08:00
71 lines
1.8 KiB
Go
71 lines
1.8 KiB
Go
package metrics
|
|
|
|
import (
|
|
"fmt"
|
|
"sync"
|
|
|
|
"go.opencensus.io/stats/view"
|
|
)
|
|
|
|
var registeredViews = map[string][]*view.View{}
|
|
var mu = new(sync.Mutex)
|
|
|
|
type ErrNamespace struct {
|
|
Namespace string
|
|
}
|
|
|
|
// ErrUnregisteredNamespace is an error for lookup of requested unregistered Namespace
|
|
type ErrUnregisteredNamespace ErrNamespace
|
|
|
|
func (e ErrUnregisteredNamespace) Error() string {
|
|
return fmt.Sprintf("no views found registered under Namespace %s", e.Namespace)
|
|
}
|
|
|
|
// ErrDuplicateNamespaceRegistration is an error for a Namespace that has already
|
|
// registered views
|
|
type ErrDuplicateNamespaceRegistration ErrNamespace
|
|
|
|
func (e ErrDuplicateNamespaceRegistration) Error() string {
|
|
return fmt.Sprintf("duplicate registration of views by Namespace %s", e.Namespace)
|
|
}
|
|
|
|
// RegisterViews accepts a namespace and a slice of Views, which will be registered
|
|
// with opencensus and maintained in the global registered views map
|
|
func RegisterViews(namespace string, views ...*view.View) error {
|
|
mu.Lock()
|
|
defer mu.Unlock()
|
|
_, ok := registeredViews[namespace]
|
|
if ok {
|
|
return ErrDuplicateNamespaceRegistration{Namespace: namespace}
|
|
} else {
|
|
registeredViews[namespace] = views
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// LookupViews returns all views for a Namespace name. Returns an error if the
|
|
// Namespace has not been registered.
|
|
func LookupViews(name string) ([]*view.View, error) {
|
|
mu.Lock()
|
|
defer mu.Unlock()
|
|
views, ok := registeredViews[name]
|
|
if !ok {
|
|
return nil, ErrUnregisteredNamespace{Namespace: name}
|
|
}
|
|
response := make([]*view.View, len(views))
|
|
copy(response, views)
|
|
return response, nil
|
|
}
|
|
|
|
// AllViews returns all registered views as a single slice
|
|
func AllViews() []*view.View {
|
|
var views []*view.View
|
|
mu.Lock()
|
|
defer mu.Unlock()
|
|
for _, vs := range registeredViews {
|
|
views = append(views, vs...)
|
|
}
|
|
return views
|
|
}
|