Skip to content

Commit 7343222

Browse files
committed
unregister metrics before deletion
Signed-off-by: Bruce Ma <[email protected]>
1 parent eec35b7 commit 7343222

File tree

3 files changed

+125
-6
lines changed

3 files changed

+125
-6
lines changed

pkg/constants/finalizers.go

+7-2
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,10 @@
1616

1717
package constants
1818

19-
const FinalizerIPAllocated = "networking.alibaba.com/ip-allocated"
20-
const FinalizerManagerRuntimeRegistered = "multicluster.alibaba.com/manager-runtime-registered"
19+
const (
20+
FinalizerIPAllocated = "networking.alibaba.com/ip-allocated"
21+
22+
FinalizerManagerRuntimeRegistered = "multicluster.alibaba.com/manager-runtime-registered"
23+
24+
FinalizerMetricsRegistered = "networking.alibaba.com/metrics-registered"
25+
)

pkg/controllers/networking/networkstatus_controller.go

+53-2
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
"sigs.k8s.io/controller-runtime/pkg/builder"
3131
"sigs.k8s.io/controller-runtime/pkg/client"
3232
"sigs.k8s.io/controller-runtime/pkg/controller"
33+
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
3334
"sigs.k8s.io/controller-runtime/pkg/event"
3435
"sigs.k8s.io/controller-runtime/pkg/handler"
3536
ctrllog "sigs.k8s.io/controller-runtime/pkg/log"
@@ -85,6 +86,17 @@ func (r *NetworkStatusReconciler) Reconcile(ctx context.Context, req ctrl.Reques
8586
return ctrl.Result{}, wrapError("unable to fetch Network", client.IgnoreNotFound(err))
8687
}
8788

89+
if network.DeletionTimestamp != nil {
90+
cleanMetrics(network.Name)
91+
return ctrl.Result{}, wrapError("unable to remove finalizer", r.removeFinalizer(ctx, network))
92+
93+
}
94+
95+
// make sure metrics will be un-registered before deletion
96+
if err = r.addFinalizer(ctx, network); err != nil {
97+
return ctrl.Result{}, wrapError("unable to add finalizer to network", err)
98+
}
99+
88100
nodeSelector := network.Spec.NodeSelector
89101
switch networkingv1.GetNetworkType(network) {
90102
case networkingv1.NetworkTypeGlobalBGP:
@@ -187,15 +199,54 @@ func updateUsageMetrics(networkName string, networkStatus *networkingv1.NetworkS
187199
}
188200
}
189201

