Skip to content

Commit f90e0a8

Browse files
committed
feat: metric for max ipset members
1 parent 48ed7d6 commit f90e0a8

File tree

3 files changed

+184
-0
lines changed

3 files changed

+184
-0
lines changed

npm/metrics/ipsets_windows_test.go

+95
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package metrics
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/require"
7+
)
8+
9+
func TestMaxMembers(t *testing.T) {
10+
ResetIPSetEntries()
11+
// set1: 1, set2: 0
12+
AddEntryToIPSet("test-set1")
13+
assertMaxMembers(t, 1)
14+
// set1: 1, set2: 1
15+
AddEntryToIPSet("test-set2")
16+
assertMaxMembers(t, 1)
17+
// set1: 2, set2: 1
18+
AddEntryToIPSet("test-set1")
19+
assertMaxMembers(t, 2)
20+
// set1: 2, set2: 2
21+
AddEntryToIPSet("test-set2")
22+
assertMaxMembers(t, 2)
23+
// set1: 2, set2: 3
24+
AddEntryToIPSet("test-set2")
25+
assertMaxMembers(t, 3)
26+
// set1: 1, set2: 3
27+
RemoveEntryFromIPSet("test-set1")
28+
assertMaxMembers(t, 3)
29+
// set1: 2, set2: 3
30+
AddEntryToIPSet("test-set1")
31+
assertMaxMembers(t, 3)
32+
// set1: 2, set2: 2
33+
RemoveEntryFromIPSet("test-set2")
34+
assertMaxMembers(t, 2)
35+
// set1: 2, set2: 1
36+
RemoveEntryFromIPSet("test-set2")
37+
assertMaxMembers(t, 2)
38+
// set1: 2, set2: 0
39+
RemoveEntryFromIPSet("test-set2")
40+
assertMaxMembers(t, 2)
41+
// set1: 1, set2: 0
42+
RemoveEntryFromIPSet("test-set1")
43+
assertMaxMembers(t, 1)
44+
// set1: 0, set2: 0
45+
RemoveEntryFromIPSet("test-set1")
46+
assertMaxMembers(t, 0)
47+
// set1: 0, set2: 0
48+
RemoveEntryFromIPSet("test-set2")
49+
assertMaxMembers(t, 0)
50+
// set1: 1
51+
AddEntryToIPSet("test-set1")
52+
assertMaxMembers(t, 1)
53+
// set1: 0
54+
ResetIPSetEntries()
55+
assertMaxMembers(t, 0)
56+
57+
AddEntryToIPSet("test-set1")
58+
AddEntryToIPSet("test-set1")
59+
AddEntryToIPSet("test-set2")
60+
assertMaxMembers(t, 2)
61+
ResetIPSetEntries()
62+
assertMaxMembers(t, 0)
63+
64+
// set1: 1, set2: 0
65+
AddEntryToIPSet("test-set1")
66+
assertMaxMembers(t, 1)
67+
// set1: 1, set2: 1
68+
AddEntryToIPSet("test-set2")
69+
assertMaxMembers(t, 1)
70+
// set1: 2, set2: 1
71+
AddEntryToIPSet("test-set1")
72+
assertMaxMembers(t, 2)
73+
// set1: 0, set2: 2
74+
RemoveAllEntriesFromIPSet("test-set1")
75+
assertMaxMembers(t, 1)
76+
// set1: 0, set2: 0
77+
RemoveAllEntriesFromIPSet("test-set2")
78+
assertMaxMembers(t, 0)
79+
80+
AddEntryToIPSet("test-set1")
81+
AddEntryToIPSet("test-set1")
82+
AddEntryToIPSet("test-set2")
83+
AddEntryToIPSet("test-set2")
84+
assertMaxMembers(t, 2)
85+
RemoveAllEntriesFromIPSet("test-set1")
86+
assertMaxMembers(t, 2)
87+
}
88+
89+
func assertMaxMembers(t *testing.T, expectedVal int) {
90+
t.Helper()
91+
92+
val, err := getValue(maxIPSetMembers)
93+
require.Nil(t, err, "failed to get metric")
94+
require.Equal(t, expectedVal, val, "incorrect max members")
95+
}

npm/metrics/prometheus-metrics.go

+13
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ var (
113113
getNetworkFailures prometheus.Counter
114114
aclFailures *prometheus.CounterVec
115115
setPolicyFailures *prometheus.CounterVec
116+
maxIPSetMembers prometheus.Gauge
116117
)
117118

118119
type RegistryType string
@@ -166,6 +167,8 @@ func InitializeAll() {
166167
register(getNetworkFailures, "get_network_failure_total", NodeMetrics)
167168
register(aclFailures, "acl_failure_total", NodeMetrics)
168169
register(setPolicyFailures, "setpolicy_failure_total", NodeMetrics)
170+
// all new metrics should go on the node metrics URL
171+
register(maxIPSetMembers, "ipset_members_max", NodeMetrics)
169172
}
170173

