@@ -54,12 +54,12 @@ var _ = Describe("Controller", func() {
54
54
controller = status .NewController [* test.CustomObject ](kubeClient , recorder , status .EmitDeprecatedMetrics )
55
55
})
56
56
AfterEach (func () {
57
- metrics . Registry .Unregister (controller .ConditionDuration .(* pmetrics.PrometheusHistogram ).HistogramVec )
58
- metrics . Registry .Unregister (controller .ConditionCount .(* pmetrics.PrometheusGauge ).GaugeVec )
59
- metrics . Registry .Unregister (controller .ConditionCurrentStatusSeconds .(* pmetrics.PrometheusGauge ).GaugeVec )
60
- metrics . Registry .Unregister (controller .ConditionTransitionsTotal .(* pmetrics.PrometheusCounter ).CounterVec )
61
- metrics . Registry .Unregister (controller .TerminationCurrentTimeSeconds .(* pmetrics.PrometheusGauge ).GaugeVec )
62
- metrics . Registry .Unregister (controller .TerminationDuration .(* pmetrics.PrometheusHistogram ).HistogramVec )
57
+ registry .Unregister (controller .ConditionDuration .(* pmetrics.PrometheusHistogram ).HistogramVec )
58
+ registry .Unregister (controller .ConditionCount .(* pmetrics.PrometheusGauge ).GaugeVec )
59
+ registry .Unregister (controller .ConditionCurrentStatusSeconds .(* pmetrics.PrometheusGauge ).GaugeVec )
60
+ registry .Unregister (controller .ConditionTransitionsTotal .(* pmetrics.PrometheusCounter ).CounterVec )
61
+ registry .Unregister (controller .TerminationCurrentTimeSeconds .(* pmetrics.PrometheusGauge ).GaugeVec )
62
+ registry .Unregister (controller .TerminationDuration .(* pmetrics.PrometheusHistogram ).HistogramVec )
63
63
})
64
64
It ("should emit termination metrics when deletion timestamp is set" , func () {
65
65
testObject := test .Object (& test.CustomObject {})
@@ -628,6 +628,54 @@ var _ = Describe("Controller", func() {
628
628
Expect (GetMetric ("operator_customobject_status_condition_transitions_total" , lo .Assign (conditionLabels (ConditionTypeBar , metav1 .ConditionFalse ), map [string ]string {"operator_pkg_key1" : "value1" , "operator_pkg_key2" : "value2" }))).To (BeNil ())
629
629
Expect (GetMetric ("operator_customobject_status_condition_transitions_total" , lo .Assign (conditionLabels (ConditionTypeBar , metav1 .ConditionUnknown ), map [string ]string {"operator_pkg_key1" : "value1" , "operator_pkg_key2" : "value2" }))).To (BeNil ())
630
630
})
631
+ It ("should ensure that we don't leak metrics when changing reason with the same status" , func () {
632
+ testObject := test .Object (& test.CustomObject {})
633
+ testObject .StatusConditions () // initialize conditions
634
+
635
+ // conditions not set (this means that we should see that the condition is in an "Unknown" state)
636
+ ExpectApplied (ctx , kubeClient , testObject )
637
+ ExpectReconciled (ctx , controller , testObject )
638
+
639
+ Expect (GetMetric ("operator_customobject_status_condition_count" , lo .Assign (conditionLabels (test .ConditionTypeFoo , metav1 .ConditionTrue ), map [string ]string {"reason" : "AwaitingReconciliation" }))).To (BeNil ())
640
+ Expect (GetMetric ("operator_customobject_status_condition_count" , lo .Assign (conditionLabels (test .ConditionTypeFoo , metav1 .ConditionFalse ), map [string ]string {"reason" : "AwaitingReconciliation" }))).To (BeNil ())
641
+ Expect (GetMetric ("operator_customobject_status_condition_count" , lo .Assign (conditionLabels (test .ConditionTypeFoo , metav1 .ConditionUnknown ), map [string ]string {"reason" : "AwaitingReconciliation" })).GetGauge ().GetValue ()).To (BeEquivalentTo (1 ))
642
+ Expect (GetMetric ("operator_customobject_status_condition_current_status_seconds" , lo .Assign (conditionLabels (test .ConditionTypeFoo , metav1 .ConditionTrue ), map [string ]string {"reason" : "AwaitingReconciliation" }))).To (BeNil ())
643
+ Expect (GetMetric ("operator_customobject_status_condition_current_status_seconds" , lo .Assign (conditionLabels (test .ConditionTypeFoo , metav1 .ConditionFalse ), map [string ]string {"reason" : "AwaitingReconciliation" }))).To (BeNil ())
644
+ Expect (GetMetric ("operator_customobject_status_condition_current_status_seconds" , lo .Assign (conditionLabels (test .ConditionTypeFoo , metav1 .ConditionUnknown ), map [string ]string {"reason" : "AwaitingReconciliation" })).GetGauge ().GetValue ()).ToNot (BeZero ())
645
+
646
+ // Set Foo explicitly to Unknown (this shouldn't change the reason at all)
647
+ testObject .StatusConditions ().SetUnknown (test .ConditionTypeFoo )
648
+ ExpectApplied (ctx , kubeClient , testObject )
649
+ ExpectReconciled (ctx , controller , testObject )
650
+ ExpectStatusConditions (ctx , kubeClient , FastTimeout , testObject , status.Condition {Type : test .ConditionTypeFoo , Status : metav1 .ConditionUnknown })
651
+
652
+ Expect (GetMetric ("operator_customobject_status_condition_count" , lo .Assign (conditionLabels (test .ConditionTypeFoo , metav1 .ConditionTrue ), map [string ]string {"reason" : "AwaitingReconciliation" }))).To (BeNil ())
653
+ Expect (GetMetric ("operator_customobject_status_condition_count" , lo .Assign (conditionLabels (test .ConditionTypeFoo , metav1 .ConditionFalse ), map [string ]string {"reason" : "AwaitingReconciliation" }))).To (BeNil ())
654
+ Expect (GetMetric ("operator_customobject_status_condition_count" , lo .Assign (conditionLabels (test .ConditionTypeFoo , metav1 .ConditionUnknown ), map [string ]string {"reason" : "AwaitingReconciliation" })).GetGauge ().GetValue ()).To (BeEquivalentTo (1 ))
655
+ Expect (GetMetric ("operator_customobject_status_condition_current_status_seconds" , lo .Assign (conditionLabels (test .ConditionTypeFoo , metav1 .ConditionTrue ), map [string ]string {"reason" : "AwaitingReconciliation" }))).To (BeNil ())
656
+ Expect (GetMetric ("operator_customobject_status_condition_current_status_seconds" , lo .Assign (conditionLabels (test .ConditionTypeFoo , metav1 .ConditionFalse ), map [string ]string {"reason" : "AwaitingReconciliation" }))).To (BeNil ())
657
+ Expect (GetMetric ("operator_customobject_status_condition_current_status_seconds" , lo .Assign (conditionLabels (test .ConditionTypeFoo , metav1 .ConditionUnknown ), map [string ]string {"reason" : "AwaitingReconciliation" })).GetGauge ().GetValue ()).ToNot (BeZero ())
658
+
659
+ // Set Foo to Unknown but with a custom reason (we should change the reason abut not leak metrics)
660
+ testObject .StatusConditions ().SetUnknownWithReason (test .ConditionTypeFoo , "CustomReason" , "custom message" )
661
+ ExpectApplied (ctx , kubeClient , testObject )
662
+ ExpectReconciled (ctx , controller , testObject )
663
+ ExpectStatusConditions (ctx , kubeClient , FastTimeout , testObject , status.Condition {Type : test .ConditionTypeFoo , Status : metav1 .ConditionUnknown })
664
+
665
+ Expect (GetMetric ("operator_customobject_status_condition_count" , lo .Assign (conditionLabels (test .ConditionTypeFoo , metav1 .ConditionTrue ), map [string ]string {"reason" : "CustomReason" }))).To (BeNil ())
666
+ Expect (GetMetric ("operator_customobject_status_condition_count" , lo .Assign (conditionLabels (test .ConditionTypeFoo , metav1 .ConditionFalse ), map [string ]string {"reason" : "CustomReason" }))).To (BeNil ())
667
+ Expect (GetMetric ("operator_customobject_status_condition_count" , lo .Assign (conditionLabels (test .ConditionTypeFoo , metav1 .ConditionUnknown ), map [string ]string {"reason" : "CustomReason" })).GetGauge ().GetValue ()).To (BeEquivalentTo (1 ))
668
+ Expect (GetMetric ("operator_customobject_status_condition_current_status_seconds" , lo .Assign (conditionLabels (test .ConditionTypeFoo , metav1 .ConditionTrue ), map [string ]string {"reason" : "CustomReason" }))).To (BeNil ())
669
+ Expect (GetMetric ("operator_customobject_status_condition_current_status_seconds" , lo .Assign (conditionLabels (test .ConditionTypeFoo , metav1 .ConditionFalse ), map [string ]string {"reason" : "CustomReason" }))).To (BeNil ())
670
+ Expect (GetMetric ("operator_customobject_status_condition_current_status_seconds" , lo .Assign (conditionLabels (test .ConditionTypeFoo , metav1 .ConditionUnknown ), map [string ]string {"reason" : "CustomReason" })).GetGauge ().GetValue ()).ToNot (BeZero ())
671
+
672
+ Expect (GetMetric ("operator_customobject_status_condition_count" , lo .Assign (conditionLabels (test .ConditionTypeFoo , metav1 .ConditionTrue ), map [string ]string {"reason" : "AwaitingReconciliation" }))).To (BeNil ())
673
+ Expect (GetMetric ("operator_customobject_status_condition_count" , lo .Assign (conditionLabels (test .ConditionTypeFoo , metav1 .ConditionFalse ), map [string ]string {"reason" : "AwaitingReconciliation" }))).To (BeNil ())
674
+ Expect (GetMetric ("operator_customobject_status_condition_count" , lo .Assign (conditionLabels (test .ConditionTypeFoo , metav1 .ConditionUnknown ), map [string ]string {"reason" : "AwaitingReconciliation" }))).To (BeNil ())
675
+ Expect (GetMetric ("operator_customobject_status_condition_current_status_seconds" , lo .Assign (conditionLabels (test .ConditionTypeFoo , metav1 .ConditionTrue ), map [string ]string {"reason" : "AwaitingReconciliation" }))).To (BeNil ())
676
+ Expect (GetMetric ("operator_customobject_status_condition_current_status_seconds" , lo .Assign (conditionLabels (test .ConditionTypeFoo , metav1 .ConditionFalse ), map [string ]string {"reason" : "AwaitingReconciliation" }))).To (BeNil ())
677
+ Expect (GetMetric ("operator_customobject_status_condition_current_status_seconds" , lo .Assign (conditionLabels (test .ConditionTypeFoo , metav1 .ConditionUnknown ), map [string ]string {"reason" : "AwaitingReconciliation" }))).To (BeNil ())
678
+ })
631
679
})
632
680
633
681
var _ = Describe ("Generic Controller" , func () {
@@ -639,12 +687,12 @@ var _ = Describe("Generic Controller", func() {
639
687
genericController = status .NewGenericObjectController [* TestGenericObject ](kubeClient , recorder , status .EmitDeprecatedMetrics )
640
688
})
641
689
AfterEach (func () {
642
- metrics . Registry .Unregister (genericController .ConditionDuration .(* pmetrics.PrometheusHistogram ).HistogramVec )
643
- metrics . Registry .Unregister (genericController .ConditionCount .(* pmetrics.PrometheusGauge ).GaugeVec )
644
- metrics . Registry .Unregister (genericController .ConditionCurrentStatusSeconds .(* pmetrics.PrometheusGauge ).GaugeVec )
645
- metrics . Registry .Unregister (genericController .ConditionTransitionsTotal .(* pmetrics.PrometheusCounter ).CounterVec )
646
- metrics . Registry .Unregister (genericController .TerminationCurrentTimeSeconds .(* pmetrics.PrometheusGauge ).GaugeVec )
647
- metrics . Registry .Unregister (genericController .TerminationDuration .(* pmetrics.PrometheusHistogram ).HistogramVec )
690
+ registry .Unregister (genericController .ConditionDuration .(* pmetrics.PrometheusHistogram ).HistogramVec )
691
+ registry .Unregister (genericController .ConditionCount .(* pmetrics.PrometheusGauge ).GaugeVec )
692
+ registry .Unregister (genericController .ConditionCurrentStatusSeconds .(* pmetrics.PrometheusGauge ).GaugeVec )
693
+ registry .Unregister (genericController .ConditionTransitionsTotal .(* pmetrics.PrometheusCounter ).CounterVec )
694
+ registry .Unregister (genericController .TerminationCurrentTimeSeconds .(* pmetrics.PrometheusGauge ).GaugeVec )
695
+ registry .Unregister (genericController .TerminationDuration .(* pmetrics.PrometheusHistogram ).HistogramVec )
648
696
})
649
697
It ("should emit termination metrics when deletion timestamp is set" , func () {
650
698
testObject := test .Object (& TestGenericObject {})
0 commit comments