@Override public void getMetrics(MetricsCollector collector, boolean all) { StartupProgressView prog = startupProgress.createView(); MetricsRecordBuilder builder = collector.addRecord( STARTUP_PROGRESS_METRICS_INFO); builder.addCounter(info("ElapsedTime", "overall elapsed time"), prog.getElapsedTime()); builder.addGauge(info("PercentComplete", "overall percent complete"), prog.getPercentComplete()); for (Phase phase: prog.getPhases()) { addCounter(builder, phase, "Count", " count", prog.getCount(phase)); addCounter(builder, phase, "ElapsedTime", " elapsed time", prog.getElapsedTime(phase)); addCounter(builder, phase, "Total", " total", prog.getTotal(phase)); addGauge(builder, phase, "PercentComplete", " percent complete", prog.getPercentComplete(phase)); } }
/** * Prints one line of content for a phase in the Startup Progress report. * * @param fout FormattedWriter to receive output * @param view StartupProgressView containing information to print * @param phase Phase to print * @throws IOException thrown if there is an I/O error */ private void printPhase(FormattedWriter fout, StartupProgressView view, Phase phase) throws IOException { StringBuilder phaseLine = new StringBuilder(); phaseLine.append(phase.getDescription()); String file = view.getFile(phase); if (file != null) { phaseLine.append(" ").append(file); } long size = view.getSize(phase); if (size != Long.MIN_VALUE) { phaseLine.append(" (").append(StringUtils.byteDesc(size)).append(")"); } fout.println("<td class=\"startupdesc\">%s</td>", phaseLine.toString()); fout.println("<td>%s</td>", StringUtils.formatPercent( view.getPercentComplete(phase), 2)); fout.println("<td>%s</td>", view.getStatus(phase) == Status.PENDING ? "" : StringUtils.formatTime(view.getElapsedTime(phase))); }
/** * Prints one line of content for a step in the Startup Progress report. * * @param fout FormattedWriter to receive output * @param view StartupProgressView containing information to print * @param phase Phase to print * @param step Step to print * @throws IOException thrown if there is an I/O error */ private void printStep(FormattedWriter fout, StartupProgressView view, Phase phase, Step step) throws IOException { StringBuilder stepLine = new StringBuilder(); String file = step.getFile(); if (file != null) { stepLine.append(file); } long size = step.getSize(); if (size != Long.MIN_VALUE) { stepLine.append(" (").append(StringUtils.byteDesc(size)).append(")"); } StepType type = step.getType(); if (type != null) { stepLine.append(" ").append(type.getDescription()); } fout.println("<td class=\"startupdesc\">%s (%d/%d)</td>", stepLine.toString(), view.getCount(phase, step), view.getTotal(phase, step)); fout.println("<td>%s</td>", StringUtils.formatPercent( view.getPercentComplete(phase), 2)); fout.println("<td>%s</td>", view.getStatus(phase) == Status.PENDING ? "" : StringUtils.formatTime(view.getElapsedTime(phase))); }
/** * Generates the Startup Progress report. * * @param out JspWriter to receive output * @param prog StartupProgress tracking NameNode startup progress * @throws IOException thrown if there is an I/O error */ void generateStartupProgress(JspWriter out, StartupProgress prog) throws IOException { StartupProgressView view = prog.createView(); FormattedWriter fout = new FormattedWriter(out); fout.println("<div id=\"startupprogress\">"); fout.println("<div><span>Elapsed Time:</span> %s</div>", StringUtils.formatTime(view.getElapsedTime())); fout.println("<div><span>Percent Complete:</span> %s</div>", StringUtils.formatPercent(view.getPercentComplete(), 2)); fout.println("<table>"); fout.println("<tr>"); fout.println("<th>Phase</th>"); fout.println("<th>Completion</th>"); fout.println("<th>Elapsed Time</th>"); fout.println("</tr>"); for (Phase phase: view.getPhases()) { final String timeClass; Status status = view.getStatus(phase); if (status == Status.PENDING) { timeClass = "later"; } else if (status == Status.RUNNING) { timeClass = "current"; } else { timeClass = "prior"; } fout.println("<tr class=\"phase %s\">", timeClass); printPhase(fout, view, phase); fout.println("</tr>"); for (Step step: view.getSteps(phase)) { fout.println("<tr class=\"step %s\">", timeClass); printStep(fout, view, phase, step); fout.println("</tr>"); } } fout.println("</table>"); fout.println("</div>"); }
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.setContentType("application/json; charset=UTF-8"); StartupProgress prog = NameNodeHttpServer.getStartupProgressFromContext( getServletContext()); StartupProgressView view = prog.createView(); JsonGenerator json = new JsonFactory().createJsonGenerator(resp.getWriter()); try { json.writeStartObject(); json.writeNumberField(ELAPSED_TIME, view.getElapsedTime()); json.writeNumberField(PERCENT_COMPLETE, view.getPercentComplete()); json.writeArrayFieldStart(PHASES); for (Phase phase: view.getPhases()) { json.writeStartObject(); json.writeStringField(NAME, phase.getName()); json.writeStringField(DESC, phase.getDescription()); json.writeStringField(STATUS, view.getStatus(phase).toString()); json.writeNumberField(PERCENT_COMPLETE, view.getPercentComplete(phase)); json.writeNumberField(ELAPSED_TIME, view.getElapsedTime(phase)); writeStringFieldIfNotNull(json, FILE, view.getFile(phase)); writeNumberFieldIfDefined(json, SIZE, view.getSize(phase)); json.writeArrayFieldStart(STEPS); for (Step step: view.getSteps(phase)) { json.writeStartObject(); StepType type = step.getType(); if (type != null) { json.writeStringField(NAME, type.getName()); json.writeStringField(DESC, type.getDescription()); } json.writeNumberField(COUNT, view.getCount(phase, step)); writeStringFieldIfNotNull(json, FILE, step.getFile()); writeNumberFieldIfDefined(json, SIZE, step.getSize()); json.writeNumberField(TOTAL, view.getTotal(phase, step)); json.writeNumberField(PERCENT_COMPLETE, view.getPercentComplete(phase, step)); json.writeNumberField(ELAPSED_TIME, view.getElapsedTime(phase, step)); json.writeEndObject(); } json.writeEndArray(); json.writeEndObject(); } json.writeEndArray(); json.writeEndObject(); } finally { IOUtils.cleanup(LOG, json); } }
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.setContentType("application/json; charset=UTF-8"); StartupProgress prog = NameNodeHttpServer.getStartupProgressFromContext( getServletContext()); StartupProgressView view = prog.createView(); JsonGenerator json = new JsonFactory().createJsonGenerator(resp.getWriter()); try { json.writeStartObject(); json.writeNumberField(ELAPSED_TIME, view.getElapsedTime()); json.writeNumberField(PERCENT_COMPLETE, view.getPercentComplete()); json.writeArrayFieldStart(PHASES); for (Phase phase: view.getPhases()) { json.writeStartObject(); json.writeStringField(NAME, phase.getName()); json.writeStringField(STATUS, view.getStatus(phase).toString()); json.writeNumberField(PERCENT_COMPLETE, view.getPercentComplete(phase)); json.writeNumberField(ELAPSED_TIME, view.getElapsedTime(phase)); writeStringFieldIfNotNull(json, FILE, view.getFile(phase)); writeNumberFieldIfDefined(json, SIZE, view.getSize(phase)); json.writeArrayFieldStart(STEPS); for (Step step: view.getSteps(phase)) { json.writeStartObject(); StepType type = step.getType(); String name = type != null ? type.getName() : null; writeStringFieldIfNotNull(json, NAME, name); json.writeNumberField(COUNT, view.getCount(phase, step)); writeStringFieldIfNotNull(json, FILE, step.getFile()); writeNumberFieldIfDefined(json, SIZE, step.getSize()); json.writeNumberField(TOTAL, view.getTotal(phase, step)); json.writeNumberField(PERCENT_COMPLETE, view.getPercentComplete(phase, step)); json.writeNumberField(ELAPSED_TIME, view.getElapsedTime(phase, step)); json.writeEndObject(); } json.writeEndArray(); json.writeEndObject(); } json.writeEndArray(); json.writeEndObject(); } finally { IOUtils.cleanup(LOG, json); } }