171174
log.Logf("Finished initializing all Prometheus metrics")
@@ -195,6 +198,7 @@ func InitializeWindowsMetrics() {
195198
Buckets: prometheus.ExponentialBuckets(0.001, 2, 18), // 1 ms to ~2 minutes
196199
},
197200
)
201+
198202
getEndpointLatency = prometheus.NewHistogram(
199203
prometheus.HistogramOpts{
200204
Namespace: namespace,
@@ -287,6 +291,15 @@ func InitializeWindowsMetrics() {
287291
},
288292
[]string{operationLabel, isNestedLabel},
289293
)
294+
295+
maxIPSetMembers = prometheus.NewGauge(
296+
prometheus.GaugeOpts{
297+
Namespace: namespace,
298+
Name: "ipset_members_max",
299+
Subsystem: windowsPrefix,
300+
Help: "Maximum number of members in a single IPSet",
301+
},
302+
)
290303
}
291304

292305
// GetHandler returns the HTTP handler for the metrics endpoint

npm/pkg/dataplane/ipsets/ipsetmanager_windows_test.go

+76
Original file line numberDiff line numberDiff line change
@@ -563,7 +563,83 @@ func TestMetrics(t *testing.T) {
563563
deleteIPSetLatencyCalls: 1,
564564
deleteNestedLatencyCalls: 1,
565565
}.test(t)
566+
}
567+
568+
func TestMetricsMaxMember(t *testing.T) {
569+
hns := GetHNSFake(t, "azure")
570+
io := common.NewMockIOShimWithFakeHNS(hns)
571+
iMgr := NewIPSetManager(applyAlwaysCfg, io)
572+
573+
nsW := NewIPSetMetadata("w", Namespace)
574+
nsX := NewIPSetMetadata("x", Namespace)
575+
nsY := NewIPSetMetadata("y", Namespace)
576+
nsList1 := NewIPSetMetadata("list1", KeyLabelOfNamespace)
566577

578+
iMgr.CreateIPSets([]*IPSetMetadata{nsW, nsX, nsY, nsList1})
579+
count, err := metrics.MaxIPSetMembers()
580+
require.Nil(t, err, "failed to get metric")
581+
require.Equal(t, 0, count)
582+
583+
iMgr.AddToSets([]*IPSetMetadata{nsW, nsX}, "1.1.1.1", "pod1")
584+
count, err = metrics.MaxIPSetMembers()
585+
require.Nil(t, err, "failed to get metric")
586+
require.Equal(t, 1, count)
587+
588+
iMgr.AddToLists([]*IPSetMetadata{nsList1}, []*IPSetMetadata{nsW})
589+
count, err = metrics.MaxIPSetMembers()
590+
require.Nil(t, err, "failed to get metric")
591+
require.Equal(t, 1, count)
592+
593+
iMgr.AddToLists([]*IPSetMetadata{nsList1}, []*IPSetMetadata{nsX, nsY})
594+
count, err = metrics.MaxIPSetMembers()
595+
require.Nil(t, err, "failed to get metric")
596+
require.Equal(t, 3, count)
597+
598+
iMgr.AddToSets([]*IPSetMetadata{nsX}, "2.2.2.2", "pod2")
599+
count, err = metrics.MaxIPSetMembers()
600+
require.Nil(t, err, "failed to get metric")
601+
require.Equal(t, 3, count)
602+
603+
iMgr.RemoveFromList(nsList1, []*IPSetMetadata{nsX, nsY})
604+
count, err = metrics.MaxIPSetMembers()
605+
require.Nil(t, err, "failed to get metric")
606+
require.Equal(t, 2, count)
607+
608+
iMgr.AddToSets([]*IPSetMetadata{nsX}, "3.3.3.3", "pod3")
609+
count, err = metrics.MaxIPSetMembers()
610+
require.Nil(t, err, "failed to get metric")
611+
require.Equal(t, 3, count)
612+
613+
iMgr.AddToSets([]*IPSetMetadata{nsX}, "3.3.3.3", "pod3-changed")
614+
count, err = metrics.MaxIPSetMembers()
615+
require.Nil(t, err, "failed to get metric")
616+
require.Equal(t, 3, count)
617+
618+
iMgr.AddToSets([]*IPSetMetadata{nsX}, "4.4.4.4", "pod4")
619+
count, err = metrics.MaxIPSetMembers()
620+
require.Nil(t, err, "failed to get metric")
621+
require.Equal(t, 4, count)
622+
623+
iMgr.RemoveFromSets([]*IPSetMetadata{nsX}, "4.4.4.4", "pod4")
624+
count, err = metrics.MaxIPSetMembers()
625+
require.Nil(t, err, "failed to get metric")
626+
require.Equal(t, 3, count)
627+
628+
iMgr.RemoveFromSets([]*IPSetMetadata{nsX}, "3.3.3.3", "wrong-pod")
629+
count, err = metrics.MaxIPSetMembers()
630+
require.Nil(t, err, "failed to get metric")
631+
require.Equal(t, 3, count)
632+
633+
// can't delete this set
634+
iMgr.DeleteIPSet(nsX.GetPrefixName(), util.SoftDelete)
635+
count, err = metrics.MaxIPSetMembers()
636+
require.Nil(t, err, "failed to get metric")
637+
require.Equal(t, 3, count)
638+
639+
iMgr.DeleteIPSet(nsX.GetPrefixName(), util.ForceDelete)
640+
count, err = metrics.MaxIPSetMembers()
641+
require.Nil(t, err, "failed to get metric")
642+
require.Equal(t, 1, count)
567643
}
568644

569645
func verifyHNSCache(t *testing.T, expected map[string]hcn.SetPolicySetting, hns *hnswrapper.Hnsv2wrapperFake) {

0 commit comments

Comments
 (0)