add mem section back to cluster stats

The mem section was buggy in cluster stats and removed. It is now added back with the same structure as in node stats, containing total memory, available memory, used memory and percentages. All the values are the sum of all the nodes across the cluster (or at least the ones that we were able to get the values from).
This commit is contained in:
javanna 2016-08-31 15:43:09 +02:00 committed by Luca Cavanna
parent 5211b6b4bc
commit 5f299ff46f
7 changed files with 53 additions and 8 deletions

View File

@ -87,7 +87,7 @@ public class ClusterStatsNodes implements ToXContent {
} }
} }
this.counts = new Counts(nodeInfos); this.counts = new Counts(nodeInfos);
this.os = new OsStats(nodeInfos); this.os = new OsStats(nodeInfos, nodeStats);
this.process = new ProcessStats(nodeStats); this.process = new ProcessStats(nodeStats);
this.jvm = new JvmStats(nodeInfos, nodeStats); this.jvm = new JvmStats(nodeInfos, nodeStats);
this.networkTypes = new NetworkTypes(nodeInfos); this.networkTypes = new NetworkTypes(nodeInfos);
@ -226,11 +226,12 @@ public class ClusterStatsNodes implements ToXContent {
final int availableProcessors; final int availableProcessors;
final int allocatedProcessors; final int allocatedProcessors;
final ObjectIntHashMap<String> names; final ObjectIntHashMap<String> names;
final org.elasticsearch.monitor.os.OsStats.Mem mem;
/** /**
* Build the stats from information about each node. * Build the stats from information about each node.
*/ */
private OsStats(List<NodeInfo> nodeInfos) { private OsStats(List<NodeInfo> nodeInfos, List<NodeStats> nodeStatsList) {
this.names = new ObjectIntHashMap<>(); this.names = new ObjectIntHashMap<>();
int availableProcessors = 0; int availableProcessors = 0;
int allocatedProcessors = 0; int allocatedProcessors = 0;
@ -244,6 +245,22 @@ public class ClusterStatsNodes implements ToXContent {
} }
this.availableProcessors = availableProcessors; this.availableProcessors = availableProcessors;
this.allocatedProcessors = allocatedProcessors; this.allocatedProcessors = allocatedProcessors;
long totalMemory = 0;
long freeMemory = 0;
for (NodeStats nodeStats : nodeStatsList) {
if (nodeStats.getOs() != null) {
long total = nodeStats.getOs().getMem().getTotal().bytes();
if (total > 0) {
totalMemory += total;
}
long free = nodeStats.getOs().getMem().getFree().bytes();
if (free > 0) {
freeMemory += free;
}
}
}
this.mem = new org.elasticsearch.monitor.os.OsStats.Mem(totalMemory, freeMemory);
} }
public int getAvailableProcessors() { public int getAvailableProcessors() {
@ -254,6 +271,10 @@ public class ClusterStatsNodes implements ToXContent {
return allocatedProcessors; return allocatedProcessors;
} }
public org.elasticsearch.monitor.os.OsStats.Mem getMem() {
return mem;
}
static final class Fields { static final class Fields {
static final String AVAILABLE_PROCESSORS = "available_processors"; static final String AVAILABLE_PROCESSORS = "available_processors";
static final String ALLOCATED_PROCESSORS = "allocated_processors"; static final String ALLOCATED_PROCESSORS = "allocated_processors";
@ -274,6 +295,7 @@ public class ClusterStatsNodes implements ToXContent {
builder.endObject(); builder.endObject();
} }
builder.endArray(); builder.endArray();
mem.toXContent(builder, params);
return builder; return builder;
} }
} }

View File

