Skip to content

Commit 0e78404

Browse files
committed
Added a FsStats.total section that sums up all stats for the different path.dirs. Added disk_io_size and disk_io_op to the toXContent output, summing up disk_read_size+disk_write_size and disk_writes+disk_reads respectively.
Closes elastic#4344 , Closes elastic#4343
1 parent 2da0611 commit 0e78404

File tree

1 file changed

+152
-58
lines changed

1 file changed

+152
-58
lines changed

src/main/java/org/elasticsearch/monitor/fs/FsStats.java

Lines changed: 152 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,15 @@
3131
import org.elasticsearch.common.xcontent.XContentBuilderString;
3232

3333
import java.io.IOException;
34+
import java.util.HashSet;
3435
import java.util.Iterator;
36+
import java.util.Set;
3537

3638
/**
3739
*/
3840
public class FsStats implements Iterable<FsStats.Info>, Streamable, ToXContent {
3941

40-
public static class Info implements Streamable {
42+
public static class Info implements Streamable, ToXContent {
4143

4244
String path;
4345
@Nullable
@@ -142,9 +144,136 @@ public double getDiskServiceTime() {
142144
return diskServiceTime;
143145
}
144146

147+
private long addLong(long current, long other) {
148+
if (other == -1) {
149+
return current;
150+
}
151+
if (current == -1) {
152+
return other;
153+
}
154+
return current + other;
155+
}
156+
157+
private double addDouble(double current, double other) {
158+
if (other == -1) {
159+
return current;
160+
}
161+
if (current == -1) {
162+
return other;
163+
}
164+
return current + other;
165+
}
166+
167+
public void add(Info info) {
168+
total = addLong(total, info.total);
169+
free = addLong(free, info.free);
170+
available = addLong(available, info.available);
171+
diskReads = addLong(diskReads, info.diskReads);
172+
diskWrites = addLong(diskWrites, info.diskWrites);
173+
diskReadBytes = addLong(diskReadBytes, info.diskReadBytes);
174+
diskWriteBytes = addLong(diskWriteBytes, info.diskWriteBytes);
175+
diskQueue = addDouble(diskQueue, info.diskQueue);
176+
diskServiceTime = addDouble(diskServiceTime, info.diskServiceTime);
177+
}
178+
179+
static final class Fields {
180+
static final XContentBuilderString PATH = new XContentBuilderString("path");
181+
static final XContentBuilderString MOUNT = new XContentBuilderString("mount");
182+
static final XContentBuilderString DEV = new XContentBuilderString("dev");
183+
static final XContentBuilderString TOTAL = new XContentBuilderString("total");
184+
static final XContentBuilderString TOTAL_IN_BYTES = new XContentBuilderString("total_in_bytes");
185+
static final XContentBuilderString FREE = new XContentBuilderString("free");
186+
static final XContentBuilderString FREE_IN_BYTES = new XContentBuilderString("free_in_bytes");
187+
static final XContentBuilderString AVAILABLE = new XContentBuilderString("available");
188+
static final XContentBuilderString AVAILABLE_IN_BYTES = new XContentBuilderString("available_in_bytes");
189+
static final XContentBuilderString DISK_READS = new XContentBuilderString("disk_reads");
190+
static final XContentBuilderString DISK_WRITES = new XContentBuilderString("disk_writes");
191+
static final XContentBuilderString DISK_IO_OP = new XContentBuilderString("disk_io_op");
192+
static final XContentBuilderString DISK_READ_SIZE = new XContentBuilderString("disk_read_size");
193+
static final XContentBuilderString DISK_READ_SIZE_IN_BYTES = new XContentBuilderString("disk_read_size_in_bytes");
194+
static final XContentBuilderString DISK_WRITE_SIZE = new XContentBuilderString("disk_write_size");
195+
static final XContentBuilderString DISK_WRITE_SIZE_IN_BYTES = new XContentBuilderString("disk_write_size_in_bytes");
196+
static final XContentBuilderString DISK_IO_SIZE = new XContentBuilderString("disk_io_size");
197+
static final XContentBuilderString DISK_IO_IN_BYTES = new XContentBuilderString("disk_io_size_in_bytes");
198+
static final XContentBuilderString DISK_QUEUE = new XContentBuilderString("disk_queue");
199+
static final XContentBuilderString DISK_SERVICE_TIME = new XContentBuilderString("disk_service_time");
200+
}
201+
202+
@Override
203+
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
204+
builder.startObject();
205+
if (path != null) {
206+
builder.field(Fields.PATH, path, XContentBuilder.FieldCaseConversion.NONE);
207+
}
208+
if (mount != null) {
209+
builder.field(Fields.MOUNT, mount, XContentBuilder.FieldCaseConversion.NONE);
210+
}
211+
if (dev != null) {
212+
builder.field(Fields.DEV, dev, XContentBuilder.FieldCaseConversion.NONE);
213+
}
214+
215+
if (total != -1) {
216+
builder.byteSizeField(Fields.TOTAL_IN_BYTES, Fields.TOTAL, total);
217+
}
218+
if (free != -1) {
219+
builder.byteSizeField(Fields.FREE_IN_BYTES, Fields.FREE, free);
220+
}
221+
if (available != -1) {
222+
builder.byteSizeField(Fields.AVAILABLE_IN_BYTES, Fields.AVAILABLE, available);
223+
}
224+
225+
long iop = -1;
226+
227+
if (diskReads != -1) {
228+
iop = diskReads;
229+
builder.field(Fields.DISK_READS, diskReads);
230+
}
231+
if (diskWrites != -1) {
232+
if (iop != -1) {
233+
iop += diskWrites;
234+
} else {
235+
iop = diskWrites;
236+
}
237+
builder.field(Fields.DISK_WRITES, diskWrites);
238+
}
239+
240+
if (iop != -1) {
241+
builder.field(Fields.DISK_IO_OP, iop);
242+
}
243+
244+
long ioBytes = -1;
245+
246+
if (diskReadBytes != -1) {
247+
ioBytes = diskReadBytes;
248+
builder.byteSizeField(Fields.DISK_READ_SIZE_IN_BYTES, Fields.DISK_READ_SIZE, diskReadBytes);
249+
}
250+
if (diskWriteBytes != -1) {
251+
if (ioBytes != -1) {
252+
ioBytes += diskWriteBytes;
253+
} else {
254+
ioBytes = diskWriteBytes;
255+
}
256+
builder.byteSizeField(Fields.DISK_WRITE_SIZE_IN_BYTES, Fields.DISK_WRITE_SIZE, diskWriteBytes);
257+
}
258+
259+
if (ioBytes != -1) {
260+
builder.byteSizeField(Fields.DISK_IO_IN_BYTES, Fields.DISK_IO_SIZE, ioBytes);
261+
}
262+
263+
if (diskQueue != -1) {
264+
builder.field(Fields.DISK_QUEUE, Strings.format1Decimals(diskQueue, ""));
265+
}
266+
if (diskServiceTime != -1) {
267+
builder.field(Fields.DISK_SERVICE_TIME, Strings.format1Decimals(diskServiceTime, ""));
268+
}
269+
270+
builder.endObject();
271+
return builder;
272+
}
145273
}
146274

147275
long timestamp;
276+
Info total;
148277
Info[] infos;
149278

150279
FsStats() {
@@ -154,6 +283,25 @@ public double getDiskServiceTime() {
154283
FsStats(long timestamp, Info[] infos) {
155284
this.timestamp = timestamp;
156285
this.infos = infos;
286+
this.total = null;
287+
}
288+
289+
public Info total() {
290+
if (total != null) {
291+
return total;
292+
}
293+
Info res = new Info();
294+
Set<String> seenDevices = new HashSet<String>(infos.length);
295+
for (Info subInfo : infos) {
296+
if (subInfo.dev != null) {
297+
if (!seenDevices.add(subInfo.dev)) {
298+
continue; // already added numbers for this device;
299+
}
300+
}
301+
res.add(subInfo);
302+
}
303+
total = res;
304+
return res;
157305
}
158306

159307
public long getTimestamp() {
@@ -194,72 +342,18 @@ static final class Fields {
194342
static final XContentBuilderString FS = new XContentBuilderString("fs");
195343
static final XContentBuilderString TIMESTAMP = new XContentBuilderString("timestamp");
196344
static final XContentBuilderString DATA = new XContentBuilderString("data");
197-
static final XContentBuilderString PATH = new XContentBuilderString("path");
198-
static final XContentBuilderString MOUNT = new XContentBuilderString("mount");
199-
static final XContentBuilderString DEV = new XContentBuilderString("dev");
200345
static final XContentBuilderString TOTAL = new XContentBuilderString("total");
201-
static final XContentBuilderString TOTAL_IN_BYTES = new XContentBuilderString("total_in_bytes");
202-
static final XContentBuilderString FREE = new XContentBuilderString("free");
203-
static final XContentBuilderString FREE_IN_BYTES = new XContentBuilderString("free_in_bytes");
204-
static final XContentBuilderString AVAILABLE = new XContentBuilderString("available");
205-
static final XContentBuilderString AVAILABLE_IN_BYTES = new XContentBuilderString("available_in_bytes");
206-
static final XContentBuilderString DISK_READS = new XContentBuilderString("disk_reads");
207-
static final XContentBuilderString DISK_WRITES = new XContentBuilderString("disk_writes");
208-
static final XContentBuilderString DISK_READ_SIZE = new XContentBuilderString("disk_read_size");
209-
static final XContentBuilderString DISK_READ_SIZE_IN_BYTES = new XContentBuilderString("disk_read_size_in_bytes");
210-
static final XContentBuilderString DISK_WRITE_SIZE = new XContentBuilderString("disk_write_size");
211-
static final XContentBuilderString DISK_WRITE_SIZE_IN_BYTES = new XContentBuilderString("disk_write_size_in_bytes");
212-
static final XContentBuilderString DISK_QUEUE = new XContentBuilderString("disk_queue");
213-
static final XContentBuilderString DISK_SERVICE_TIME = new XContentBuilderString("disk_service_time");
214346
}
215347

216348
@Override
217349
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
218350
builder.startObject(Fields.FS);
219351
builder.field(Fields.TIMESTAMP, timestamp);
352+
builder.field(Fields.TOTAL);
353+
total().toXContent(builder, params);
220354
builder.startArray(Fields.DATA);
221355
for (Info info : infos) {
222-
builder.startObject();
223-
builder.field(Fields.PATH, info.path, XContentBuilder.FieldCaseConversion.NONE);
224-
if (info.mount != null) {
225-
builder.field(Fields.MOUNT, info.mount, XContentBuilder.FieldCaseConversion.NONE);
226-
}
227-
if (info.dev != null) {
228-
builder.field(Fields.DEV, info.dev, XContentBuilder.FieldCaseConversion.NONE);
229-
}
230-
231-
if (info.total != -1) {
232-
builder.byteSizeField(Fields.TOTAL_IN_BYTES, Fields.TOTAL, info.total);
233-
}
234-
if (info.free != -1) {
235-
builder.byteSizeField(Fields.FREE_IN_BYTES, Fields.FREE, info.free);
236-
}
237-
if (info.available != -1) {
238-
builder.byteSizeField(Fields.AVAILABLE_IN_BYTES, Fields.AVAILABLE, info.available);
239-
}
240-
241-
if (info.diskReads != -1) {
242-
builder.field(Fields.DISK_READS, info.diskReads);
243-
}
244-
if (info.diskWrites != -1) {
245-
builder.field(Fields.DISK_WRITES, info.diskWrites);
246-
}
247-
248-
if (info.diskReadBytes != -1) {
249-
builder.byteSizeField(Fields.DISK_READ_SIZE_IN_BYTES, Fields.DISK_READ_SIZE, info.getDiskReadSizeInBytes());
250-
}
251-
if (info.diskWriteBytes != -1) {
252-
builder.byteSizeField(Fields.DISK_WRITE_SIZE_IN_BYTES, Fields.DISK_WRITE_SIZE, info.getDiskWriteSizeInBytes());
253-
}
254-
255-
if (info.diskQueue != -1) {
256-
builder.field(Fields.DISK_QUEUE, Strings.format1Decimals(info.diskQueue, ""));
257-
}
258-
if (info.diskServiceTime != -1) {
259-
builder.field(Fields.DISK_SERVICE_TIME, Strings.format1Decimals(info.diskServiceTime, ""));
260-
}
261-
262-
builder.endObject();
356+
info.toXContent(builder, params);
263357
}
264358
builder.endArray();
265359
builder.endObject();

0 commit comments

Comments
 (0)