mirror of
https://github.com/ipfs/kubo.git
synced 2025-05-17 15:06:47 +08:00
refactor(rcmgr): use default libp2p rcmgr metrics (#9947)
Co-authored-by: Marcin Rataj <lidel@lidel.org>
This commit is contained in:
@ -7,6 +7,10 @@ import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/ipfs/kubo/config"
|
||||
"github.com/ipfs/kubo/core/node/helpers"
|
||||
"github.com/ipfs/kubo/repo"
|
||||
|
||||
"github.com/benbjohnson/clock"
|
||||
logging "github.com/ipfs/go-log/v2"
|
||||
"github.com/libp2p/go-libp2p"
|
||||
@ -16,10 +20,6 @@ import (
|
||||
rcmgr "github.com/libp2p/go-libp2p/p2p/host/resource-manager"
|
||||
"github.com/multiformats/go-multiaddr"
|
||||
"go.uber.org/fx"
|
||||
|
||||
"github.com/ipfs/kubo/config"
|
||||
"github.com/ipfs/kubo/core/node/helpers"
|
||||
"github.com/ipfs/kubo/repo"
|
||||
)
|
||||
|
||||
var rcmgrLogger = logging.Logger("rcmgr")
|
||||
@ -70,7 +70,6 @@ filled in with autocomputed defaults.`)
|
||||
}
|
||||
|
||||
ropts := []rcmgr.Option{
|
||||
rcmgr.WithMetrics(createRcmgrMetrics()),
|
||||
rcmgr.WithTraceReporter(str),
|
||||
rcmgr.WithLimitPerSubnet(
|
||||
nil,
|
||||
|
@ -1,251 +0,0 @@
|
||||
package libp2p
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"strconv"
|
||||
|
||||
"github.com/libp2p/go-libp2p/core/network"
|
||||
"github.com/libp2p/go-libp2p/core/peer"
|
||||
"github.com/libp2p/go-libp2p/core/protocol"
|
||||
rcmgr "github.com/libp2p/go-libp2p/p2p/host/resource-manager"
|
||||
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
func mustRegister(c prometheus.Collector) {
|
||||
err := prometheus.Register(c)
|
||||
are := prometheus.AlreadyRegisteredError{}
|
||||
if errors.As(err, &are) {
|
||||
return
|
||||
}
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func createRcmgrMetrics() rcmgr.MetricsReporter {
|
||||
const (
|
||||
direction = "direction"
|
||||
usesFD = "usesFD"
|
||||
protocol = "protocol"
|
||||
service = "service"
|
||||
)
|
||||
|
||||
connAllowed := prometheus.NewCounterVec(
|
||||
prometheus.CounterOpts{
|
||||
Name: "libp2p_rcmgr_conns_allowed_total",
|
||||
Help: "allowed connections",
|
||||
},
|
||||
[]string{direction, usesFD},
|
||||
)
|
||||
mustRegister(connAllowed)
|
||||
|
||||
connBlocked := prometheus.NewCounterVec(
|
||||
prometheus.CounterOpts{
|
||||
Name: "libp2p_rcmgr_conns_blocked_total",
|
||||
Help: "blocked connections",
|
||||
},
|
||||
[]string{direction, usesFD},
|
||||
)
|
||||
mustRegister(connBlocked)
|
||||
|
||||
streamAllowed := prometheus.NewCounterVec(
|
||||
prometheus.CounterOpts{
|
||||
Name: "libp2p_rcmgr_streams_allowed_total",
|
||||
Help: "allowed streams",
|
||||
},
|
||||
[]string{direction},
|
||||
)
|
||||
mustRegister(streamAllowed)
|
||||
|
||||
streamBlocked := prometheus.NewCounterVec(
|
||||
prometheus.CounterOpts{
|
||||
Name: "libp2p_rcmgr_streams_blocked_total",
|
||||
Help: "blocked streams",
|
||||
},
|
||||
[]string{direction},
|
||||
)
|
||||
mustRegister(streamBlocked)
|
||||
|
||||
peerAllowed := prometheus.NewCounter(prometheus.CounterOpts{
|
||||
Name: "libp2p_rcmgr_peers_allowed_total",
|
||||
Help: "allowed peers",
|
||||
})
|
||||
mustRegister(peerAllowed)
|
||||
|
||||
peerBlocked := prometheus.NewCounter(prometheus.CounterOpts{
|
||||
Name: "libp2p_rcmgr_peer_blocked_total",
|
||||
Help: "blocked peers",
|
||||
})
|
||||
mustRegister(peerBlocked)
|
||||
|
||||
protocolAllowed := prometheus.NewCounterVec(
|
||||
prometheus.CounterOpts{
|
||||
Name: "libp2p_rcmgr_protocols_allowed_total",
|
||||
Help: "allowed streams attached to a protocol",
|
||||
},
|
||||
[]string{protocol},
|
||||
)
|
||||
mustRegister(protocolAllowed)
|
||||
|
||||
protocolBlocked := prometheus.NewCounterVec(
|
||||
prometheus.CounterOpts{
|
||||
Name: "libp2p_rcmgr_protocols_blocked_total",
|
||||
Help: "blocked streams attached to a protocol",
|
||||
},
|
||||
[]string{protocol},
|
||||
)
|
||||
mustRegister(protocolBlocked)
|
||||
|
||||
protocolPeerBlocked := prometheus.NewCounterVec(
|
||||
prometheus.CounterOpts{
|
||||
Name: "libp2p_rcmgr_protocols_for_peer_blocked_total",
|
||||
Help: "blocked streams attached to a protocol for a specific peer",
|
||||
},
|
||||
[]string{protocol},
|
||||
)
|
||||
mustRegister(protocolPeerBlocked)
|
||||
|
||||
serviceAllowed := prometheus.NewCounterVec(
|
||||
prometheus.CounterOpts{
|
||||
Name: "libp2p_rcmgr_services_allowed_total",
|
||||
Help: "allowed streams attached to a service",
|
||||
},
|
||||
[]string{service},
|
||||
)
|
||||
mustRegister(serviceAllowed)
|
||||
|
||||
serviceBlocked := prometheus.NewCounterVec(
|
||||
prometheus.CounterOpts{
|
||||
Name: "libp2p_rcmgr_services_blocked_total",
|
||||
Help: "blocked streams attached to a service",
|
||||
},
|
||||
[]string{service},
|
||||
)
|
||||
mustRegister(serviceBlocked)
|
||||
|
||||
servicePeerBlocked := prometheus.NewCounterVec(
|
||||
prometheus.CounterOpts{
|
||||
Name: "libp2p_rcmgr_service_for_peer_blocked_total",
|
||||
Help: "blocked streams attached to a service for a specific peer",
|
||||
},
|
||||
[]string{service},
|
||||
)
|
||||
mustRegister(servicePeerBlocked)
|
||||
|
||||
memoryAllowed := prometheus.NewCounter(prometheus.CounterOpts{
|
||||
Name: "libp2p_rcmgr_memory_allocations_allowed_total",
|
||||
Help: "allowed memory allocations",
|
||||
})
|
||||
mustRegister(memoryAllowed)
|
||||
|
||||
memoryBlocked := prometheus.NewCounter(prometheus.CounterOpts{
|
||||
Name: "libp2p_rcmgr_memory_allocations_blocked_total",
|
||||
Help: "blocked memory allocations",
|
||||
})
|
||||
mustRegister(memoryBlocked)
|
||||
|
||||
return rcmgrMetrics{
|
||||
connAllowed,
|
||||
connBlocked,
|
||||
streamAllowed,
|
||||
streamBlocked,
|
||||
peerAllowed,
|
||||
peerBlocked,
|
||||
protocolAllowed,
|
||||
protocolBlocked,
|
||||
protocolPeerBlocked,
|
||||
serviceAllowed,
|
||||
serviceBlocked,
|
||||
servicePeerBlocked,
|
||||
memoryAllowed,
|
||||
memoryBlocked,
|
||||
}
|
||||
}
|
||||
|
||||
// Failsafe to ensure interface from go-libp2p-resource-manager is implemented
|
||||
var _ rcmgr.MetricsReporter = rcmgrMetrics{}
|
||||
|
||||
type rcmgrMetrics struct {
|
||||
connAllowed *prometheus.CounterVec
|
||||
connBlocked *prometheus.CounterVec
|
||||
streamAllowed *prometheus.CounterVec
|
||||
streamBlocked *prometheus.CounterVec
|
||||
peerAllowed prometheus.Counter
|
||||
peerBlocked prometheus.Counter
|
||||
protocolAllowed *prometheus.CounterVec
|
||||
protocolBlocked *prometheus.CounterVec
|
||||
protocolPeerBlocked *prometheus.CounterVec
|
||||
serviceAllowed *prometheus.CounterVec
|
||||
serviceBlocked *prometheus.CounterVec
|
||||
servicePeerBlocked *prometheus.CounterVec
|
||||
memoryAllowed prometheus.Counter
|
||||
memoryBlocked prometheus.Counter
|
||||
}
|
||||
|
||||
func getDirection(d network.Direction) string {
|
||||
switch d {
|
||||
default:
|
||||
return ""
|
||||
case network.DirInbound:
|
||||
return "inbound"
|
||||
case network.DirOutbound:
|
||||
return "outbound"
|
||||
}
|
||||
}
|
||||
|
||||
func (r rcmgrMetrics) AllowConn(dir network.Direction, usefd bool) {
|
||||
r.connAllowed.WithLabelValues(getDirection(dir), strconv.FormatBool(usefd)).Inc()
|
||||
}
|
||||
|
||||
func (r rcmgrMetrics) BlockConn(dir network.Direction, usefd bool) {
|
||||
r.connBlocked.WithLabelValues(getDirection(dir), strconv.FormatBool(usefd)).Inc()
|
||||
}
|
||||
|
||||
func (r rcmgrMetrics) AllowStream(_ peer.ID, dir network.Direction) {
|
||||
r.streamAllowed.WithLabelValues(getDirection(dir)).Inc()
|
||||
}
|
||||
|
||||
func (r rcmgrMetrics) BlockStream(_ peer.ID, dir network.Direction) {
|
||||
r.streamBlocked.WithLabelValues(getDirection(dir)).Inc()
|
||||
}
|
||||
|
||||
func (r rcmgrMetrics) AllowPeer(_ peer.ID) {
|
||||
r.peerAllowed.Inc()
|
||||
}
|
||||
|
||||
func (r rcmgrMetrics) BlockPeer(_ peer.ID) {
|
||||
r.peerBlocked.Inc()
|
||||
}
|
||||
|
||||
func (r rcmgrMetrics) AllowProtocol(proto protocol.ID) {
|
||||
r.protocolAllowed.WithLabelValues(string(proto)).Inc()
|
||||
}
|
||||
|
||||
func (r rcmgrMetrics) BlockProtocol(proto protocol.ID) {
|
||||
r.protocolBlocked.WithLabelValues(string(proto)).Inc()
|
||||
}
|
||||
|
||||
func (r rcmgrMetrics) BlockProtocolPeer(proto protocol.ID, _ peer.ID) {
|
||||
r.protocolPeerBlocked.WithLabelValues(string(proto)).Inc()
|
||||
}
|
||||
|
||||
func (r rcmgrMetrics) AllowService(svc string) {
|
||||
r.serviceAllowed.WithLabelValues(svc).Inc()
|
||||
}
|
||||
|
||||
func (r rcmgrMetrics) BlockService(svc string) {
|
||||
r.serviceBlocked.WithLabelValues(svc).Inc()
|
||||
}
|
||||
|
||||
func (r rcmgrMetrics) BlockServicePeer(svc string, _ peer.ID) {
|
||||
r.servicePeerBlocked.WithLabelValues(svc).Inc()
|
||||
}
|
||||
|
||||
func (r rcmgrMetrics) AllowMemory(_ int) {
|
||||
r.memoryAllowed.Inc()
|
||||
}
|
||||
|
||||
func (r rcmgrMetrics) BlockMemory(_ int) {
|
||||
r.memoryBlocked.Inc()
|
||||
}
|
@ -18,6 +18,12 @@
|
||||
|
||||
This release includes some refactorings and improvements affecting Bitswap which should improve reliability. One of the changes affects blocks providing. Previously, the bitswap layer took care itself of announcing new blocks -added or received- with the configured provider (i.e. DHT). This bypassed the "Reprovider", that is, the system that manages precisely "providing" the blocks stored by Kubo. The Reprovider knows how to take advantage of the [AcceleratedDHTClient](https://github.com/ipfs/kubo/blob/master/docs/config.md#routingaccelerateddhtclient), is able to handle priorities, logs statistics and is able to resume on daemon reboot where it left off. From now on, Bitswap will not be doing any providing on-the-side and all announcements are managed by the reprovider. In some cases, when the reproviding queue is full with other elements, this may cause additional delays, but more likely this will result in improved block-providing behaviour overall.
|
||||
|
||||
#### Using default `libp2p_rcmgr` metrics
|
||||
|
||||
Bespoke rcmgr metrics [were removed](https://github.com/ipfs/kubo/pull/9947), Kubo now exposes only the default `libp2p_rcmgr` metrics from go-libp2p.
|
||||
This makes it easier to compare Kubo with custom implementations based on go-libp2p.
|
||||
If you depended on removed ones, please fill an issue to add them to the upstream [go-libp2p](https://github.com/libp2p/go-libp2p).
|
||||
|
||||
#### 📦️ Dependency updates
|
||||
|
||||
- update `boxo` to [v0.24.TODO](https://github.com/ipfs/boxo/releases/tag/v0.24.TODO)
|
||||
|
@ -1,4 +0,0 @@
|
||||
libp2p_rcmgr_memory_allocations_allowed_total
|
||||
libp2p_rcmgr_memory_allocations_blocked_total
|
||||
libp2p_rcmgr_peer_blocked_total
|
||||
libp2p_rcmgr_peers_allowed_total
|
||||
|
Reference in New Issue
Block a user