in uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandler.java [1547:1691]
private void handleDuccServletJobPerformanceData(String target,Request baseRequest,HttpServletRequest request,HttpServletResponse response)
throws IOException, ServletException
{
String methodName = "handleDuccServletJobPerformanceData";
duccLogger.trace(methodName, null, messages.fetch("enter"));
StringBuffer sb = new StringBuffer();
String jobNo = request.getParameter("id");
DuccWorkJob job = getJob(jobNo);
if(job != null) {
try {
EffectiveUser eu = EffectiveUser.create(request);
PerformanceSummary performanceSummary = new PerformanceSummary(job.getLogDirectory()+jobNo);
PerformanceMetricsSummaryMap performanceMetricsSummaryMap = performanceSummary.readSummary(eu.get());
dumpMap(performanceMetricsSummaryMap);
if (performanceMetricsSummaryMap == null) {
sb.append(eu.isLoggedin() ? "(data missing or unreadable)" : "(not visible - try logging in)");
} else if (performanceMetricsSummaryMap.size() == 0) {
sb.append("(no performance metrics)");
}
else {
int casCount = performanceMetricsSummaryMap.casCount();
ArrayList <UimaStatistic> uimaStats = new ArrayList<UimaStatistic>();
uimaStats.clear();
long analysisTime = 0;
PerformanceMetricsSummaryItem summaryValues = null;
for (Entry<String, PerformanceMetricsSummaryItem> entry : performanceMetricsSummaryMap.entrySet()) {
PerformanceMetricsSummaryItem item = entry.getValue();
// UIMA-4641 Totals are passed as if a delegate with an empty name
if (entry.getKey().isEmpty()) {
summaryValues = item;
continue;
}
String shortname = item.getDisplayName();
long anTime = item.getAnalysisTime();
long anMinTime = item.getAnalysisTimeMin();
long anMaxTime = item.getAnalysisTimeMax();
long anTasks = item.getAnalysisTasks();
analysisTime += anTime;
UimaStatistic stat = new UimaStatistic(shortname, entry.getKey(), anTime, anMinTime, anMaxTime, anTasks);
uimaStats.add(stat);
}
Collections.sort(uimaStats);
int numstats = uimaStats.size();
DecimalFormat formatter = new DecimalFormat("##0.0");
// pass 1
int counter = 0;
sb.append(trGet(counter++));
// Totals
sb.append("<td>");
sb.append("<i><b>Summary</b></i>");
long ltime = 0;
// Total
sb.append("<td align=\"right\">");
if (summaryValues != null) {
analysisTime = summaryValues.getAnalysisTime();
}
sb.append(FormatHelper.duration(analysisTime,Precision.Tenths));
// % of Total
sb.append("<td align=\"right\">");
sb.append(formatter.format(100));
// Avg
sb.append("<td align=\"right\">");
sb.append("<span class=\"health_purple\" title=\"average processing time per completed work item\">");
long avgMillis = 0;
if(casCount > 0) {
avgMillis = analysisTime / casCount; // No need to round up as will display only 10ths
}
sb.append(FormatHelper.duration(avgMillis,Precision.Tenths));
sb.append("</span>");
// Min
sb.append("<td align=\"right\">");
sb.append("<span class=\"health_purple\" title=\"minimum processing time for any completed work item\">");
if (summaryValues != null) {
ltime = summaryValues.getAnalysisTimeMin();
} else {
ltime = job.getWiMillisMin();
}
sb.append(FormatHelper.duration(ltime,Precision.Tenths));
sb.append("</span>");
// Max
sb.append("<td align=\"right\">");
sb.append("<span class=\"health_purple\" title=\"maximum processing time for any completed work item\">");
if (summaryValues != null) {
ltime = summaryValues.getAnalysisTimeMax();
} else {
ltime = job.getWiMillisMax();
}
sb.append(FormatHelper.duration(ltime,Precision.Tenths));
sb.append("</span>");
// Tasks
sb.append("<td align=\"right\">");
sb.append("<span class=\"health_purple\" title=\"number of tasks per completed work item\">");
sb.append(""+"N/A");
sb.append("</span>");
// pass 2
for (int i = 0; i < numstats; ++i) {
sb.append(trGet(counter++));
String title = "title="+"\""+uimaStats.get(i).getLongName()+"\"";
sb.append("<td "+title+">");
sb.append(uimaStats.get(i).getShortName());
double time;
// Total
sb.append("<td align=\"right\">");
time = uimaStats.get(i).getAnalysisTime();
ltime = (long)time;
sb.append(FormatHelper.duration(ltime,Precision.Tenths));
// % of Total
sb.append("<td align=\"right\">");
double dtime = (time/analysisTime)*100;
sb.append(formatter.format(dtime));
// Avg
sb.append("<td align=\"right\">");
time = time/casCount;
ltime = (long)time;
sb.append(FormatHelper.duration(ltime,Precision.Tenths));
// Min
sb.append("<td align=\"right\">");
time = uimaStats.get(i).getAnalysisMinTime();
ltime = (long)time;
sb.append(FormatHelper.duration(ltime,Precision.Tenths));
// Max
sb.append("<td align=\"right\">");
time = uimaStats.get(i).getAnalysisMaxTime();
ltime = (long)time;
sb.append(FormatHelper.duration(ltime,Precision.Tenths));
// Tasks
sb.append("<td align=\"right\">");
long lnumTasks = (long)(uimaStats.get(i).getAnalysisTasks());
sb.append(""+lnumTasks);
}
}
}
catch(Exception e) {
duccLogger.warn(methodName, null, e);
//sb = new StringBuffer();
sb.append("no accessible data ("+e+")");
}
}
else {
sb.append("no accessible data (no job?)");
}
response.getWriter().println(sb);
duccLogger.trace(methodName, null, messages.fetch("exit"));
}