Skip to content

Commit 90284e6

Browse files
committed
Merge pull request #16061 from jasontedor/normalize-unavailable-load-average
Normalize unavailable load average Relates #12049, #14741, #15907, #15932, #15934
2 parents e035dab + e622211 commit 90284e6

File tree

3 files changed

+21
-11
lines changed

3 files changed

+21
-11
lines changed

core/src/main/java/org/elasticsearch/monitor/os/OsProbe.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,12 +119,15 @@ public double[] getSystemLoadAverage() {
119119
}
120120
// fallback
121121
}
122+
if (Constants.WINDOWS) {
123+
return null;
124+
}
122125
if (getSystemLoadAverage == null) {
123126
return null;
124127
}
125128
try {
126129
double oneMinuteLoadAverage = (double) getSystemLoadAverage.invoke(osMxBean);
127-
return new double[] { oneMinuteLoadAverage, -1, -1 };
130+
return new double[] { oneMinuteLoadAverage >= 0 ? oneMinuteLoadAverage : -1, -1, -1 };
128131
} catch (Throwable t) {
129132
return null;
130133
}

core/src/main/java/org/elasticsearch/monitor/os/OsStats.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.elasticsearch.common.xcontent.XContentBuilderString;
2929

3030
import java.io.IOException;
31+
import java.util.Arrays;
3132

3233
/**
3334
*
@@ -89,7 +90,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
8990
if (cpu != null) {
9091
builder.startObject(Fields.CPU);
9192
builder.field(Fields.PERCENT, cpu.getPercent());
92-
if (cpu.getLoadAverage() != null) {
93+
if (cpu.getLoadAverage() != null && Arrays.stream(cpu.getLoadAverage()).anyMatch(load -> load != -1)) {
9394
builder.startObject(Fields.LOAD_AVERAGE);
9495
if (cpu.getLoadAverage()[0] != -1) {
9596
builder.field(Fields.LOAD_AVERAGE_1M, cpu.getLoadAverage()[0]);

core/src/test/java/org/elasticsearch/monitor/os/OsProbeTests.java

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import static org.hamcrest.Matchers.greaterThan;
3030
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
3131
import static org.hamcrest.Matchers.is;
32-
import static org.hamcrest.Matchers.lessThan;
3332
import static org.hamcrest.Matchers.lessThanOrEqualTo;
3433

3534
public class OsProbeTests extends ESTestCase {
@@ -56,22 +55,29 @@ public void testOsStats() {
5655
}
5756
if (Constants.WINDOWS) {
5857
// load average is unavailable on Windows
59-
if (loadAverage != null) {
60-
assertThat(loadAverage[0], equalTo((double) -1));
61-
assertThat(loadAverage[1], equalTo((double) -1));
62-
assertThat(loadAverage[2], equalTo((double) -1));
63-
}
58+
assertNull(loadAverage);
6459
} else if (Constants.LINUX) {
6560
// we should be able to get the load average
6661
assertNotNull(loadAverage);
6762
assertThat(loadAverage[0], greaterThanOrEqualTo((double) 0));
6863
assertThat(loadAverage[1], greaterThanOrEqualTo((double) 0));
6964
assertThat(loadAverage[2], greaterThanOrEqualTo((double) 0));
70-
} else {
65+
} else if (Constants.FREE_BSD) {
66+
// five- and fifteen-minute load averages not available if linprocfs is not mounted at /compat/linux/proc
67+
assertNotNull(loadAverage);
68+
assertThat(loadAverage[0], greaterThanOrEqualTo((double) 0));
69+
assertThat(loadAverage[1], anyOf(equalTo((double) -1), greaterThanOrEqualTo((double) 0)));
70+
assertThat(loadAverage[2], anyOf(equalTo((double) -1), greaterThanOrEqualTo((double) 0)));
71+
} else if (Constants.MAC_OS_X) {
7172
// one minute load average is available, but 10-minute and 15-minute load averages are not
72-
// load average can be negative if not available or not computed yet, otherwise it should be >= 0
73+
assertNotNull(loadAverage);
74+
assertThat(loadAverage[0], greaterThanOrEqualTo((double) 0));
75+
assertThat(loadAverage[1], equalTo((double) -1));
76+
assertThat(loadAverage[2], equalTo((double) -1));
77+
} else {
78+
// unknown system, but the best case is that we have the one-minute load average
7379
if (loadAverage != null) {
74-
assertThat(loadAverage[0], anyOf(lessThan((double) 0), greaterThanOrEqualTo((double) 0)));
80+
assertThat(loadAverage[0], anyOf(equalTo((double) -1), greaterThanOrEqualTo((double) 0)));
7581
assertThat(loadAverage[1], equalTo((double) -1));
7682
assertThat(loadAverage[2], equalTo((double) -1));
7783
}

0 commit comments

Comments
 (0)