[#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())
|
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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
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
|
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
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
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,
|
name: morphPrefix,
|
||||||
from: fromSideChainBlock,
|
from: fromSideChainBlock,
|
||||||
morphCacheMetric: s.irMetrics.MorphCacheMetrics(),
|
morphCacheMetric: s.irMetrics.MorphCacheMetrics(),
|
||||||
|
multinetMetrics: s.irMetrics.Multinet(),
|
||||||
}
|
}
|
||||||
|
|
||||||
// create morph client
|
// create morph client
|
||||||
|
|
|
@ -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))
|
||||||
|
|
Loading…
Reference in a new issue