private void handleDuccServletJobPerformanceData()

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"));
	}