package com.ibm.nmon.data.transform;
import java.util.Set;
import com.ibm.nmon.data.DataSet;
import com.ibm.nmon.data.DataType;
import com.ibm.nmon.data.DataRecord;
import com.ibm.nmon.util.DataHelper;
/**
* Post processor that adds a <code>TOTAL</code> data type for network data. This type will have
* <code>KB/s</code>, <code>errs</code>, <code>packets</code> and <code>size</code> (KB per packet)
* fields for each interface if the data exists for each interface.
*/
public final class NetworkTotalPostProcessor implements DataPostProcessor {
private final String typePrefix;
public NetworkTotalPostProcessor(String typePrefix) {
if ((typePrefix == null) || typePrefix.equals("")) {
throw new IllegalArgumentException("typePrefix cannot be null");
}
this.typePrefix = typePrefix;
}
@Override
public void addDataTypes(DataSet data) {
DataType net = data.getType(typePrefix);
if (net == null) {
return;
}
DataType error = data.getType(typePrefix + "ERROR");
DataType packet = data.getType(typePrefix + "PACKET");
DataType size = data.getType(typePrefix + "SIZE");
boolean hasErrors = error != null;
boolean hasPackets = packet != null;
boolean hasSize = size != null;
Set<String> ifaces = DataHelper.getInterfaces(net);
int totalFieldCount = (1 + (hasErrors ? 1 : 0) + (hasPackets ? 1 : 0) + (hasSize ? 1 : 0)) * ifaces.size();
String[] totalFields = new String[totalFieldCount];
int n = 0;
for (String iface : ifaces) {
totalFields[n++] = iface + "-KB/s";
if (hasErrors) {
totalFields[n++] = iface + "-errs";
}
if (hasPackets) {
totalFields[n++] = iface + "-packets/s";
}
if (hasSize) {
totalFields[n++] = iface + "-size";
}
}
data.addType(new DataType(typePrefix + "TOTAL", typePrefix + " Totals", totalFields));
}
@Override
public void postProcess(DataSet data, DataRecord record) {
DataType net = data.getType(typePrefix);
if (net == null) {
return;
}
if (!record.hasData(net)) {
return;
}
DataType total = data.getType(typePrefix + "TOTAL");
DataType error = data.getType(typePrefix + "ERROR");
DataType packet = data.getType(typePrefix + "PACKET");
DataType size = data.getType(typePrefix + "SIZE");
boolean hasErrors = error != null;
boolean hasPackets = packet != null;
boolean hasSize = size != null;
Set<String> ifaces = DataHelper.getInterfaces(net);
double[] totalData = new double[total.getFieldCount()];
int n = 0;
for (String iface : ifaces) {
double read = record.getData(net, iface + "-read-KB/s");
double write = record.getData(net, iface + "-write-KB/s");
totalData[n++] = read + write;
if (hasErrors) {
double ierrs = record.getData(error, iface + "-ierrs");
double oerrs = record.getData(error, iface + "-oerrs");
double collisions = record.getData(error, iface + "-collisions");
totalData[n++] = ierrs + oerrs + collisions;
}
if (hasPackets) {
read = record.getData(packet, iface + "-reads/s");
write = record.getData(packet, iface + "-writes/s");
totalData[n++] = read + write;
}
if (hasSize) {
read = record.getData(size, iface + "-readsize");
write = record.getData(size, iface + "-writesize");
totalData[n++] = read + write;
}
}
record.addData(total, totalData);
}
}