package com.comcast.cmb.common.controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import com.comcast.cmb.common.util.CMBProperties;
public class CMBStatsServlet extends AdminServletBase {
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger(CMBStatsServlet.class);
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if (redirectNonAdminUser(request, response)) {
return;
}
CMBControllerServlet.valueAccumulator.initializeAllCounters();
response.setContentType("text/html");
PrintWriter out = response.getWriter();
Map<?, ?> parameters = request.getParameterMap();
out.println("<html>");
this.header(request, out, "CMB API Stats");
out.println("<body>");
if (!CMBProperties.getInstance().isCMBStatsEnabled()) {
out.println("<p>Stats tracking currently disabled. Enable in cmb.properties</p></body></html>");
return;
}
int rs = 10;
if (parameters.containsKey("rs")) {
rs = Integer.parseInt(request.getParameter("rs"));
}
String ac = null;
if (CMBControllerServlet.callStats.containsKey("ReceiveMessage")) {
ac = "ReceiveMessage";
} else if (CMBControllerServlet.callStats.size() > 0) {
ac = (String)CMBControllerServlet.callStats.keySet().toArray()[0];
}
if (parameters.containsKey("ac")) {
ac = request.getParameter("ac");
}
out.println("<h2 align='left'>API Response Time Percentiles [" + rs + " MS]</h2>");
out.println("<p><a href='?rs=1&ac="+ac+"'>1ms</a> <a href='?rs=10&ac="+ac+"'>10ms</a> <a href='?rs=100&ac="+ac+"'>100ms</a> <a href='?rs=1000&ac="+ac+"'>1000ms</a></p>");
out.println("<p><img src='/webui/cmbvisualizer/responsetimeimg?rs="+rs+"'></p>");
out.println("<h2 align='left'>Redis Response Time Percentiles</h2>");
out.println("<p><img src='/webui/cmbvisualizer/responsetimeimg?redis=true'></p>");
out.println("<h2 align='left'>Cassandra Response Time Percentiles</h2>");
out.println("<p><img src='/webui/cmbvisualizer/responsetimeimg?cassandra=true'></p>");
out.println("<h2 align='left'>API Response Time Percentiles [" + ac + "]</h2>");
out.print("<p>");
for (String a : CMBControllerServlet.callStats.keySet()) {
out.print("<a href='?ac="+a+"&rs="+rs+"'>"+a+"</a> ");
}
out.println("</p>");
out.println("<p><img src='/webui/cmbvisualizer/responsetimeimg?ac="+ac+"'></p>");
out.println("<h2 align='left'>API Call Mix</h2>");
out.println("<p><img src='/webui/cmbvisualizer/callcountimg'></p>");
out.println("<h2 align='left'>API Call Distribution</h2>");
out.println("<p><img src='/webui/cmbvisualizer/calldistributionimg'></p>");
if (CMBControllerServlet.callStats.keySet().size() > 0) {
out.println("<h2 align='left'>API Call Counts</h2>");
out.println("<span class='simple'><table border='1'>");
out.println("<tr><th>API</th><th>Since " + new Date(CMBControllerServlet.startTime)+"</th><th>Last Hour</th></tr>");
for (String action : CMBControllerServlet.callStats.keySet()) {
AtomicLong[][] rt = CMBControllerServlet.callResponseTimesByApi.get(action);
long total = 0;
for (int i=0; i<rt.length; i++) {
for (int k=0; k<rt[0].length; k++) {
total += rt[i][k].longValue();
}
}
out.println("<tr><td>"+action+"</td><td>"+CMBControllerServlet.callStats.get(action)+"</td><td>"+total+"</td></tr>");
}
out.println("</table></span>");
}
if (CMBControllerServlet.callFailureStats.keySet().size() > 0) {
out.println("<h2 align='left'>API Failure Counts</h2>");
out.println("<span class='simple'><table border='1'>");
for (String action : CMBControllerServlet.callFailureStats.keySet()) {
out.println("<tr><td>"+action+"</td><td>"+CMBControllerServlet.callFailureStats.get(action)+"</td></tr>");
}
out.println("</table></span>");
out.println("<h2 align='left'>Recent Errors</h2>");
out.println("<span class='simple'><table border='1'>");
for (int i=CMBControllerServlet.recentErrors.length-1; i>=0; i--) {
String detail = CMBControllerServlet.recentErrors[i];
if (detail != null) {
String elements[] = detail.split("\\|");
if (elements.length >= 3) {
out.println("<tr><td>"+elements[0]+"</td></tr>");
out.println("<tr><td>"+elements[1]+"</td></tr>");
out.println("<tr><td>"+elements[2]+"</td></tr>");
}
}
}
out.println("</table></span>");
}
out.println("</body></html>");
CMBControllerServlet.valueAccumulator.deleteAllCounters();
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}