1
1
package io .javaoperatorsdk .operator .monitoring .micrometer ;
2
2
3
- import java .util .concurrent .TimeUnit ;
3
+ import java .time .Duration ;
4
+ import java .util .HashSet ;
5
+ import java .util .Set ;
4
6
5
7
import org .junit .jupiter .api .AfterAll ;
6
8
import org .junit .jupiter .api .BeforeAll ;
13
15
import io .javaoperatorsdk .operator .api .reconciler .*;
14
16
import io .javaoperatorsdk .operator .junit .LocallyRunOperatorExtension ;
15
17
import io .javaoperatorsdk .operator .processing .event .ResourceID ;
16
- import io .micrometer .core .instrument .MeterRegistry ;
18
+ import io .micrometer .core .instrument .Meter ;
19
+ import io .micrometer .core .instrument .simple .SimpleMeterRegistry ;
17
20
18
21
import static org .assertj .core .api .Assertions .assertThat ;
19
22
import static org .awaitility .Awaitility .await ;
20
- import static org .mockito .Mockito .mock ;
21
- import static org .mockito .Mockito .verify ;
22
23
23
24
public class MetricsCleaningOnDeleteIT {
24
25
@ RegisterExtension
25
26
static LocallyRunOperatorExtension operator =
26
27
LocallyRunOperatorExtension .builder ().withReconciler (new MetricsCleaningTestReconciler ())
27
28
.build ();
28
29
29
- private static final MeterRegistry mockRegistry = mock ( MeterRegistry . class );
30
- private static final int testDelay = 15 ;
31
- private static final TestMetrics metrics = new TestMetrics ( mockRegistry , testDelay );
30
+ private static final TestSimpleMeterRegistry registry = new TestSimpleMeterRegistry ( );
31
+ private static final int testDelay = 1 ;
32
+ private static final MicrometerMetrics metrics = new MicrometerMetrics ( registry , testDelay , 2 );
32
33
private static final String testResourceName = "cleaning-metrics-cr" ;
33
34
34
35
@ BeforeAll
35
36
static void setup () {
36
- ConfigurationServiceProvider .overrideCurrent (
37
- overrider -> overrider .withMetrics (new TestMetrics (mockRegistry , testDelay )));
37
+ ConfigurationServiceProvider .overrideCurrent (overrider -> overrider .withMetrics (metrics ));
38
38
}
39
39
40
40
@ AfterAll
@@ -43,29 +43,31 @@ static void reset() {
43
43
}
44
44
45
45
@ Test
46
- void addsFinalizerAndCallsCleanupIfCleanerImplemented () {
46
+ void removesMetersAssociatedWithResourceAfterItsDeletion () throws InterruptedException {
47
47
var testResource = new ConfigMapBuilder ()
48
48
.withNewMetadata ()
49
49
.withName (testResourceName )
50
50
.endMetadata ()
51
51
.build ();
52
52
final var created = operator .create (testResource );
53
53
54
- var meters = metrics .recordedMeterIdsFor (ResourceID .fromResource (created ));
55
- assertThat (meters ).isNotNull ();
56
- assertThat (meters ).isNotEmpty ();
57
-
54
+ // make sure the resource is created
58
55
await ().until (() -> !operator .get (ConfigMap .class , testResourceName )
59
56
.getMetadata ().getFinalizers ().isEmpty ());
60
57
61
- operator .delete (testResource );
58
+ // check that we properly recorded meters associated with the resource
59
+ final var meters = metrics .recordedMeterIdsFor (ResourceID .fromResource (created ));
60
+ assertThat (meters ).isNotNull ();
61
+ assertThat (meters ).isNotEmpty ();
62
62
63
+ // delete the resource and wait for it to be deleted
64
+ operator .delete (testResource );
63
65
await ().until (() -> operator .get (ConfigMap .class , testResourceName ) == null );
64
66
65
- await (). atLeast ( testDelay + 3 , TimeUnit . SECONDS );
66
- meters . forEach ( id -> verify ( mockRegistry . remove ( id ) ));
67
- meters = metrics . recordedMeterIdsFor ( ResourceID . fromResource ( created ) );
68
- assertThat (meters ).isNull ();
67
+ // check that the meters are properly removed after the specified delay
68
+ Thread . sleep ( Duration . ofSeconds ( testDelay ). toMillis ( ));
69
+ assertThat ( registry . removed ). isEqualTo ( meters );
70
+ assertThat (metrics . recordedMeterIdsFor ( ResourceID . fromResource ( created )) ).isNull ();
69
71
}
70
72
71
73
@ ControllerConfiguration
@@ -82,10 +84,14 @@ public DeleteControl cleanup(ConfigMap resource, Context<ConfigMap> context) {
82
84
}
83
85
}
84
86
85
- private static class TestMetrics extends MicrometerMetrics {
87
+ private static class TestSimpleMeterRegistry extends SimpleMeterRegistry {
88
+ private final Set <Meter .Id > removed = new HashSet <>();
86
89
87
- public TestMetrics (MeterRegistry registry , int cleanUpDelayInSeconds ) {
88
- super (registry , cleanUpDelayInSeconds , 2 );
90
+ @ Override
91
+ public Meter remove (Meter .Id mappedId ) {
92
+ final var removed = super .remove (mappedId );
93
+ this .removed .add (removed .getId ());
94
+ return removed ;
89
95
}
90
96
}
91
97
}
0 commit comments