Skip to content

Commit 2965ddf

Browse files
lnhanksLindsay Hanks
andauthored
Only metrics (#2557)
Prometheus metrics for capturing ENI IP usage and no available IP address errors Co-authored-by: Lindsay Hanks <[email protected]>
1 parent 2a5bd83 commit 2965ddf

File tree

1 file changed

+31
-0
lines changed

1 file changed

+31
-0
lines changed

pkg/ipamd/datastore/data_store.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,19 @@ var (
122122
},
123123
[]string{"cidr"},
124124
)
125+
noAvailableIPAddrs = prometheus.NewCounter(
126+
prometheus.CounterOpts{
127+
Name: "awscni_err_no_avail_addrs",
128+
Help: "The number of pod IP assignments that fail due to no available IP addresses",
129+
},
130+
)
131+
eniIPsInUse = prometheus.NewGaugeVec(
132+
prometheus.GaugeOpts{
133+
Name: "awscni_eni_util",
134+
Help: "The number of allocated ips partitioned by eni",
135+
},
136+
[]string{"eni"},
137+
)
125138
prometheusRegistered = false
126139
)
127140

@@ -344,6 +357,8 @@ func prometheusRegister() {
344357
prometheus.MustRegister(forceRemovedIPs)
345358
prometheus.MustRegister(totalPrefixes)
346359
prometheus.MustRegister(ipsPerCidr)
360+
prometheus.MustRegister(noAvailableIPAddrs)
361+
prometheus.MustRegister(eniIPsInUse)
347362
prometheusRegistered = true
348363
}
349364
}
@@ -437,6 +452,8 @@ func (ds *DataStore) ReadBackingStore(isv6Enabled bool) error {
437452
cidr.IPAddresses[ipAddr.String()] = addr
438453
ds.assignPodIPAddressUnsafe(addr, allocation.IPAMKey, allocation.Metadata, time.Unix(0, allocation.AllocationTimestamp))
439454
ds.log.Debugf("Recovered %s => %s/%s", allocation.IPAMKey, eni.ID, addr.Address)
455+
// Increment ENI IP usage upon finding assigned ips
456+
eniIPsInUse.WithLabelValues(eni.ID).Inc()
440457
// Update prometheus for ips per cidr
441458
// Secondary IP mode will have /32:1 and Prefix mode will have /28:<number of /32s>
442459
ipsPerCidr.With(prometheus.Labels{"cidr": cidr.Cidr.String()}).Inc()
@@ -522,6 +539,8 @@ func (ds *DataStore) AddENI(eniID string, deviceNumber int, isPrimary, isTrunk,
522539
AvailableIPv4Cidrs: make(map[string]*CidrInfo)}
523540

524541
enis.Set(float64(len(ds.eniPool)))
542+
// Initialize ENI IPs In Use to 0 when an ENI is created
543+
eniIPsInUse.WithLabelValues(eniID).Set(0)
525544
return nil
526545
}
527546

@@ -711,9 +730,12 @@ func (ds *DataStore) AssignPodIPv6Address(ipamKey IPAMKey, ipamMetadata IPAMMeta
711730
delete(V6Cidr.IPAddresses, addr.Address)
712731
return "", -1, err
713732
}
733+
// Increment ENI IP usage on pod IPv6 allocation
734+
eniIPsInUse.WithLabelValues(eni.ID).Inc()
714735
return addr.Address, eni.DeviceNumber, nil
715736
}
716737
}
738+
noAvailableIPAddrs.Inc()
717739
return "", -1, errors.New("assignPodIPv6AddressUnsafe: no available IP addresses")
718740
}
719741

@@ -776,11 +798,14 @@ func (ds *DataStore) AssignPodIPv4Address(ipamKey IPAMKey, ipamMetadata IPAMMeta
776798
ipsPerCidr.With(prometheus.Labels{"cidr": availableCidr.Cidr.String()}).Dec()
777799
return "", -1, err
778800
}
801+
// Increment ENI IP usage on pod IPv4 allocation
802+
eniIPsInUse.WithLabelValues(eni.ID).Inc()
779803
return addr.Address, eni.DeviceNumber, nil
780804
}
781805
ds.log.Debugf("AssignPodIPv4Address: ENI %s does not have available addresses", eni.ID)
782806
}
783807

808+
noAvailableIPAddrs.Inc()
784809
ds.log.Errorf("DataStore has no available IP/Prefix addresses")
785810
return "", -1, errors.New("assignPodIPv4AddressUnsafe: no available IP/Prefix addresses")
786811
}
@@ -1072,6 +1097,8 @@ func (ds *DataStore) RemoveUnusedENIFromStore(warmIPTarget, minimumIPTarget, war
10721097

10731098
// Prometheus update
10741099
enis.Set(float64(len(ds.eniPool)))
1100+
// Delete ENI IPs In Use when ENI is removed
1101+
eniIPsInUse.DeleteLabelValues(removableENI)
10751102
totalIPs.Set(float64(ds.total))
10761103
return removableENI
10771104
}
@@ -1126,6 +1153,8 @@ func (ds *DataStore) RemoveENIFromDataStore(eniID string, force bool) error {
11261153

11271154
// Prometheus gauge
11281155
enis.Set(float64(len(ds.eniPool)))
1156+
// Delete ENI IPs In Use when ENI is removed
1157+
eniIPsInUse.DeleteLabelValues(eniID)
11291158
return nil
11301159
}
11311160

@@ -1166,6 +1195,8 @@ func (ds *DataStore) UnassignPodIPAddress(ipamKey IPAMKey) (e *ENI, ip string, d
11661195
ipsPerCidr.With(prometheus.Labels{"cidr": availableCidr.Cidr.String()}).Dec()
11671196
ds.log.Infof("UnassignPodIPAddress: sandbox %s's ipAddr %s, DeviceNumber %d",
11681197
ipamKey, addr.Address, eni.DeviceNumber)
1198+
// Decrement ENI IP usage when a pod is deallocated
1199+
eniIPsInUse.WithLabelValues(eni.ID).Dec()
11691200
return eni, addr.Address, eni.DeviceNumber, nil
11701201
}
11711202

0 commit comments

Comments
 (0)