@ -92,7 +92,7 @@ public class TransportClusterStatsAction extends TransportNodesAction<ClusterSta
@Override @Override
protected ClusterStatsNodeResponse nodeOperation(ClusterStatsNodeRequest nodeRequest) { protected ClusterStatsNodeResponse nodeOperation(ClusterStatsNodeRequest nodeRequest) {
NodeInfo nodeInfo = nodeService.info(true, true, false, true, false, true, false, true, false, false); NodeInfo nodeInfo = nodeService.info(true, true, false, true, false, true, false, true, false, false);
NodeStats nodeStats = nodeService.stats(CommonStatsFlags.NONE, false, true, true, false, true, false, false, false, false, false, false); NodeStats nodeStats = nodeService.stats(CommonStatsFlags.NONE, true, true, true, false, true, false, false, false, false, false, false);
List<ShardStats> shardsStats = new ArrayList<>(); List<ShardStats> shardsStats = new ArrayList<>();
for (IndexService indexService : indicesService) { for (IndexService indexService : indicesService) {
for (IndexShard indexShard : indexService) { for (IndexShard indexShard : indexService) {

View File

@ -181,6 +181,12 @@ public class ClusterStatsIT extends ESIntegTestCase {
assertThat(msg, response.nodesStats.getProcess().getMinOpenFileDescriptors(), Matchers.greaterThanOrEqualTo(-1L)); assertThat(msg, response.nodesStats.getProcess().getMinOpenFileDescriptors(), Matchers.greaterThanOrEqualTo(-1L));
assertThat(msg, response.nodesStats.getProcess().getMaxOpenFileDescriptors(), Matchers.greaterThanOrEqualTo(-1L)); assertThat(msg, response.nodesStats.getProcess().getMaxOpenFileDescriptors(), Matchers.greaterThanOrEqualTo(-1L));
assertThat(msg, response.nodesStats.getOs().getMem().getFree().bytes(), Matchers.greaterThanOrEqualTo(0L));
assertThat(msg, response.nodesStats.getOs().getMem().getTotal().bytes(), Matchers.greaterThanOrEqualTo(0L));
assertThat(msg, response.nodesStats.getOs().getMem().getUsed().bytes(), Matchers.greaterThanOrEqualTo(0L));
assertThat(msg, response.nodesStats.getOs().getMem().getUsedPercent(), Matchers.greaterThanOrEqualTo((short)0));
assertThat(msg, response.nodesStats.getOs().getMem().getFreePercent(), Matchers.greaterThanOrEqualTo((short)0));
} }
public void testAllocatedProcessors() throws Exception { public void testAllocatedProcessors() throws Exception {

View File

@ -116,7 +116,17 @@ Will return, for example:
"name": "Mac OS X", "name": "Mac OS X",
"count": 1 "count": 1
} }
] ],
"mem" : {
"total" : "16gb",
"total_in_bytes" : 17179869184,
"free" : "78.1mb",
"free_in_bytes" : 81960960,
"used" : "15.9gb",
"used_in_bytes" : 17097908224,
"free_percent" : 0,
"used_percent" : 100
}
}, },
"process": { "process": {
"cpu": { "cpu": {

View File

@ -349,7 +349,9 @@ The `setQuery(BytesReference)` method have been removed in favor of using `setQu
==== ClusterStatsResponse ==== ClusterStatsResponse
Removed the `getMemoryAvailable` method from `OsStats`, which could be previously accessed calling Removed the `getMemoryAvailable` method from `OsStats`, which could be previously accessed calling
`clusterStatsResponse.getNodesStats().getOs().getMemoryAvailable()`. `clusterStatsResponse.getNodesStats().getOs().getMemoryAvailable()`. It is now replaced with
`clusterStatsResponse.getNodesStats().getOs().getMem()` which exposes `getTotal()`, `getFree()`,
`getUsed()`, `getFreePercent()` and `getUsedPercent()`.
==== setRefresh(boolean) has been removed ==== setRefresh(boolean) has been removed

View File

@ -29,9 +29,9 @@ document exists in an index. The old endpoint will keep working until 6.0.
==== Removed `mem` section from `/_cluster/stats` response ==== Removed `mem` section from `/_cluster/stats` response
The `mem` section contained only one value, the total memory available The `mem` section contained only the `total` value, which was actually the
throughout all nodes in the cluster. The section was removed as it didn't memory available throughout all nodes in the cluster. The section contains now
prove useful. `total`, `free`, `used`, `used_percent` and `free_percent`.
==== Revised node roles aggregate returned by `/_cluster/stats` ==== Revised node roles aggregate returned by `/_cluster/stats`

View File

@ -19,6 +19,11 @@
- gte: { nodes.count.ingest: 0} - gte: { nodes.count.ingest: 0}
- gte: { nodes.count.coordinating_only: 0} - gte: { nodes.count.coordinating_only: 0}
- is_true: nodes.os - is_true: nodes.os
- is_true: nodes.os.mem.total_in_bytes
- is_true: nodes.os.mem.free_in_bytes
- is_true: nodes.os.mem.used_in_bytes
- is_true: nodes.os.mem.free_percent
- is_true: nodes.os.mem.used_percent
- is_true: nodes.process - is_true: nodes.process
- is_true: nodes.jvm - is_true: nodes.jvm
- is_true: nodes.fs - is_true: nodes.fs