package com.ibm.nmon.data.transform;
import com.ibm.nmon.data.DataType;
/**
* Changes the EC_Idle% and VP_Idle% metric for AIX LPARs to CPU% (i.e. Usr% + Sys%).
*/
public final class AIXLPARTransform implements DataTransform {
@Override
public DataType buildDataType(String id, String subId, String name, String... fields) {
String[] newFields = null;
if (java.util.Arrays.binarySearch(fields, "Folded") != -1) {
newFields = new String[fields.length + 2];
}
else {
newFields = new String[fields.length + 1];
}
for (int i = 0, j = 0; i < fields.length; i++, j++) {
String field = fields[i];
if (("EC" + "_Idle%").equals(field)) {
newFields[j] = "EC" + "_CPU%";
}
else if (("VP" + "_Idle%").equals(field)) {
newFields[j] = "VP" + "_CPU%";
}
else if ("Folded".equals(field)) {
newFields[j] = field;
newFields[++j] = "Unfolded";
}
else {
newFields[j] = field;
}
}
newFields[newFields.length - 1] = "OtherLPARs";
return new DataType(id, name, newFields);
}
@Override
public double[] transform(DataType type, double[] data) {
double[] newData = new double[type.getFieldCount()];
for (int i = 0, j = 0; i < data.length; i++, j++) {
// replacing idle with busy so the index is the same
// note data type field name was changed in buildDataType so retrieve with new name!
String field = type.getField(j);
if (field.equals("EC" + "_CPU%")) {
newData[j] = data[type.getFieldIndex("EC" + "_User%")] + data[type.getFieldIndex("EC" + "_Sys%")];
}
else if (field.equals("VP" + "_CPU%")) {
newData[j] = data[type.getFieldIndex("VP" + "_User%")] + data[type.getFieldIndex("VP" + "_Sys%")];
}
else if (field.equals("Unfolded")) {
// Unfolded is the virtual CPU count minus the folded count
newData[j] = data[type.getFieldIndex("virtualCPUs")] - data[type.getFieldIndex("Folded")];
i--;
}
else {
newData[j] = data[i];
}
}
// OtherLPARs = total pool CPUs - idle CPU - this LPAR's CPU
newData[newData.length - 1] = data[type.getFieldIndex("poolCPUs")] - data[type.getFieldIndex("PoolIdle")]
- data[type.getFieldIndex("PhysicalCPU")];
return newData;
}
@Override
public boolean isValidFor(String typeId, String subId) {
return "LPAR".equals(typeId);
}
}