[#1422] multinet: Add metrics

Signed-off-by: Dmitrii Stepanov <d.stepanov@yadro.com>
This commit is contained in:
Dmitrii Stepanov 2024-10-15 14:46:00 +03:00 committed by Dmitrii Stepanov
parent 2d064d0bd8
commit c0a2f20eee
9 changed files with 93 additions and 6 deletions

View file

@ -764,7 +764,9 @@ func initShared(appCfg *config.Config, key *keys.PrivateKey, netState *networkSt
persistate, err := state.NewPersistentStorage(nodeconfig.PersistentState(appCfg).Path()) persistate, err := state.NewPersistentStorage(nodeconfig.PersistentState(appCfg).Path())
fatalOnErr(err) fatalOnErr(err)
ds, err := internalNet.NewDialerSource(internalNetConfig(appCfg)) nodeMetrics := metrics.NewNodeMetrics()
ds, err := internalNet.NewDialerSource(internalNetConfig(appCfg, nodeMetrics.MultinetMetrics()))
fatalOnErr(err) fatalOnErr(err)
cacheOpts := cache.ClientCacheOpts{ cacheOpts := cache.ClientCacheOpts{
@ -785,17 +787,18 @@ func initShared(appCfg *config.Config, key *keys.PrivateKey, netState *networkSt
bgClientCache: cache.NewSDKClientCache(cacheOpts), bgClientCache: cache.NewSDKClientCache(cacheOpts),
putClientCache: cache.NewSDKClientCache(cacheOpts), putClientCache: cache.NewSDKClientCache(cacheOpts),
persistate: persistate, persistate: persistate,
metricsCollector: metrics.NewNodeMetrics(), metricsCollector: nodeMetrics,
dialerSource: ds, dialerSource: ds,
} }
} }
func internalNetConfig(appCfg *config.Config) internalNet.Config { func internalNetConfig(appCfg *config.Config, m metrics.MultinetMetrics) internalNet.Config {
result := internalNet.Config{ result := internalNet.Config{
Enabled: multinet.Enabled(appCfg), Enabled: multinet.Enabled(appCfg),
Balancer: multinet.Balancer(appCfg), Balancer: multinet.Balancer(appCfg),
Restrict: multinet.Restrict(appCfg), Restrict: multinet.Restrict(appCfg),
FallbackDelay: multinet.FallbackDelay(appCfg), FallbackDelay: multinet.FallbackDelay(appCfg),
Metrics: m,
} }
sn := multinet.Subnets(appCfg) sn := multinet.Subnets(appCfg)
for _, s := range sn { 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)) c.log.Error(logs.FailedToUpdateMultinetConfiguration, zap.Error(err))
return return
} }

View file

@ -22,6 +22,7 @@ const (
grpcServerSubsystem = "grpc_server" grpcServerSubsystem = "grpc_server"
policerSubsystem = "policer" policerSubsystem = "policer"
commonCacheSubsystem = "common_cache" commonCacheSubsystem = "common_cache"
multinetSubsystem = "multinet"
successLabel = "success" successLabel = "success"
shardIDLabel = "shard_id" shardIDLabel = "shard_id"
@ -41,6 +42,7 @@ const (
endpointLabel = "endpoint" endpointLabel = "endpoint"
hitLabel = "hit" hitLabel = "hit"
cacheLabel = "cache" cacheLabel = "cache"
sourceIPLabel = "source_ip"
readWriteMode = "READ_WRITE" readWriteMode = "READ_WRITE"
readOnlyMode = "READ_ONLY" readOnlyMode = "READ_ONLY"

View file

@ -17,6 +17,7 @@ type InnerRingServiceMetrics struct {
eventDuration *prometheus.HistogramVec eventDuration *prometheus.HistogramVec
morphCacheMetrics *morphCacheMetrics morphCacheMetrics *morphCacheMetrics
logMetrics logger.LogMetrics logMetrics logger.LogMetrics
multinet *multinetMetrics
// nolint: unused // nolint: unused
appInfo *ApplicationInfo appInfo *ApplicationInfo
} }
@ -51,6 +52,7 @@ func NewInnerRingMetrics() *InnerRingServiceMetrics {
morphCacheMetrics: newMorphCacheMetrics(innerRingNamespace), morphCacheMetrics: newMorphCacheMetrics(innerRingNamespace),
appInfo: NewApplicationInfo(misc.Version), appInfo: NewApplicationInfo(misc.Version),
logMetrics: logger.NewLogMetrics(innerRingNamespace), logMetrics: logger.NewLogMetrics(innerRingNamespace),
multinet: newMultinetMetrics(innerRingNamespace),
} }
} }
@ -78,3 +80,7 @@ func (m *InnerRingServiceMetrics) MorphCacheMetrics() MorphCacheMetrics {
func (m *InnerRingServiceMetrics) LogMetrics() logger.LogMetrics { func (m *InnerRingServiceMetrics) LogMetrics() logger.LogMetrics {
return m.logMetrics return m.logMetrics
} }
func (m *InnerRingServiceMetrics) Multinet() MultinetMetrics {
return m.multinet
}

View 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()
}

