[#1422] multinet: Add metrics
Signed-off-by: Dmitrii Stepanov <d.stepanov@yadro.com>
This commit is contained in:
parent
2d064d0bd8
commit
c0a2f20eee
9 changed files with 93 additions and 6 deletions
|
@ -764,7 +764,9 @@ func initShared(appCfg *config.Config, key *keys.PrivateKey, netState *networkSt
|
|||
persistate, err := state.NewPersistentStorage(nodeconfig.PersistentState(appCfg).Path())
|
||||
fatalOnErr(err)
|
||||
|
||||
ds, err := internalNet.NewDialerSource(internalNetConfig(appCfg))
|
||||
nodeMetrics := metrics.NewNodeMetrics()
|
||||
|
||||
ds, err := internalNet.NewDialerSource(internalNetConfig(appCfg, nodeMetrics.MultinetMetrics()))
|
||||
fatalOnErr(err)
|
||||
|
||||
cacheOpts := cache.ClientCacheOpts{
|
||||
|
@ -785,17 +787,18 @@ func initShared(appCfg *config.Config, key *keys.PrivateKey, netState *networkSt
|
|||
bgClientCache: cache.NewSDKClientCache(cacheOpts),
|
||||
putClientCache: cache.NewSDKClientCache(cacheOpts),
|
||||
persistate: persistate,
|
||||
metricsCollector: metrics.NewNodeMetrics(),
|
||||
metricsCollector: nodeMetrics,
|
||||
dialerSource: ds,
|
||||
}
|
||||
}
|
||||
|
||||
func internalNetConfig(appCfg *config.Config) internalNet.Config {
|
||||
func internalNetConfig(appCfg *config.Config, m metrics.MultinetMetrics) internalNet.Config {
|
||||
result := internalNet.Config{
|
||||
Enabled: multinet.Enabled(appCfg),
|
||||
Balancer: multinet.Balancer(appCfg),
|
||||
Restrict: multinet.Restrict(appCfg),
|
||||
FallbackDelay: multinet.FallbackDelay(appCfg),
|
||||
Metrics: m,
|
||||
}
|
||||
sn := multinet.Subnets(appCfg)
|
||||
for _, s := range sn {
|
||||
|
@ -1362,7 +1365,7 @@ func (c *cfg) reloadConfig(ctx context.Context) {
|
|||
}
|
||||
}
|
||||
|
||||
if err := c.dialerSource.Update(internalNetConfig(c.appCfg)); err != nil {
|
||||
if err := c.dialerSource.Update(internalNetConfig(c.appCfg, c.metricsCollector.MultinetMetrics())); err != nil {
|
||||
c.log.Error(logs.FailedToUpdateMultinetConfiguration, zap.Error(err))
|
||||
return
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@ const (
|
|||
grpcServerSubsystem = "grpc_server"
|
||||
policerSubsystem = "policer"
|
||||
commonCacheSubsystem = "common_cache"
|
||||
multinetSubsystem = "multinet"
|
||||
|
||||
successLabel = "success"
|
||||
shardIDLabel = "shard_id"
|
||||
|
@ -41,6 +42,7 @@ const (
|
|||
endpointLabel = "endpoint"
|
||||
hitLabel = "hit"
|
||||
cacheLabel = "cache"
|
||||
sourceIPLabel = "source_ip"
|
||||
|
||||
readWriteMode = "READ_WRITE"
|
||||
readOnlyMode = "READ_ONLY"
|
||||
|
|
|
@ -17,6 +17,7 @@ type InnerRingServiceMetrics struct {
|
|||
eventDuration *prometheus.HistogramVec
|
||||
morphCacheMetrics *morphCacheMetrics
|
||||
logMetrics logger.LogMetrics
|
||||
multinet *multinetMetrics
|
||||
// nolint: unused
|
||||
appInfo *ApplicationInfo
|
||||
}
|
||||
|
@ -51,6 +52,7 @@ func NewInnerRingMetrics() *InnerRingServiceMetrics {
|
|||
morphCacheMetrics: newMorphCacheMetrics(innerRingNamespace),
|
||||
appInfo: NewApplicationInfo(misc.Version),
|
||||
logMetrics: logger.NewLogMetrics(innerRingNamespace),
|
||||
multinet: newMultinetMetrics(innerRingNamespace),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -78,3 +80,7 @@ func (m *InnerRingServiceMetrics) MorphCacheMetrics() MorphCacheMetrics {
|
|||
func (m *InnerRingServiceMetrics) LogMetrics() logger.LogMetrics {
|
||||
return m.logMetrics
|
||||
}
|
||||
|
||||
func (m *InnerRingServiceMetrics) Multinet() MultinetMetrics {
|
||||
return m.multinet
|
||||
}
|
||||
|
|
35
internal/metrics/multinet.go
Normal file
35
internal/metrics/multinet.go
Normal file
|
@ -0,0 +1,35 @@
|
|||
package metrics
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
|
||||
"git.frostfs.info/TrueCloudLab/frostfs-observability/metrics"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
type multinetMetrics struct {
|
||||
dials *prometheus.GaugeVec
|
||||
}
|
||||
|
||||
type MultinetMetrics interface {
|
||||
Dial(sourceIP string, success bool)
|
||||
}
|
||||
|
||||
func newMultinetMetrics(ns string) *multinetMetrics {
|
||||
return &multinetMetrics{
|
||||
dials: metrics.NewGaugeVec(
|
||||
prometheus.GaugeOpts{
|
||||
Namespace: ns,
|
||||
Subsystem: multinetSubsystem,
|
||||
Name: "dial_count",
|
||||
Help: "Dials count performed by multinet",
|
||||
}, []string{sourceIPLabel, successLabel}),
|
||||
}
|
||||
}
|
||||
|
||||
func (m *multinetMetrics) Dial(sourceIP string, success bool) {
|
||||
m.dials.With(prometheus.Labels{
|
||||
sourceIPLabel: sourceIP,
|
||||
successLabel: strconv.FormatBool(success),
|
||||
}).Inc()
|
||||
}
|
|
@ -25,6 +25,7 @@ type NodeMetrics struct {
|
|||
morphClient *morphClientMetrics
|
||||
morphCache *morphCacheMetrics
|
||||
log logger.LogMetrics
|
||||
multinet *multinetMetrics
|
||||
// nolint: unused
|
||||
appInfo *ApplicationInfo
|
||||
}
|
||||
|
@ -53,6 +54,7 @@ func NewNodeMetrics() *NodeMetrics {
|
|||
morphCache: newMorphCacheMetrics(namespace),
|
||||
log: logger.NewLogMetrics(namespace),
|
||||
appInfo: NewApplicationInfo(misc.Version),
|
||||
multinet: newMultinetMetrics(namespace),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -120,3 +122,7 @@ func (m *NodeMetrics) MorphCacheMetrics() MorphCacheMetrics {
|
|||
func (m *NodeMetrics) LogMetrics() logger.LogMetrics {
|
||||
return m.log
|
||||
}
|
||||
|
||||
func (m *NodeMetrics) MultinetMetrics() MultinetMetrics {
|
||||
return m.multinet
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ import (
|
|||
"slices"
|
||||
"time"
|
||||
|
||||
"git.frostfs.info/TrueCloudLab/frostfs-node/internal/metrics"
|
||||
"git.frostfs.info/TrueCloudLab/multinet"
|
||||
)
|
||||
|
||||
|
@ -23,6 +24,7 @@ type Config struct {
|
|||
Balancer string
|
||||
Restrict bool
|
||||
FallbackDelay time.Duration
|
||||
Metrics metrics.MultinetMetrics
|
||||
}
|
||||
|
||||
func (c Config) toMultinetConfig() (multinet.Config, error) {
|
||||
|
@ -52,6 +54,7 @@ func (c Config) toMultinetConfig() (multinet.Config, error) {
|
|||
Restrict: c.Restrict,
|
||||
FallbackDelay: c.FallbackDelay,
|
||||
Dialer: newDefaulDialer(),
|
||||
EventHandler: newEventHandler(c.Metrics),
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
|
29
internal/net/event_handler.go
Normal file
29
internal/net/event_handler.go
Normal file
|
@ -0,0 +1,29 @@
|
|||
package net
|
||||
|
||||
import (
|
||||
"net"
|
||||
|
||||
"git.frostfs.info/TrueCloudLab/frostfs-node/internal/metrics"
|
||||
"git.frostfs.info/TrueCloudLab/multinet"
|
||||
)
|
||||
|
||||
var _ multinet.EventHandler = (*metricsEventHandler)(nil)
|
||||
|
||||
type metricsEventHandler struct {
|
||||
m metrics.MultinetMetrics
|
||||
}
|
||||
|
||||
func (m *metricsEventHandler) DialPerformed(sourceIP net.Addr, _ string, _ string, err error) {
|
||||
sourceIPString := "undefined"
|
||||
if sourceIP != nil {
|
||||
sourceIPString = sourceIP.Network() + "://" + sourceIP.String()
|
||||
}
|
||||
m.m.Dial(sourceIPString, err == nil)
|
||||
}
|
||||
|
||||
func newEventHandler(m metrics.MultinetMetrics) multinet.EventHandler {
|
||||
if m == nil {
|
||||
return nil
|
||||
}
|
||||
return &metricsEventHandler{m: m}
|
||||
}
|
|
@ -463,6 +463,7 @@ func (s *Server) initMorph(ctx context.Context, cfg *viper.Viper, errChan chan<-
|
|||
name: morphPrefix,
|
||||
from: fromSideChainBlock,
|
||||
morphCacheMetric: s.irMetrics.MorphCacheMetrics(),
|
||||
multinetMetrics: s.irMetrics.Multinet(),
|
||||
}
|
||||
|
||||
// create morph client
|
||||
|
|
|
@ -117,6 +117,7 @@ type (
|
|||
sgn *transaction.Signer
|
||||
from uint32 // block height
|
||||
morphCacheMetric metrics.MorphCacheMetrics
|
||||
multinetMetrics metrics.MultinetMetrics
|
||||
}
|
||||
)
|
||||
|
||||
|
@ -487,7 +488,7 @@ func createClient(ctx context.Context, p *chainParams, errChan chan<- error) (*c
|
|||
return nil, fmt.Errorf("%s chain client endpoints not provided", p.name)
|
||||
}
|
||||
|
||||
nc := parseMultinetConfig(p.cfg)
|
||||
nc := parseMultinetConfig(p.cfg, p.multinetMetrics)
|
||||
ds, err := internalNet.NewDialerSource(nc)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("dialer source: %w", err)
|
||||
|
@ -550,12 +551,13 @@ func parseWalletAddressesFromStrings(wallets []string) ([]util.Uint160, error) {
|
|||
return extraWallets, nil
|
||||
}
|
||||
|
||||
func parseMultinetConfig(cfg *viper.Viper) internalNet.Config {
|
||||
func parseMultinetConfig(cfg *viper.Viper, m metrics.MultinetMetrics) internalNet.Config {
|
||||
nc := internalNet.Config{
|
||||
Enabled: cfg.GetBool("multinet.enabled"),
|
||||
Balancer: cfg.GetString("multinet.balancer"),
|
||||
Restrict: cfg.GetBool("multinet.restrict"),
|
||||
FallbackDelay: cfg.GetDuration("multinet.fallback_delay"),
|
||||
Metrics: m,
|
||||
}
|
||||
for i := 0; ; i++ {
|
||||
mask := cfg.GetString(fmt.Sprintf("multinet.subnets.%d.mask", i))
|
||||
|
|
Loading…
Reference in a new issue