package com.ibm.nmon.data.transform; 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>NETETOTAL</code> data type. This type will aggregate data for * Ethernet interfaces only. */ public final class EthernetTotalPostProcessor implements DataPostProcessor { private final String typePrefix; public EthernetTotalPostProcessor(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; int ethernetFieldCount = 3 + (hasErrors ? 4 : 0) + (hasPackets ? 3 : 0) + (hasSize ? 3 : 0); int n = 0; String[] ethernetFields = new String[ethernetFieldCount]; ethernetFields[n++] = "total-read-KB/s"; ethernetFields[n++] = "total-write-KB/s"; ethernetFields[n++] = "total-KB/s"; if (hasErrors) { ethernetFields[n++] = "total-ierrs"; ethernetFields[n++] = "total-oerrs"; ethernetFields[n++] = "total-collisions"; ethernetFields[n++] = "total-errs"; } if (hasPackets) { ethernetFields[n++] = "total-read-packets/s"; ethernetFields[n++] = "total-write-packets/s"; ethernetFields[n++] = "total-packets/s"; } if (hasSize) { ethernetFields[n++] = "total-readsize"; ethernetFields[n++] = "total-writesize"; ethernetFields[n++] = "total-size"; } data.addType(new DataType(typePrefix + "ETOTAL", typePrefix + " Ethernet grand totals", ethernetFields)); } @Override public void postProcess(DataSet data, DataRecord record) { DataType net = data.getType(typePrefix); if (net == null) { return; } if (!record.hasData(net)) { return; } DataType ethernet = data.getType(typePrefix + "ETOTAL"); 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; double[] ethernetData = new double[ethernet.getFieldCount()]; int n = 0; for (String iface : DataHelper.getInterfaces(net)) { n = 0; if (!iface.startsWith("eth") && !iface.startsWith("en")) { continue; } double read = record.getData(net, iface + "-read-KB/s"); double write = record.getData(net, iface + "-write-KB/s"); ethernetData[n++] += read; ethernetData[n++] += write; ethernetData[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"); ethernetData[n++] += ierrs; ethernetData[n++] += oerrs; ethernetData[n++] += collisions; ethernetData[n++] += ierrs + oerrs + collisions; } if (hasPackets) { read = record.getData(packet, iface + "-reads/s"); write = record.getData(packet, iface + "-writes/s"); ethernetData[n++] += read; ethernetData[n++] += write; ethernetData[n++] += read + write; } if (hasSize) { read = record.getData(size, iface + "-readsize"); write = record.getData(size, iface + "-writesize"); ethernetData[n++] += read; ethernetData[n++] += write; ethernetData[n++] += read + write; } } record.addData(ethernet, ethernetData); } }