View file

@ -25,6 +25,7 @@ type NodeMetrics struct {
morphClient *morphClientMetrics morphClient *morphClientMetrics
morphCache *morphCacheMetrics morphCache *morphCacheMetrics
log logger.LogMetrics log logger.LogMetrics
multinet *multinetMetrics
// nolint: unused // nolint: unused
appInfo *ApplicationInfo appInfo *ApplicationInfo
} }
@ -53,6 +54,7 @@ func NewNodeMetrics() *NodeMetrics {
morphCache: newMorphCacheMetrics(namespace), morphCache: newMorphCacheMetrics(namespace),
log: logger.NewLogMetrics(namespace), log: logger.NewLogMetrics(namespace),
appInfo: NewApplicationInfo(misc.Version), appInfo: NewApplicationInfo(misc.Version),
multinet: newMultinetMetrics(namespace),
} }
} }
@ -120,3 +122,7 @@ func (m *NodeMetrics) MorphCacheMetrics() MorphCacheMetrics {
func (m *NodeMetrics) LogMetrics() logger.LogMetrics { func (m *NodeMetrics) LogMetrics() logger.LogMetrics {
return m.log return m.log
} }
func (m *NodeMetrics) MultinetMetrics() MultinetMetrics {
return m.multinet
}

View file

@ -7,6 +7,7 @@ import (
"slices" "slices"
"time" "time"
"git.frostfs.info/TrueCloudLab/frostfs-node/internal/metrics"
"git.frostfs.info/TrueCloudLab/multinet" "git.frostfs.info/TrueCloudLab/multinet"
) )
@ -23,6 +24,7 @@ type Config struct {
Balancer string Balancer string
Restrict bool Restrict bool
FallbackDelay time.Duration FallbackDelay time.Duration
Metrics metrics.MultinetMetrics
} }
func (c Config) toMultinetConfig() (multinet.Config, error) { func (c Config) toMultinetConfig() (multinet.Config, error) {
@ -52,6 +54,7 @@ func (c Config) toMultinetConfig() (multinet.Config, error) {
Restrict: c.Restrict, Restrict: c.Restrict,
FallbackDelay: c.FallbackDelay, FallbackDelay: c.FallbackDelay,
Dialer: newDefaulDialer(), Dialer: newDefaulDialer(),
EventHandler: newEventHandler(c.Metrics),
}, nil }, nil
} }

View 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}
}

View file

@ -463,6 +463,7 @@ func (s *Server) initMorph(ctx context.Context, cfg *viper.Viper, errChan chan<-
name: morphPrefix, name: morphPrefix,
from: fromSideChainBlock, from: fromSideChainBlock,
morphCacheMetric: s.irMetrics.MorphCacheMetrics(), morphCacheMetric: s.irMetrics.MorphCacheMetrics(),
multinetMetrics: s.irMetrics.Multinet(),
} }
// create morph client // create morph client

View file

@ -117,6 +117,7 @@ type (
sgn *transaction.Signer sgn *transaction.Signer
from uint32 // block height from uint32 // block height
morphCacheMetric metrics.MorphCacheMetrics 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) 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) ds, err := internalNet.NewDialerSource(nc)
if err != nil { if err != nil {
return nil, fmt.Errorf("dialer source: %w", err) return nil, fmt.Errorf("dialer source: %w", err)
@ -550,12 +551,13 @@ func parseWalletAddressesFromStrings(wallets []string) ([]util.Uint160, error) {
return extraWallets, nil return extraWallets, nil
} }
func parseMultinetConfig(cfg *viper.Viper) internalNet.Config { func parseMultinetConfig(cfg *viper.Viper, m metrics.MultinetMetrics) internalNet.Config {
nc := internalNet.Config{ nc := internalNet.Config{
Enabled: cfg.GetBool("multinet.enabled"), Enabled: cfg.GetBool("multinet.enabled"),
Balancer: cfg.GetString("multinet.balancer"), Balancer: cfg.GetString("multinet.balancer"),
Restrict: cfg.GetBool("multinet.restrict"), Restrict: cfg.GetBool("multinet.restrict"),
FallbackDelay: cfg.GetDuration("multinet.fallback_delay"), FallbackDelay: cfg.GetDuration("multinet.fallback_delay"),
Metrics: m,
} }
for i := 0; ; i++ { for i := 0; ; i++ {
mask := cfg.GetString(fmt.Sprintf("multinet.subnets.%d.mask", i)) mask := cfg.GetString(fmt.Sprintf("multinet.subnets.%d.mask", i))