202+
func cleanMetrics(networkName string) {
203+
_ = metrics.IPUsageGauge.DeleteLabelValues(networkName, metrics.IPv4, metrics.IPTotalUsageType)
204+
_ = metrics.IPUsageGauge.DeleteLabelValues(networkName, metrics.IPv4, metrics.IPUsedUsageType)
205+
_ = metrics.IPUsageGauge.DeleteLabelValues(networkName, metrics.IPv4, metrics.IPAvailableUsageType)
206+
207+
_ = metrics.IPUsageGauge.DeleteLabelValues(networkName, metrics.IPv6, metrics.IPTotalUsageType)
208+
_ = metrics.IPUsageGauge.DeleteLabelValues(networkName, metrics.IPv6, metrics.IPUsedUsageType)
209+
_ = metrics.IPUsageGauge.DeleteLabelValues(networkName, metrics.IPv6, metrics.IPAvailableUsageType)
210+
211+
_ = metrics.IPUsageGauge.DeleteLabelValues(networkName, metrics.DualStack, metrics.IPAvailableUsageType)
212+
}
213+
214+
func (r *NetworkStatusReconciler) addFinalizer(ctx context.Context, network *networkingv1.Network) error {
215+
if controllerutil.ContainsFinalizer(network, constants.FinalizerMetricsRegistered) {
216+
return nil
217+
}
218+
219+
patch := client.MergeFrom(network.DeepCopy())
220+
controllerutil.AddFinalizer(network, constants.FinalizerMetricsRegistered)
221+
return retry.RetryOnConflict(retry.DefaultRetry, func() error {
222+
return r.Patch(ctx, network, patch)
223+
})
224+
}
225+
226+
func (r *NetworkStatusReconciler) removeFinalizer(ctx context.Context, network *networkingv1.Network) error {
227+
if !controllerutil.ContainsFinalizer(network, constants.FinalizerMetricsRegistered) {
228+
return nil
229+
}
230+
231+
patch := client.MergeFrom(network.DeepCopy())
232+
controllerutil.RemoveFinalizer(network, constants.FinalizerMetricsRegistered)
233+
return retry.RetryOnConflict(retry.DefaultRetry, func() error {
234+
return r.Patch(ctx, network, patch)
235+
})
236+
}
237+
190238
// SetupWithManager sets up the controller with the Manager.
191239
func (r *NetworkStatusReconciler) SetupWithManager(mgr ctrl.Manager) (err error) {
192240
return ctrl.NewControllerManagedBy(mgr).
193241
Named(ControllerNetworkStatus).
194242
For(&networkingv1.Network{},
195243
builder.WithPredicates(
196-
&predicate.GenerationChangedPredicate{},
197244
&utils.IgnoreDeletePredicate{},
198-
&utils.NetworkSpecChangePredicate{},
245+
&predicate.ResourceVersionChangedPredicate{},
246+
predicate.Or(
247+
&utils.NetworkSpecChangePredicate{},
248+
&utils.TerminatingPredicate{},
249+
),
199250
)).
200251
Watches(&source.Kind{Type: &networkingv1.Subnet{}},
201252
handler.EnqueueRequestsFromMapFunc(func(object client.Object) []reconcile.Request {

pkg/controllers/networking/subnetstatus_controller.go

+65-2
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
"sigs.k8s.io/controller-runtime/pkg/builder"
3131
"sigs.k8s.io/controller-runtime/pkg/client"
3232
"sigs.k8s.io/controller-runtime/pkg/controller"
33+
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
3334
"sigs.k8s.io/controller-runtime/pkg/event"
3435
"sigs.k8s.io/controller-runtime/pkg/handler"
3536
ctrllog "sigs.k8s.io/controller-runtime/pkg/log"
@@ -38,6 +39,7 @@ import (
3839
"sigs.k8s.io/controller-runtime/pkg/source"
3940

4041
networkingv1 "github.com/alibaba/hybridnet/pkg/apis/networking/v1"
42+
"github.com/alibaba/hybridnet/pkg/constants"
4143
"github.com/alibaba/hybridnet/pkg/controllers/concurrency"
4244
"github.com/alibaba/hybridnet/pkg/controllers/utils"
4345
ipamtypes "github.com/alibaba/hybridnet/pkg/ipam/types"
@@ -80,6 +82,17 @@ func (r *SubnetStatusReconciler) Reconcile(ctx context.Context, req ctrl.Request
8082
return ctrl.Result{}, wrapError("unable to fetch Subnet", client.IgnoreNotFound(err))
8183
}
8284

85+
if subnet.DeletionTimestamp != nil {
86+
cleanSubnetMetrics(subnet.Spec.Network, subnet.Name)
87+
return ctrl.Result{}, wrapError("unable to remove finalizer", r.removeFinalizer(ctx, subnet))
88+
89+
}
90+
91+
// make sure metrics will be un-registered before deletion
92+
if err = r.addFinalizer(ctx, subnet); err != nil {
93+
return ctrl.Result{}, wrapError("unable to add finalizer to subnet", err)
94+
}
95+
8396
// fetch subnet usage from manager
8497
var usage *ipamtypes.Usage
8598
if usage, err = r.IPAMManager.GetSubnetUsage(subnet.Spec.Network, subnet.Name); err != nil {
@@ -147,15 +160,65 @@ func updateSubnetUsageMetrics(networkName, subnetName string, subnetStatus *netw
147160
}
148161
}
149162

163+
func cleanSubnetMetrics(networkName, subnetName string) {
164+
_ = metrics.SubnetIPUsageGauge.Delete(
165+
prometheus.Labels{
166+
"subnetName": subnetName,
167+
"networkName": networkName,
168+
"usageType": metrics.IPTotalUsageType,
169+
})
170+
171+
_ = metrics.SubnetIPUsageGauge.Delete(
172+
prometheus.Labels{
173+
"subnetName": subnetName,
174+
"networkName": networkName,
175+
"usageType": metrics.IPUsedUsageType,
176+
})
177+
178+
_ = metrics.SubnetIPUsageGauge.Delete(
179+
prometheus.Labels{
180+
"subnetName": subnetName,
181+
"networkName": networkName,
182+
"usageType": metrics.IPAvailableUsageType,
183+
})
184+
}
185+
186+
func (r *SubnetStatusReconciler) addFinalizer(ctx context.Context, subnet *networkingv1.Subnet) error {
187+
if controllerutil.ContainsFinalizer(subnet, constants.FinalizerMetricsRegistered) {
188+
return nil
189+
}
190+
191+
patch := client.MergeFrom(subnet.DeepCopy())
192+
controllerutil.AddFinalizer(subnet, constants.FinalizerMetricsRegistered)
193+
return retry.RetryOnConflict(retry.DefaultRetry, func() error {
194+
return r.Patch(ctx, subnet, patch)
195+
})
196+
}
197+
198+
func (r *SubnetStatusReconciler) removeFinalizer(ctx context.Context, subnet *networkingv1.Subnet) error {
199+
if !controllerutil.ContainsFinalizer(subnet, constants.FinalizerMetricsRegistered) {
200+
return nil
201+
}
202+
203+
patch := client.MergeFrom(subnet.DeepCopy())
204+
controllerutil.RemoveFinalizer(subnet, constants.FinalizerMetricsRegistered)
205+
return retry.RetryOnConflict(retry.DefaultRetry, func() error {
206+
return r.Patch(ctx, subnet, patch)
207+
})
208+
}
209+
150210
// SetupWithManager sets up the controller with the Manager.
151211
func (r *SubnetStatusReconciler) SetupWithManager(mgr ctrl.Manager) error {
152212
return ctrl.NewControllerManagedBy(mgr).
153213
Named(ControllerSubnetStatus).
154214
For(&networkingv1.Subnet{},
155215
builder.WithPredicates(
156-
&predicate.GenerationChangedPredicate{},
157216
&utils.IgnoreDeletePredicate{},
158-
&utils.SubnetSpecChangePredicate{},
217+
&predicate.ResourceVersionChangedPredicate{},
218+
predicate.Or(
219+
&utils.SubnetSpecChangePredicate{},
220+
&utils.TerminatingPredicate{},
221+
),
159222
)).
160223
Watches(&source.Kind{Type: &networkingv1.IPInstance{}},
161224
handler.EnqueueRequestsFromMapFunc(func(object client.Object) []reconcile.Request {

0 commit comments

Comments
 (0)