Change:
<ins> /* Copyright 2021 The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package ipallocator import ( "sync" "k8s.io/component-base/metrics" "k8s.io/component-base/metrics/legacyregistry" ) const ( namespace = "kube_apiserver" subsystem = "clusterip_allocator" ) var ( // clusterIPAllocated indicates the amount of cluster IP allocated by Service CIDR. clusterIPAllocated = metrics.NewGaugeVec( &metrics.GaugeOpts{ Namespace:      namespace, Subsystem:      subsystem, Name:           "allocated_ips", Help:           "Gauge measuring the number of allocated IPs for Services", StabilityLevel: metrics.ALPHA, }, []string{"cidr"}, ) // clusterIPAvailable indicates the amount of cluster IP available by Service CIDR. clusterIPAvailable = metrics.NewGaugeVec( &metrics.GaugeOpts{ Namespace:      namespace, Subsystem:      subsystem, Name:           "available_ips", Help:           "Gauge measuring the number of available IPs for Services", StabilityLevel: metrics.ALPHA, }, []string{"cidr"}, ) // clusterIPAllocation counts the total number of ClusterIP allocation. clusterIPAllocations = metrics.NewCounterVec( &metrics.CounterOpts{ Namespace:      namespace, Subsystem:      subsystem, Name:           "allocation_total", Help:           "Number of Cluster IPs allocations", StabilityLevel: metrics.ALPHA, }, []string{"cidr"}, ) // clusterIPAllocationErrors counts the number of error trying to allocate a ClusterIP. clusterIPAllocationErrors = metrics.NewCounterVec( &metrics.CounterOpts{ Namespace:      namespace, Subsystem:      subsystem, Name:           "allocation_errors_total", Help:           "Number of errors trying to allocate Cluster IPs", StabilityLevel: metrics.ALPHA, }, []string{"cidr"}, ) ) var registerMetricsOnce sync.Once func registerMetrics() { registerMetricsOnce.Do(func() { legacyregistry.MustRegister(clusterIPAllocated) legacyregistry.MustRegister(clusterIPAvailable) legacyregistry.MustRegister(clusterIPAllocations) legacyregistry.MustRegister(clusterIPAllocationErrors) }) } </ins>

Discussion:
<!-- Feature requests are unlikely to make progress as an issue. Instead, please suggest enhancements by engaging with SIGs on slack and mailing lists. A proposal that works through the design along with the implications of the change can be opened as a KEP: --Add metrics to apiserver tracking the service IP allocator - around how many IP addresses are used(allocated) vs available, and/or if there were any errors allocating service IPs to a service. We want to track if we are approaching the limit of the ServiceClusterIPRange, which is a fixed CIDR and difficult to change. Currently while we can approximate the usage looking at services in the cluster, it is not coming from the source allocator which is within the apiserver. Similar metrics are currently available for the node's ipam allocatior: /area apiserver /sig instrumentation /sig network
/triage accepted /assign I see something like this, gauges for and can you expand on this? a counter incremented each time an IP allocation fails?
that is one option. for contrast the nodeipam metric has an 'allocationtriesper_request' metric - i was imagining something similar to an 'attempts', but with a success:true/false tag/facet so we could compare how often allocations are attempted/how often they fail. I will defer to the experts here as I'm not sure what the status quo for reporting attempts/failures are. I'm not sure if there's any code paths that would cause allocation failures other than usage total (or available <= 0) - but having them separated out like that would be handy in that scenario. (maybe etcd internal allocation is corrupt? or context deadline exceeded)