7
7
8
8
package org .elasticsearch .xpack .writeloadforecaster ;
9
9
10
+ import org .apache .logging .log4j .Level ;
11
+ import org .apache .logging .log4j .core .LogEvent ;
10
12
import org .elasticsearch .cluster .metadata .DataStream ;
11
13
import org .elasticsearch .cluster .metadata .IndexMetadata ;
12
14
import org .elasticsearch .cluster .metadata .IndexMetadataStats ;
19
21
import org .elasticsearch .index .IndexMode ;
20
22
import org .elasticsearch .index .IndexVersion ;
21
23
import org .elasticsearch .test .ESTestCase ;
24
+ import org .elasticsearch .test .MockLog ;
22
25
import org .elasticsearch .threadpool .TestThreadPool ;
23
26
import org .elasticsearch .threadpool .ThreadPool ;
24
27
import org .junit .After ;
30
33
import java .util .OptionalDouble ;
31
34
import java .util .concurrent .TimeUnit ;
32
35
import java .util .concurrent .atomic .AtomicBoolean ;
36
+ import java .util .concurrent .atomic .AtomicInteger ;
33
37
34
38
import static org .elasticsearch .xpack .writeloadforecaster .LicensedWriteLoadForecaster .forecastIndexWriteLoad ;
35
39
import static org .hamcrest .Matchers .closeTo ;
40
+ import static org .hamcrest .Matchers .contains ;
41
+ import static org .hamcrest .Matchers .empty ;
36
42
import static org .hamcrest .Matchers .equalTo ;
37
43
import static org .hamcrest .Matchers .greaterThan ;
38
44
import static org .hamcrest .Matchers .is ;
@@ -53,7 +59,13 @@ public void tearDownThreadPool() {
53
59
public void testWriteLoadForecastIsAddedToWriteIndex () {
54
60
final TimeValue maxIndexAge = TimeValue .timeValueDays (7 );
55
61
final AtomicBoolean hasValidLicense = new AtomicBoolean (true );
56
- final WriteLoadForecaster writeLoadForecaster = new LicensedWriteLoadForecaster (hasValidLicense ::get , threadPool , maxIndexAge );
62
+ final AtomicInteger licenseCheckCount = new AtomicInteger ();
63
+ final WriteLoadForecaster writeLoadForecaster = new LicensedWriteLoadForecaster (() -> {
64
+ licenseCheckCount .incrementAndGet ();
65
+ return hasValidLicense .get ();
66
+ }, threadPool , maxIndexAge );
67
+
68
+ writeLoadForecaster .refreshLicense ();
57
69
58
70
final Metadata .Builder metadataBuilder = Metadata .builder ();
59
71
final String dataStreamName = "logs-es" ;
@@ -95,8 +107,12 @@ public void testWriteLoadForecastIsAddedToWriteIndex() {
95
107
assertThat (forecastedWriteLoad .isPresent (), is (true ));
96
108
assertThat (forecastedWriteLoad .getAsDouble (), is (greaterThan (0.0 )));
97
109
110
+ assertThat (licenseCheckCount .get (), equalTo (1 ));
98
111
hasValidLicense .set (false );
99
112
113
+ writeLoadForecaster .refreshLicense ();
114
+ assertThat (licenseCheckCount .get (), equalTo (2 ));
115
+
100
116
final OptionalDouble forecastedWriteLoadAfterLicenseChange = writeLoadForecaster .getForecastedWriteLoad (writeIndex );
101
117
assertThat (forecastedWriteLoadAfterLicenseChange .isPresent (), is (false ));
102
118
}
@@ -136,6 +152,7 @@ public void testUptimeIsUsedToWeightWriteLoad() {
136
152
metadataBuilder .put (dataStream );
137
153
138
154
final WriteLoadForecaster writeLoadForecaster = new LicensedWriteLoadForecaster (() -> true , threadPool , maxIndexAge );
155
+ writeLoadForecaster .refreshLicense ();
139
156
140
157
final Metadata .Builder updatedMetadataBuilder = writeLoadForecaster .withWriteLoadForecastForWriteIndex (
141
158
dataStream .getName (),
@@ -154,6 +171,7 @@ public void testForecastedWriteLoadIsOverriddenBySetting() {
154
171
final TimeValue maxIndexAge = TimeValue .timeValueDays (7 );
155
172
final AtomicBoolean hasValidLicense = new AtomicBoolean (true );
156
173
final WriteLoadForecaster writeLoadForecaster = new LicensedWriteLoadForecaster (hasValidLicense ::get , threadPool , maxIndexAge );
174
+ writeLoadForecaster .refreshLicense ();
157
175
158
176
final Metadata .Builder metadataBuilder = Metadata .builder ();
159
177
final String dataStreamName = "logs-es" ;
@@ -197,6 +215,7 @@ public void testForecastedWriteLoadIsOverriddenBySetting() {
197
215
assertThat (forecastedWriteLoad .getAsDouble (), is (equalTo (0.6 )));
198
216
199
217
hasValidLicense .set (false );
218
+ writeLoadForecaster .refreshLicense ();
200
219
201
220
final OptionalDouble forecastedWriteLoadAfterLicenseChange = writeLoadForecaster .getForecastedWriteLoad (writeIndex );
202
221
assertThat (forecastedWriteLoadAfterLicenseChange .isPresent (), is (false ));
@@ -327,4 +346,56 @@ private DataStream createDataStream(String name, List<Index> backingIndices) {
327
346
.setIndexMode (IndexMode .STANDARD )
328
347
.build ();
329
348
}
349
+
350
+ public void testLicenseStateLogging () {
351
+
352
+ final var seenMessages = new ArrayList <String >();
353
+
354
+ final var collectingLoggingAssertion = new MockLog .SeenEventExpectation (
355
+ "seen event" ,
356
+ LicensedWriteLoadForecaster .class .getCanonicalName (),
357
+ Level .INFO ,
358
+ "*"
359
+ ) {
360
+ @ Override
361
+ public boolean innerMatch (LogEvent event ) {
362
+ final var message = event .getMessage ().getFormattedMessage ();
363
+ if (message .startsWith ("license state changed, now [" )) {
364
+ seenMessages .add (message );
365
+ return true ;
366
+ }
367
+
368
+ return false ;
369
+ }
370
+ };
371
+
372
+ MockLog .assertThatLogger (() -> {
373
+ final var hasValidLicense = new AtomicBoolean ();
374
+ final var writeLoadForecaster = new LicensedWriteLoadForecaster (hasValidLicense ::get , threadPool , randomTimeValue ());
375
+ assertThat (seenMessages , empty ());
376
+ writeLoadForecaster .refreshLicense ();
377
+ assertThat (seenMessages , empty ());
378
+
379
+ hasValidLicense .set (true );
380
+ writeLoadForecaster .refreshLicense ();
381
+ assertThat (seenMessages , contains ("license state changed, now [valid]" ));
382
+ writeLoadForecaster .refreshLicense ();
383
+ assertThat (seenMessages , contains ("license state changed, now [valid]" ));
384
+
385
+ hasValidLicense .set (false );
386
+ writeLoadForecaster .refreshLicense ();
387
+ assertThat (seenMessages , contains ("license state changed, now [valid]" , "license state changed, now [not valid]" ));
388
+
389
+ hasValidLicense .set (true );
390
+ ESTestCase .startInParallel (between (1 , 10 ), ignored -> writeLoadForecaster .refreshLicense ());
391
+ assertThat (
392
+ seenMessages ,
393
+ contains (
394
+ "license state changed, now [valid]" ,
395
+ "license state changed, now [not valid]" ,
396
+ "license state changed, now [valid]"
397
+ )
398
+ );
399
+ }, LicensedWriteLoadForecaster .class , collectingLoggingAssertion );
400
+ }
330
401
}
0 commit comments