5452b59a2e
* Update go-libp2p to v0.22.0 * Testing with go1.19 * build(deps): bump github.com/multiformats/go-multicodec Bumps [github.com/multiformats/go-multicodec](https://github.com/multiformats/go-multicodec) from 0.5.0 to 0.6.0. - [Release notes](https://github.com/multiformats/go-multicodec/releases) - [Commits](https://github.com/multiformats/go-multicodec/compare/v0.5.0...v0.6.0) --- updated-dependencies: - dependency-name: github.com/multiformats/go-multicodec dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * build(deps): bump github.com/ipld/go-car from 0.4.0 to 0.5.0 Bumps [github.com/ipld/go-car](https://github.com/ipld/go-car) from 0.4.0 to 0.5.0. - [Release notes](https://github.com/ipld/go-car/releases) - [Commits](https://github.com/ipld/go-car/compare/v0.4.0...v0.5.0) --- updated-dependencies: - dependency-name: github.com/ipld/go-car dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * build(deps): bump github.com/prometheus/client_golang Bumps [github.com/prometheus/client_golang](https://github.com/prometheus/client_golang) from 1.12.2 to 1.13.0. - [Release notes](https://github.com/prometheus/client_golang/releases) - [Changelog](https://github.com/prometheus/client_golang/blob/main/CHANGELOG.md) - [Commits](https://github.com/prometheus/client_golang/compare/v1.12.2...v1.13.0) --- updated-dependencies: - dependency-name: github.com/prometheus/client_golang dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * build(deps): bump github.com/hashicorp/go-hclog from 1.2.1 to 1.3.0 Bumps [github.com/hashicorp/go-hclog](https://github.com/hashicorp/go-hclog) from 1.2.1 to 1.3.0. - [Release notes](https://github.com/hashicorp/go-hclog/releases) - [Commits](https://github.com/hashicorp/go-hclog/compare/v1.2.1...v1.3.0) --- updated-dependencies: - dependency-name: github.com/hashicorp/go-hclog dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * build(deps): bump github.com/ipfs/go-ds-crdt from 0.3.6 to 0.3.7 Bumps [github.com/ipfs/go-ds-crdt](https://github.com/ipfs/go-ds-crdt) from 0.3.6 to 0.3.7. - [Release notes](https://github.com/ipfs/go-ds-crdt/releases) - [Commits](https://github.com/ipfs/go-ds-crdt/compare/v0.3.6...v0.3.7) --- updated-dependencies: - dependency-name: github.com/ipfs/go-ds-crdt dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> * build(deps): bump github.com/urfave/cli/v2 from 2.10.2 to 2.14.1 Bumps [github.com/urfave/cli/v2](https://github.com/urfave/cli) from 2.10.2 to 2.14.1. - [Release notes](https://github.com/urfave/cli/releases) - [Changelog](https://github.com/urfave/cli/blob/main/docs/CHANGELOG.md) - [Commits](https://github.com/urfave/cli/compare/v2.10.2...v2.14.1) --- updated-dependencies: - dependency-name: github.com/urfave/cli/v2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * build(deps): bump github.com/libp2p/go-libp2p-http from 0.3.0 to 0.4.0 Bumps [github.com/libp2p/go-libp2p-http](https://github.com/libp2p/go-libp2p-http) from 0.3.0 to 0.4.0. - [Release notes](https://github.com/libp2p/go-libp2p-http/releases) - [Commits](https://github.com/libp2p/go-libp2p-http/compare/v0.3.0...v0.4.0) --- updated-dependencies: - dependency-name: github.com/libp2p/go-libp2p-http dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * build(deps): bump github.com/libp2p/go-libp2p-gorpc from 0.4.0 to 0.5.0 Bumps [github.com/libp2p/go-libp2p-gorpc](https://github.com/libp2p/go-libp2p-gorpc) from 0.4.0 to 0.5.0. - [Release notes](https://github.com/libp2p/go-libp2p-gorpc/releases) - [Commits](https://github.com/libp2p/go-libp2p-gorpc/compare/v0.4.0...v0.5.0) --- updated-dependencies: - dependency-name: github.com/libp2p/go-libp2p-gorpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * build(deps): bump contrib.go.opencensus.io/exporter/prometheus Bumps [contrib.go.opencensus.io/exporter/prometheus](https://github.com/census-ecosystem/opencensus-go-exporter-prometheus) from 0.4.1 to 0.4.2. - [Release notes](https://github.com/census-ecosystem/opencensus-go-exporter-prometheus/releases) - [Commits](https://github.com/census-ecosystem/opencensus-go-exporter-prometheus/compare/v0.4.1...v0.4.2) --- updated-dependencies: - dependency-name: contrib.go.opencensus.io/exporter/prometheus dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> * build(deps): bump github.com/libp2p/go-libp2p-raft from 0.1.8 to 0.2.0 Bumps [github.com/libp2p/go-libp2p-raft](https://github.com/libp2p/go-libp2p-raft) from 0.1.8 to 0.2.0. - [Release notes](https://github.com/libp2p/go-libp2p-raft/releases) - [Commits](https://github.com/libp2p/go-libp2p-raft/compare/v0.1.8...v0.2.0) --- updated-dependencies: - dependency-name: github.com/libp2p/go-libp2p-raft dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * build(deps): bump github.com/urfave/cli from 1.22.9 to 1.22.10 Bumps [github.com/urfave/cli](https://github.com/urfave/cli) from 1.22.9 to 1.22.10. - [Release notes](https://github.com/urfave/cli/releases) - [Changelog](https://github.com/urfave/cli/blob/main/docs/CHANGELOG.md) - [Commits](https://github.com/urfave/cli/compare/v1.22.9...v1.22.10) --- updated-dependencies: - dependency-name: github.com/urfave/cli dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> * Fix checker/linter/staticcheck warnings Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
189 lines
4.0 KiB
Go
189 lines
4.0 KiB
Go
package metrics
|
|
|
|
import (
|
|
"sort"
|
|
"sync"
|
|
|
|
"github.com/ipfs-cluster/ipfs-cluster/api"
|
|
|
|
peer "github.com/libp2p/go-libp2p/core/peer"
|
|
)
|
|
|
|
// PeerMetrics maps a peer IDs to a metrics window.
|
|
type PeerMetrics map[peer.ID]*Window
|
|
|
|
// Store can be used to store and access metrics.
|
|
type Store struct {
|
|
mux sync.RWMutex
|
|
byName map[string]PeerMetrics
|
|
}
|
|
|
|
// NewStore can be used to create a Store.
|
|
func NewStore() *Store {
|
|
return &Store{
|
|
byName: make(map[string]PeerMetrics),
|
|
}
|
|
}
|
|
|
|
// Add inserts a new metric in Metrics.
|
|
func (mtrs *Store) Add(m api.Metric) {
|
|
mtrs.mux.Lock()
|
|
defer mtrs.mux.Unlock()
|
|
|
|
name := m.Name
|
|
peer := m.Peer
|
|
mbyp, ok := mtrs.byName[name]
|
|
if !ok {
|
|
mbyp = make(PeerMetrics)
|
|
mtrs.byName[name] = mbyp
|
|
}
|
|
window, ok := mbyp[peer]
|
|
if !ok {
|
|
// We always lock the outer map, so we can use unsafe
|
|
// Window.
|
|
window = NewWindow(DefaultWindowCap)
|
|
mbyp[peer] = window
|
|
}
|
|
|
|
window.Add(m)
|
|
}
|
|
|
|
// RemovePeer removes all metrics related to a peer from the Store.
|
|
func (mtrs *Store) RemovePeer(pid peer.ID) {
|
|
mtrs.mux.Lock()
|
|
for _, metrics := range mtrs.byName {
|
|
delete(metrics, pid)
|
|
}
|
|
mtrs.mux.Unlock()
|
|
}
|
|
|
|
// RemovePeerMetrics removes all metrics of a given name for a given peer ID.
|
|
func (mtrs *Store) RemovePeerMetrics(pid peer.ID, name string) {
|
|
mtrs.mux.Lock()
|
|
metrics := mtrs.byName[name]
|
|
delete(metrics, pid)
|
|
mtrs.mux.Unlock()
|
|
}
|
|
|
|
// LatestValid returns all the last known valid metrics of a given type. A metric
|
|
// is valid if it has not expired.
|
|
func (mtrs *Store) LatestValid(name string) []api.Metric {
|
|
mtrs.mux.RLock()
|
|
defer mtrs.mux.RUnlock()
|
|
|
|
byPeer, ok := mtrs.byName[name]
|
|
if !ok {
|
|
return []api.Metric{}
|
|
}
|
|
|
|
metrics := make([]api.Metric, 0, len(byPeer))
|
|
for _, window := range byPeer {
|
|
m, err := window.Latest()
|
|
// TODO(ajl): for accrual, does it matter if a ping has expired?
|
|
if err != nil || m.Discard() {
|
|
continue
|
|
}
|
|
metrics = append(metrics, m)
|
|
}
|
|
|
|
sortedMetrics := api.MetricSlice(metrics)
|
|
sort.Stable(sortedMetrics)
|
|
return sortedMetrics
|
|
}
|
|
|
|
// AllMetrics returns the latest metrics for all peers and metrics types. It
|
|
// may return expired metrics.
|
|
func (mtrs *Store) AllMetrics() []api.Metric {
|
|
mtrs.mux.RLock()
|
|
defer mtrs.mux.RUnlock()
|
|
|
|
result := make([]api.Metric, 0)
|
|
|
|
for _, byPeer := range mtrs.byName {
|
|
for _, window := range byPeer {
|
|
metric, err := window.Latest()
|
|
if err != nil || !metric.Valid {
|
|
continue
|
|
}
|
|
result = append(result, metric)
|
|
}
|
|
}
|
|
return result
|
|
}
|
|
|
|
// PeerMetrics returns the latest metrics for a given peer ID for
|
|
// all known metrics types. It may return expired metrics.
|
|
func (mtrs *Store) PeerMetrics(pid peer.ID) []api.Metric {
|
|
mtrs.mux.RLock()
|
|
defer mtrs.mux.RUnlock()
|
|
|
|
result := make([]api.Metric, 0)
|
|
|
|
for _, byPeer := range mtrs.byName {
|
|
window, ok := byPeer[pid]
|
|
if !ok {
|
|
continue
|
|
}
|
|
metric, err := window.Latest()
|
|
if err != nil || !metric.Valid {
|
|
continue
|
|
}
|
|
result = append(result, metric)
|
|
}
|
|
return result
|
|
}
|
|
|
|
// PeerMetricAll returns all of a particular metrics for a
|
|
// particular peer.
|
|
func (mtrs *Store) PeerMetricAll(name string, pid peer.ID) []api.Metric {
|
|
mtrs.mux.RLock()
|
|
defer mtrs.mux.RUnlock()
|
|
|
|
byPeer, ok := mtrs.byName[name]
|
|
if !ok {
|
|
return nil
|
|
}
|
|
|
|
window, ok := byPeer[pid]
|
|
if !ok {
|
|
return nil
|
|
}
|
|
ms := window.All()
|
|
return ms
|
|
}
|
|
|
|
// PeerLatest returns the latest of a particular metric for a
|
|
// particular peer. It may return an expired metric.
|
|
func (mtrs *Store) PeerLatest(name string, pid peer.ID) api.Metric {
|
|
mtrs.mux.RLock()
|
|
defer mtrs.mux.RUnlock()
|
|
|
|
byPeer, ok := mtrs.byName[name]
|
|
if !ok {
|
|
return api.Metric{}
|
|
}
|
|
|
|
window, ok := byPeer[pid]
|
|
if !ok {
|
|
return api.Metric{}
|
|
}
|
|
m, err := window.Latest()
|
|
if err != nil {
|
|
// ignoring error, as nil metric is indicative enough
|
|
return api.Metric{}
|
|
}
|
|
return m
|
|
}
|
|
|
|
// MetricNames returns all the known metric names
|
|
func (mtrs *Store) MetricNames() []string {
|
|
mtrs.mux.RLock()
|
|
defer mtrs.mux.RUnlock()
|
|
|
|
list := make([]string, 0, len(mtrs.byName))
|
|
for k := range mtrs.byName {
|
|
list = append(list, k)
|
|
}
|
|
return list
|
|
}
|