package com.ibm.nmon.data.transform;
import java.util.List;
import com.ibm.nmon.data.DataRecord;
import com.ibm.nmon.data.DataSet;
import com.ibm.nmon.data.DataType;
import com.ibm.nmon.data.Process;
import com.ibm.nmon.data.ProcessDataSet;
import com.ibm.nmon.data.SubDataType;
/**
* Post processor to scale Windows <code>Process</code> CPU utilization data by the currently active
* number of CPUs.
*/
public class WindowsProcessPostProcessor implements DataPostProcessor {
private final List<DataType> processors = new java.util.ArrayList<DataType>(8);
@Override
public void addDataTypes(DataSet data) {
// get all CPUs
processors.clear();
for (DataType type : data.getTypes()) {
if ((type instanceof SubDataType)) {
SubDataType subType = ((SubDataType) type);
if (subType.getPrimaryId().equals("Processor") && !subType.getSubId().equals("Total")) {
processors.add(type);
}
}
}
}
@Override
public void postProcess(DataSet data, DataRecord record) {
if (data instanceof ProcessDataSet) {
ProcessDataSet processData = (ProcessDataSet) data;
// for each record, count the number of active CPUs
int processorCount = 0;
if (processors.isEmpty()) {
// no data => do not scale
return;
}
else {
for (DataType processorType : processors) {
if (record.hasData(processorType)) {
++processorCount;
}
}
}
// scale all the process data by the number of CPUs
for (Process process : processData.getProcesses()) {
DataType processType = processData.getType(process);
if (record.hasData(processType)) {
for (String field : processType.getFields()) {
if (field.startsWith("%")) {
// assume % Processor Time, % User Time or % Privileged Time
record.getData(processType)[processType.getFieldIndex(field)] /= processorCount;
}
}
}
}
}
}
}