Skip to content

Commit

Permalink
Added a FsStats.total section that sums up all stats for the differen…
Browse files Browse the repository at this point in the history
…t 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 #4344 , Closes #4343
  • Loading branch information
bleskes committed Dec 5, 2013
1 parent ecf67f3 commit 869c80d
Showing 1 changed file with 152 additions and 58 deletions.
210 changes: 152 additions & 58 deletions src/main/java/org/elasticsearch/monitor/fs/FsStats.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,15 @@
import org.elasticsearch.common.xcontent.XContentBuilderString;

import java.io.IOException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
*/
public class FsStats implements Iterable<FsStats.Info>, Streamable, ToXContent {

public static class Info implements Streamable {
public static class Info implements Streamable, ToXContent {

String path;
@Nullable
Expand Down Expand Up @@ -142,9 +144,136 @@ public double getDiskServiceTime() {
return diskServiceTime;
}

private long addLong(long current, long other) {
if (other == -1) {
return current;
}
if (current == -1) {
return other;
}
return current + other;
}

private double addDouble(double current, double other) {
if (other == -1) {
return current;
}
if (current == -1) {
return other;
}
return current + other;
}

public void add(Info info) {
total = addLong(total, info.total);
free = addLong(free, info.free);
available = addLong(available, info.available);
diskReads = addLong(diskReads, info.diskReads);
diskWrites = addLong(diskWrites, info.diskWrites);
diskReadBytes = addLong(diskReadBytes, info.diskReadBytes);
diskWriteBytes = addLong(diskWriteBytes, info.diskWriteBytes);
diskQueue = addDouble(diskQueue, info.diskQueue);
diskServiceTime = addDouble(diskServiceTime, info.diskServiceTime);
}

static final class Fields {
static final XContentBuilderString PATH = new XContentBuilderString("path");
static final XContentBuilderString MOUNT = new XContentBuilderString("mount");
static final XContentBuilderString DEV = new XContentBuilderString("dev");
static final XContentBuilderString TOTAL = new XContentBuilderString("total");
static final XContentBuilderString TOTAL_IN_BYTES = new XContentBuilderString("total_in_bytes");
static final XContentBuilderString FREE = new XContentBuilderString("free");
static final XContentBuilderString FREE_IN_BYTES = new XContentBuilderString("free_in_bytes");
static final XContentBuilderString AVAILABLE = new XContentBuilderString("available");
static final XContentBuilderString AVAILABLE_IN_BYTES = new XContentBuilderString("available_in_bytes");
static final XContentBuilderString DISK_READS = new XContentBuilderString("disk_reads");
static final XContentBuilderString DISK_WRITES = new XContentBuilderString("disk_writes");
static final XContentBuilderString DISK_IO_OP = new XContentBuilderString("disk_io_op");
static final XContentBuilderString DISK_READ_SIZE = new XContentBuilderString("disk_read_size");
static final XContentBuilderString DISK_READ_SIZE_IN_BYTES = new XContentBuilderString("disk_read_size_in_bytes");
static final XContentBuilderString DISK_WRITE_SIZE = new XContentBuilderString("disk_write_size");
static final XContentBuilderString DISK_WRITE_SIZE_IN_BYTES = new XContentBuilderString("disk_write_size_in_bytes");
static final XContentBuilderString DISK_IO_SIZE = new XContentBuilderString("disk_io_size");
static final XContentBuilderString DISK_IO_IN_BYTES = new XContentBuilderString("disk_io_size_in_bytes");
static final XContentBuilderString DISK_QUEUE = new XContentBuilderString("disk_queue");
static final XContentBuilderString DISK_SERVICE_TIME = new XContentBuilderString("disk_service_time");
}

@Override
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject();
if (path != null) {
builder.field(Fields.PATH, path, XContentBuilder.FieldCaseConversion.NONE);
}
if (mount != null) {
builder.field(Fields.MOUNT, mount, XContentBuilder.FieldCaseConversion.NONE);
}
if (dev != null) {
builder.field(Fields.DEV, dev, XContentBuilder.FieldCaseConversion.NONE);
}

if (total != -1) {
builder.byteSizeField(Fields.TOTAL_IN_BYTES, Fields.TOTAL, total);
}
if (free != -1) {
builder.byteSizeField(Fields.FREE_IN_BYTES, Fields.FREE, free);
}
if (available != -1) {
builder.byteSizeField(Fields.AVAILABLE_IN_BYTES, Fields.AVAILABLE, available);
}

long iop = -1;

if (diskReads != -1) {
iop = diskReads;
builder.field(Fields.DISK_READS, diskReads);
}
if (diskWrites != -1) {
if (iop != -1) {
iop += diskWrites;
} else {
iop = diskWrites;
}
builder.field(Fields.DISK_WRITES, diskWrites);
}

if (iop != -1) {
builder.field(Fields.DISK_IO_OP, iop);
}

long ioBytes = -1;

if (diskReadBytes != -1) {
ioBytes = diskReadBytes;
builder.byteSizeField(Fields.DISK_READ_SIZE_IN_BYTES, Fields.DISK_READ_SIZE, diskReadBytes);
}
if (diskWriteBytes != -1) {
if (ioBytes != -1) {
ioBytes += diskWriteBytes;
} else {
ioBytes = diskWriteBytes;
}
builder.byteSizeField(Fields.DISK_WRITE_SIZE_IN_BYTES, Fields.DISK_WRITE_SIZE, diskWriteBytes);
}

if (ioBytes != -1) {
builder.byteSizeField(Fields.DISK_IO_IN_BYTES, Fields.DISK_IO_SIZE, ioBytes);
}

if (diskQueue != -1) {
builder.field(Fields.DISK_QUEUE, Strings.format1Decimals(diskQueue, ""));
}
if (diskServiceTime != -1) {
builder.field(Fields.DISK_SERVICE_TIME, Strings.format1Decimals(diskServiceTime, ""));
}

builder.endObject();
return builder;
}
}

long timestamp;
Info total;
Info[] infos;

FsStats() {
Expand All @@ -154,6 +283,25 @@ public double getDiskServiceTime() {
FsStats(long timestamp, Info[] infos) {
this.timestamp = timestamp;
this.infos = infos;
this.total = null;
}

public Info total() {
if (total != null) {
return total;
}
Info res = new Info();
Set<String> seenDevices = new HashSet<String>(infos.length);
for (Info subInfo : infos) {
if (subInfo.dev != null) {
if (!seenDevices.add(subInfo.dev)) {
continue; // already added numbers for this device;
}
}
res.add(subInfo);
}
total = res;
return res;
}

public long getTimestamp() {
Expand Down Expand Up @@ -194,72 +342,18 @@ static final class Fields {
static final XContentBuilderString FS = new XContentBuilderString("fs");
static final XContentBuilderString TIMESTAMP = new XContentBuilderString("timestamp");
static final XContentBuilderString DATA = new XContentBuilderString("data");
static final XContentBuilderString PATH = new XContentBuilderString("path");
static final XContentBuilderString MOUNT = new XContentBuilderString("mount");
static final XContentBuilderString DEV = new XContentBuilderString("dev");
static final XContentBuilderString TOTAL = new XContentBuilderString("total");
static final XContentBuilderString TOTAL_IN_BYTES = new XContentBuilderString("total_in_bytes");
static final XContentBuilderString FREE = new XContentBuilderString("free");
static final XContentBuilderString FREE_IN_BYTES = new XContentBuilderString("free_in_bytes");
static final XContentBuilderString AVAILABLE = new XContentBuilderString("available");
static final XContentBuilderString AVAILABLE_IN_BYTES = new XContentBuilderString("available_in_bytes");
static final XContentBuilderString DISK_READS = new XContentBuilderString("disk_reads");
static final XContentBuilderString DISK_WRITES = new XContentBuilderString("disk_writes");
static final XContentBuilderString DISK_READ_SIZE = new XContentBuilderString("disk_read_size");
static final XContentBuilderString DISK_READ_SIZE_IN_BYTES = new XContentBuilderString("disk_read_size_in_bytes");
static final XContentBuilderString DISK_WRITE_SIZE = new XContentBuilderString("disk_write_size");
static final XContentBuilderString DISK_WRITE_SIZE_IN_BYTES = new XContentBuilderString("disk_write_size_in_bytes");
static final XContentBuilderString DISK_QUEUE = new XContentBuilderString("disk_queue");
static final XContentBuilderString DISK_SERVICE_TIME = new XContentBuilderString("disk_service_time");
}

@Override
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject(Fields.FS);
builder.field(Fields.TIMESTAMP, timestamp);
builder.field(Fields.TOTAL);
total().toXContent(builder, params);
builder.startArray(Fields.DATA);
for (Info info : infos) {
builder.startObject();
builder.field(Fields.PATH, info.path, XContentBuilder.FieldCaseConversion.NONE);
if (info.mount != null) {
builder.field(Fields.MOUNT, info.mount, XContentBuilder.FieldCaseConversion.NONE);
}
if (info.dev != null) {
builder.field(Fields.DEV, info.dev, XContentBuilder.FieldCaseConversion.NONE);
}

if (info.total != -1) {
builder.byteSizeField(Fields.TOTAL_IN_BYTES, Fields.TOTAL, info.total);
}
if (info.free != -1) {
builder.byteSizeField(Fields.FREE_IN_BYTES, Fields.FREE, info.free);
}
if (info.available != -1) {
builder.byteSizeField(Fields.AVAILABLE_IN_BYTES, Fields.AVAILABLE, info.available);
}

if (info.diskReads != -1) {
builder.field(Fields.DISK_READS, info.diskReads);
}
if (info.diskWrites != -1) {
builder.field(Fields.DISK_WRITES, info.diskWrites);
}

if (info.diskReadBytes != -1) {
builder.byteSizeField(Fields.DISK_READ_SIZE_IN_BYTES, Fields.DISK_READ_SIZE, info.getDiskReadSizeInBytes());
}
if (info.diskWriteBytes != -1) {
builder.byteSizeField(Fields.DISK_WRITE_SIZE_IN_BYTES, Fields.DISK_WRITE_SIZE, info.getDiskWriteSizeInBytes());
}

if (info.diskQueue != -1) {
builder.field(Fields.DISK_QUEUE, Strings.format1Decimals(info.diskQueue, ""));
}
if (info.diskServiceTime != -1) {
builder.field(Fields.DISK_SERVICE_TIME, Strings.format1Decimals(info.diskServiceTime, ""));
}

builder.endObject();
info.toXContent(builder, params);
}
builder.endArray();
builder.endObject();
Expand Down

0 comments on commit 869c80d

Please sign in to comment.