mirror of
https://github.com/netbirdio/netbird.git
synced 2024-11-21 23:53:14 +01:00
[management] add metrics to network map diff (#2811)
This commit is contained in:
parent
a0cdb58303
commit
729bcf2b01
@ -18,6 +18,7 @@ type UpdateChannelMetrics struct {
|
|||||||
getAllConnectedPeersDurationMicro metric.Int64Histogram
|
getAllConnectedPeersDurationMicro metric.Int64Histogram
|
||||||
getAllConnectedPeers metric.Int64Histogram
|
getAllConnectedPeers metric.Int64Histogram
|
||||||
hasChannelDurationMicro metric.Int64Histogram
|
hasChannelDurationMicro metric.Int64Histogram
|
||||||
|
networkMapDiffDurationMicro metric.Int64Histogram
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,6 +64,11 @@ func NewUpdateChannelMetrics(ctx context.Context, meter metric.Meter) (*UpdateCh
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
networkMapDiffDurationMicro, err := meter.Int64Histogram("management.updatechannel.networkmap.diff.duration.micro")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
return &UpdateChannelMetrics{
|
return &UpdateChannelMetrics{
|
||||||
createChannelDurationMicro: createChannelDurationMicro,
|
createChannelDurationMicro: createChannelDurationMicro,
|
||||||
closeChannelDurationMicro: closeChannelDurationMicro,
|
closeChannelDurationMicro: closeChannelDurationMicro,
|
||||||
@ -72,6 +78,7 @@ func NewUpdateChannelMetrics(ctx context.Context, meter metric.Meter) (*UpdateCh
|
|||||||
getAllConnectedPeersDurationMicro: getAllConnectedPeersDurationMicro,
|
getAllConnectedPeersDurationMicro: getAllConnectedPeersDurationMicro,
|
||||||
getAllConnectedPeers: getAllConnectedPeers,
|
getAllConnectedPeers: getAllConnectedPeers,
|
||||||
hasChannelDurationMicro: hasChannelDurationMicro,
|
hasChannelDurationMicro: hasChannelDurationMicro,
|
||||||
|
networkMapDiffDurationMicro: networkMapDiffDurationMicro,
|
||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
@ -111,3 +118,8 @@ func (metrics *UpdateChannelMetrics) CountGetAllConnectedPeersDuration(duration
|
|||||||
func (metrics *UpdateChannelMetrics) CountHasChannelDuration(duration time.Duration) {
|
func (metrics *UpdateChannelMetrics) CountHasChannelDuration(duration time.Duration) {
|
||||||
metrics.hasChannelDurationMicro.Record(metrics.ctx, duration.Microseconds())
|
metrics.hasChannelDurationMicro.Record(metrics.ctx, duration.Microseconds())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CountNetworkMapDiffDurationMicro counts the duration of the NetworkMapDiff method
|
||||||
|
func (metrics *UpdateChannelMetrics) CountNetworkMapDiffDurationMicro(duration time.Duration) {
|
||||||
|
metrics.networkMapDiffDurationMicro.Record(metrics.ctx, duration.Microseconds())
|
||||||
|
}
|
||||||
|
@ -7,11 +7,11 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/netbirdio/netbird/management/server/differs"
|
|
||||||
"github.com/r3labs/diff/v3"
|
"github.com/r3labs/diff/v3"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
|
|
||||||
"github.com/netbirdio/netbird/management/proto"
|
"github.com/netbirdio/netbird/management/proto"
|
||||||
|
"github.com/netbirdio/netbird/management/server/differs"
|
||||||
"github.com/netbirdio/netbird/management/server/telemetry"
|
"github.com/netbirdio/netbird/management/server/telemetry"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -208,10 +208,10 @@ func (p *PeersUpdateManager) handlePeerMessageUpdate(ctx context.Context, peerID
|
|||||||
p.channelsMux.RUnlock()
|
p.channelsMux.RUnlock()
|
||||||
|
|
||||||
if lastSentUpdate != nil {
|
if lastSentUpdate != nil {
|
||||||
updated, err := isNewPeerUpdateMessage(ctx, lastSentUpdate, update)
|
updated, err := isNewPeerUpdateMessage(ctx, lastSentUpdate, update, p.metrics)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.WithContext(ctx).Errorf("error checking for SyncResponse updates: %v", err)
|
log.WithContext(ctx).Errorf("error checking for SyncResponse updates: %v", err)
|
||||||
return false
|
return true
|
||||||
}
|
}
|
||||||
if !updated {
|
if !updated {
|
||||||
log.WithContext(ctx).Debugf("peer %s network map is not updated, skip sending update", peerID)
|
log.WithContext(ctx).Debugf("peer %s network map is not updated, skip sending update", peerID)
|
||||||
@ -223,7 +223,9 @@ func (p *PeersUpdateManager) handlePeerMessageUpdate(ctx context.Context, peerID
|
|||||||
}
|
}
|
||||||
|
|
||||||
// isNewPeerUpdateMessage checks if the given current update message is a new update that should be sent.
|
// isNewPeerUpdateMessage checks if the given current update message is a new update that should be sent.
|
||||||
func isNewPeerUpdateMessage(ctx context.Context, lastSentUpdate, currUpdateToSend *UpdateMessage) (isNew bool, err error) {
|
func isNewPeerUpdateMessage(ctx context.Context, lastSentUpdate, currUpdateToSend *UpdateMessage, metric telemetry.AppMetrics) (isNew bool, err error) {
|
||||||
|
startTime := time.Now()
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
if r := recover(); r != nil {
|
if r := recover(); r != nil {
|
||||||
log.WithContext(ctx).Panicf("comparing peer update messages. Trace: %s", debug.Stack())
|
log.WithContext(ctx).Panicf("comparing peer update messages. Trace: %s", debug.Stack())
|
||||||
@ -258,6 +260,11 @@ func isNewPeerUpdateMessage(ctx context.Context, lastSentUpdate, currUpdateToSen
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return false, fmt.Errorf("failed to diff network map: %v", err)
|
return false, fmt.Errorf("failed to diff network map: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if metric != nil {
|
||||||
|
metric.UpdateChannelMetrics().CountNetworkMapDiffDurationMicro(time.Since(startTime))
|
||||||
|
}
|
||||||
|
|
||||||
return len(changelog) > 0, nil
|
return len(changelog) > 0, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,14 +7,16 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
||||||
nbdns "github.com/netbirdio/netbird/dns"
|
nbdns "github.com/netbirdio/netbird/dns"
|
||||||
"github.com/netbirdio/netbird/management/domain"
|
"github.com/netbirdio/netbird/management/domain"
|
||||||
"github.com/netbirdio/netbird/management/proto"
|
"github.com/netbirdio/netbird/management/proto"
|
||||||
nbpeer "github.com/netbirdio/netbird/management/server/peer"
|
nbpeer "github.com/netbirdio/netbird/management/server/peer"
|
||||||
"github.com/netbirdio/netbird/management/server/posture"
|
"github.com/netbirdio/netbird/management/server/posture"
|
||||||
|
"github.com/netbirdio/netbird/management/server/telemetry"
|
||||||
nbroute "github.com/netbirdio/netbird/route"
|
nbroute "github.com/netbirdio/netbird/route"
|
||||||
"github.com/netbirdio/netbird/util"
|
"github.com/netbirdio/netbird/util"
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// var peersUpdater *PeersUpdateManager
|
// var peersUpdater *PeersUpdateManager
|
||||||
@ -175,8 +177,12 @@ func TestHandlePeerMessageUpdate(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
|
metrics, err := telemetry.NewDefaultAppMetrics(context.Background())
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
p := NewPeersUpdateManager(nil)
|
p := NewPeersUpdateManager(metrics)
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
if tt.existingUpdate != nil {
|
if tt.existingUpdate != nil {
|
||||||
@ -194,7 +200,7 @@ func TestIsNewPeerUpdateMessage(t *testing.T) {
|
|||||||
newUpdateMessage1 := createMockUpdateMessage(t)
|
newUpdateMessage1 := createMockUpdateMessage(t)
|
||||||
newUpdateMessage2 := createMockUpdateMessage(t)
|
newUpdateMessage2 := createMockUpdateMessage(t)
|
||||||
|
|
||||||
message, err := isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage2)
|
message, err := isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage2, nil)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.False(t, message)
|
assert.False(t, message)
|
||||||
})
|
})
|
||||||
@ -205,7 +211,7 @@ func TestIsNewPeerUpdateMessage(t *testing.T) {
|
|||||||
|
|
||||||
newUpdateMessage2.Update.NetworkMap.Serial++
|
newUpdateMessage2.Update.NetworkMap.Serial++
|
||||||
|
|
||||||
message, err := isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage2)
|
message, err := isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage2, nil)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.False(t, message)
|
assert.False(t, message)
|
||||||
})
|
})
|
||||||
@ -217,7 +223,7 @@ func TestIsNewPeerUpdateMessage(t *testing.T) {
|
|||||||
newUpdateMessage2.NetworkMap.Routes[0].Network = netip.MustParsePrefix("1.1.1.1/32")
|
newUpdateMessage2.NetworkMap.Routes[0].Network = netip.MustParsePrefix("1.1.1.1/32")
|
||||||
newUpdateMessage2.Update.NetworkMap.Serial++
|
newUpdateMessage2.Update.NetworkMap.Serial++
|
||||||
|
|
||||||
message, err := isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage2)
|
message, err := isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage2, nil)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.True(t, message)
|
assert.True(t, message)
|
||||||
|
|
||||||
@ -230,7 +236,7 @@ func TestIsNewPeerUpdateMessage(t *testing.T) {
|
|||||||
newUpdateMessage2.NetworkMap.Routes[0].Groups = []string{"randomGroup1"}
|
newUpdateMessage2.NetworkMap.Routes[0].Groups = []string{"randomGroup1"}
|
||||||
newUpdateMessage2.Update.NetworkMap.Serial++
|
newUpdateMessage2.Update.NetworkMap.Serial++
|
||||||
|
|
||||||
message, err := isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage2)
|
message, err := isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage2, nil)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.True(t, message)
|
assert.True(t, message)
|
||||||
})
|
})
|
||||||
@ -249,7 +255,7 @@ func TestIsNewPeerUpdateMessage(t *testing.T) {
|
|||||||
newUpdateMessage2.NetworkMap.Peers = append(newUpdateMessage2.NetworkMap.Peers, newPeer)
|
newUpdateMessage2.NetworkMap.Peers = append(newUpdateMessage2.NetworkMap.Peers, newPeer)
|
||||||
newUpdateMessage2.Update.NetworkMap.Serial++
|
newUpdateMessage2.Update.NetworkMap.Serial++
|
||||||
|
|
||||||
message, err := isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage2)
|
message, err := isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage2, nil)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.True(t, message)
|
assert.True(t, message)
|
||||||
})
|
})
|
||||||
@ -259,14 +265,14 @@ func TestIsNewPeerUpdateMessage(t *testing.T) {
|
|||||||
|
|
||||||
newUpdateMessage2 := createMockUpdateMessage(t)
|
newUpdateMessage2 := createMockUpdateMessage(t)
|
||||||
newUpdateMessage2.Update.NetworkMap.Serial++
|
newUpdateMessage2.Update.NetworkMap.Serial++
|
||||||
message, err := isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage2)
|
message, err := isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage2, nil)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.False(t, message)
|
assert.False(t, message)
|
||||||
|
|
||||||
newUpdateMessage3 := createMockUpdateMessage(t)
|
newUpdateMessage3 := createMockUpdateMessage(t)
|
||||||
newUpdateMessage3.Update.Checks = []*proto.Checks{}
|
newUpdateMessage3.Update.Checks = []*proto.Checks{}
|
||||||
newUpdateMessage3.Update.NetworkMap.Serial++
|
newUpdateMessage3.Update.NetworkMap.Serial++
|
||||||
message, err = isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage3)
|
message, err = isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage3, nil)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.True(t, message)
|
assert.True(t, message)
|
||||||
|
|
||||||
@ -285,7 +291,7 @@ func TestIsNewPeerUpdateMessage(t *testing.T) {
|
|||||||
}
|
}
|
||||||
newUpdateMessage4.Update.Checks = []*proto.Checks{toProtocolCheck(check)}
|
newUpdateMessage4.Update.Checks = []*proto.Checks{toProtocolCheck(check)}
|
||||||
newUpdateMessage4.Update.NetworkMap.Serial++
|
newUpdateMessage4.Update.NetworkMap.Serial++
|
||||||
message, err = isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage4)
|
message, err = isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage4, nil)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.True(t, message)
|
assert.True(t, message)
|
||||||
|
|
||||||
@ -305,7 +311,7 @@ func TestIsNewPeerUpdateMessage(t *testing.T) {
|
|||||||
}
|
}
|
||||||
newUpdateMessage5.Update.Checks = []*proto.Checks{toProtocolCheck(check)}
|
newUpdateMessage5.Update.Checks = []*proto.Checks{toProtocolCheck(check)}
|
||||||
newUpdateMessage5.Update.NetworkMap.Serial++
|
newUpdateMessage5.Update.NetworkMap.Serial++
|
||||||
message, err = isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage5)
|
message, err = isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage5, nil)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.True(t, message)
|
assert.True(t, message)
|
||||||
})
|
})
|
||||||
@ -321,7 +327,7 @@ func TestIsNewPeerUpdateMessage(t *testing.T) {
|
|||||||
)
|
)
|
||||||
newUpdateMessage2.Update.NetworkMap.Serial++
|
newUpdateMessage2.Update.NetworkMap.Serial++
|
||||||
|
|
||||||
message, err := isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage2)
|
message, err := isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage2, nil)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.True(t, message)
|
assert.True(t, message)
|
||||||
})
|
})
|
||||||
@ -333,7 +339,7 @@ func TestIsNewPeerUpdateMessage(t *testing.T) {
|
|||||||
newUpdateMessage2.NetworkMap.Peers[0].IP = net.ParseIP("192.168.1.10")
|
newUpdateMessage2.NetworkMap.Peers[0].IP = net.ParseIP("192.168.1.10")
|
||||||
newUpdateMessage2.Update.NetworkMap.Serial++
|
newUpdateMessage2.Update.NetworkMap.Serial++
|
||||||
|
|
||||||
message, err := isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage2)
|
message, err := isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage2, nil)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.True(t, message)
|
assert.True(t, message)
|
||||||
})
|
})
|
||||||
@ -345,7 +351,7 @@ func TestIsNewPeerUpdateMessage(t *testing.T) {
|
|||||||
newUpdateMessage2.NetworkMap.FirewallRules[0].Port = "443"
|
newUpdateMessage2.NetworkMap.FirewallRules[0].Port = "443"
|
||||||
newUpdateMessage2.Update.NetworkMap.Serial++
|
newUpdateMessage2.Update.NetworkMap.Serial++
|
||||||
|
|
||||||
message, err := isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage2)
|
message, err := isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage2, nil)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.True(t, message)
|
assert.True(t, message)
|
||||||
})
|
})
|
||||||
@ -364,7 +370,7 @@ func TestIsNewPeerUpdateMessage(t *testing.T) {
|
|||||||
newUpdateMessage2.NetworkMap.FirewallRules = append(newUpdateMessage2.NetworkMap.FirewallRules, newRule)
|
newUpdateMessage2.NetworkMap.FirewallRules = append(newUpdateMessage2.NetworkMap.FirewallRules, newRule)
|
||||||
newUpdateMessage2.Update.NetworkMap.Serial++
|
newUpdateMessage2.Update.NetworkMap.Serial++
|
||||||
|
|
||||||
message, err := isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage2)
|
message, err := isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage2, nil)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.True(t, message)
|
assert.True(t, message)
|
||||||
})
|
})
|
||||||
@ -376,7 +382,7 @@ func TestIsNewPeerUpdateMessage(t *testing.T) {
|
|||||||
newUpdateMessage2.NetworkMap.DNSConfig.NameServerGroups[0].NameServers = make([]nbdns.NameServer, 0)
|
newUpdateMessage2.NetworkMap.DNSConfig.NameServerGroups[0].NameServers = make([]nbdns.NameServer, 0)
|
||||||
newUpdateMessage2.Update.NetworkMap.Serial++
|
newUpdateMessage2.Update.NetworkMap.Serial++
|
||||||
|
|
||||||
message, err := isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage2)
|
message, err := isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage2, nil)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.True(t, message)
|
assert.True(t, message)
|
||||||
})
|
})
|
||||||
@ -388,7 +394,7 @@ func TestIsNewPeerUpdateMessage(t *testing.T) {
|
|||||||
newUpdateMessage2.NetworkMap.DNSConfig.NameServerGroups[0].NameServers[0].IP = netip.MustParseAddr("8.8.4.4")
|
newUpdateMessage2.NetworkMap.DNSConfig.NameServerGroups[0].NameServers[0].IP = netip.MustParseAddr("8.8.4.4")
|
||||||
newUpdateMessage2.Update.NetworkMap.Serial++
|
newUpdateMessage2.Update.NetworkMap.Serial++
|
||||||
|
|
||||||
message, err := isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage2)
|
message, err := isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage2, nil)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.True(t, message)
|
assert.True(t, message)
|
||||||
})
|
})
|
||||||
@ -400,7 +406,7 @@ func TestIsNewPeerUpdateMessage(t *testing.T) {
|
|||||||
newUpdateMessage2.NetworkMap.DNSConfig.CustomZones[0].Records[0].RData = "100.64.0.2"
|
newUpdateMessage2.NetworkMap.DNSConfig.CustomZones[0].Records[0].RData = "100.64.0.2"
|
||||||
newUpdateMessage2.Update.NetworkMap.Serial++
|
newUpdateMessage2.Update.NetworkMap.Serial++
|
||||||
|
|
||||||
message, err := isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage2)
|
message, err := isNewPeerUpdateMessage(context.Background(), newUpdateMessage1, newUpdateMessage2, nil)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.True(t, message)
|
assert.True(t, message)
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user