*/
public ProcessTrace getPerformanceReport() {
Map perfReport = cpEngine.getStats();
Progress[] colReaderProgress = (Progress[]) perfReport.get("COLLECTION_READER_PROGRESS");
ProcessTrace processTrace = new ProcessTrace_impl(cpEngine.getPerformanceTuningSettings());
if (UIMAFramework.getLogger().isLoggable(Level.FINEST)) {
UIMAFramework.getLogger(this.getClass()).log(Level.FINEST,
"-------------------------------------------");
}
if (useJediiReport) {
try {
synchronized (procTr) {
List eventList = procTr.getEvents();
for (int j = 0; eventList != null && j < eventList.size(); j++) {
ProcessTraceEvent prEvent = (ProcessTraceEvent) eventList.get(j);
processTrace.addEvent(prEvent);
}
}
return processTrace;
} catch (Exception e) {
e.printStackTrace();
}
}
if (defaultProcessTrace) {
createDefaultProcessTrace(getCasProcessors(), procTr, processTrace);
return processTrace;
}
try {
// To facilitate recovery from CPM untimely shutdown ( due to external STOP), it must
// have access to last entity id. CollectionReader will use this marker to synch itself
// up to the last known entity before the CPM shut itself down. More complicated
// recovery mechanism may be supported as long as CAS METADATA contains information
// about the last known point. For example, in case WF Large Store the cas must
// hold the entire EDATA frame, containing restart information. Its up to the
// CollectionReader to know what part of the CAS Metadata should be used for recovery.
// The "last cas" CasMetaData is added after each successfull read from the CollectionReader
// by the cpEngine in its run() processing loop.
CasMetaData casMetaData = (CasMetaData) perfReport.get("CPM_LAST_CAS_METADATA");
if (casMetaData != null) {
NameValuePair[] nvp = casMetaData.getCasMetaData();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < nvp.length && nvp[i] != null; i++) {
if (i != 0) {
// Add separator between name-value pairs. StringTokenizer will parse this string
// and will use the separator to extract nvp.
sb.append(",");
}
sb.append(nvp[i].getName() + "=" + (String) nvp[i].getValue());
}
processTrace.addEvent("CPM", "CPM_LAST_CAS_METADATA", sb.toString(), 0, null);
}
List eList = null;
synchronized (procTr) {
eList = procTr.getEventsByComponentName("CPM", true);
}
if (!useJediiReport) {
copyComponentEvents("CPM PROCESSING TIME", eList, processTrace);
}
eList.clear();
if (colReaderProgress != null) {
Long totalCollectionReaderTime = (Long) perfReport.get("COLLECTION_READER_TIME");
String readerName = collectionReader.getProcessingResourceMetaData().getName();
if (totalCollectionReaderTime != null) {
processTrace.addEvent(readerName, "COLLECTION_READER_TIME", String
.valueOf(totalCollectionReaderTime), 0, null);
}
for (int i = 0; i < colReaderProgress.length; i++) {
if (Progress.BYTES.equals(colReaderProgress[i].getUnit())) {
processTrace.addEvent(readerName, Constants.COLLECTION_READER_BYTES_PROCESSED, String
.valueOf(colReaderProgress[i].getCompleted()), 0, null);
} else if (Progress.ENTITIES.equals(colReaderProgress[i].getUnit())) {
processTrace.addEvent(readerName, Constants.COLLECTION_READER_DOCS_PROCESSED, String
.valueOf(colReaderProgress[i].getCompleted()), 0, null);
}
}
synchronized (procTr) {
eList = procTr.getEventsByComponentName(readerName, true);
}
copyComponentEvents("COLLECTION READER PROCESSING TIME", eList, processTrace);
eList.clear();
processTrace.addEvent(readerName, "Last Entity ID Read", cpEngine.getLastProcessedDocId(),
0, null);
}
LinkedList processors = cpEngine.getAllProcessingContainers();
for (int i = 0; i < processors.size(); i++) {
ProcessingContainer container = (ProcessingContainer) processors.get(i);
synchronized (procTr) {
eList = procTr.getEventsByComponentName(container.getName(), true);
}
copyComponentEvents("Process", eList, processTrace);
processTrace.addEvent(container.getName(), "Documents Processed", String.valueOf(container
.getProcessed()), 0, null);
String status = decodeStatus(container.getStatus());
processTrace.addEvent(container.getName(), "Processor Status", status, 0, null);
long bytesIn = container.getBytesIn();
processTrace.addEvent(container.getName(), "Processor BYTESIN", String.valueOf(bytesIn), 0,
null);
long bytesOut = container.getBytesOut();
processTrace.addEvent(container.getName(), "Processor BYTESOUT", String.valueOf(bytesOut),
0, null);
int restartCount = container.getRestartCount();
processTrace.addEvent(container.getName(), "Processor Restarts", String
.valueOf(restartCount), 0, null);
int retryCount = container.getRetryCount();
processTrace.addEvent(container.getName(), "Processor Retries", String.valueOf(retryCount),
0, null);
int filteredCount = container.getFilteredCount();
processTrace.addEvent(container.getName(), "Filtered Entities", String
.valueOf(filteredCount), 0, null);
long remainingCount = container.getRemaining();
processTrace.addEvent(container.getName(), "Processor Remaining", String
.valueOf(remainingCount), 0, null);
HashMap aMap = container.getAllStats();
if (aMap.keySet() != null) {
if (System.getProperty("SHOW_CUSTOM_STATS") != null)
UIMAFramework.getLogger(this.getClass()).log(Level.FINEST, "Adding Custom Stats");
Iterator it = aMap.keySet().iterator();
while (it != null && it.hasNext()) {
String key = (String) it.next();
if (key != null) {
Object o = aMap.get(key);
if (o instanceof String) {
processTrace.addEvent(container.getName(), key, (String) o, 0, null);
if (System.getProperty("SHOW_CUSTOM_STATS") != null)
UIMAFramework.getLogger(this.getClass()).log(Level.FINEST,
"Custom String Stat-" + key + " Value=" + (String) o);
} else if (o instanceof Integer) {
processTrace.addEvent(container.getName(), key, String.valueOf(((Integer) o)
.intValue()), 0, null);
if (System.getProperty("SHOW_CUSTOM_STATS") != null)
UIMAFramework.getLogger(this.getClass()).log(Level.FINEST,
"Custom Integer Stat-" + key + " Value=" + ((Integer) o).intValue());
} else {
if (UIMAFramework.getLogger().isLoggable(Level.FINEST)) {
UIMAFramework.getLogger(this.getClass()).log(
Level.FINEST,
"Invalid Type Found When Generating Status For " + key + ". Type::"
+ o.getClass().getName()
+ " Not supported. Use Integer or String instead.");
}
}
}
}
}
try {
String lastDocId = container.getLastProcessedEntityId();
if (lastDocId != null) {
processTrace.addEvent(container.getName(), "Processor Last EntityId", lastDocId, 0,
null);
}
} catch (Exception e) {
e.printStackTrace();
}