private void emitSummaryTable(PrintWriter out, Formatter formatter)
      throws UnsupportedEncodingException {
    if (runningSpanStore == null || sampledSpanStore == null) {
      return;
    }
    RunningSpanStore.Summary runningSpanStoreSummary = runningSpanStore.getSummary();
    SampledSpanStore.Summary sampledSpanStoreSummary = sampledSpanStore.getSummary();

    out.write("<table style='border-spacing: 0;\n");
    out.write("border-left:1px solid #3D3D3D;border-right:1px solid #3D3D3D;'>\n");
    emitSummaryTableHeader(out, formatter);

    Set<String> spanNames = new TreeSet<>(runningSpanStoreSummary.getPerSpanNameSummary().keySet());
    spanNames.addAll(sampledSpanStoreSummary.getPerSpanNameSummary().keySet());
    boolean zebraColor = true;
    for (String spanName : spanNames) {
      out.write("<tr class=\"border\">\n");
      if (!zebraColor) {
        out.write("<tr class=\"border\">\n");
      } else {
        formatter.format("<tr class=\"border\" style=\"background: %s\">%n", ZEBRA_STRIPE_COLOR);
      }
      zebraColor = !zebraColor;
      formatter.format("<td>%s</td>%n", htmlEscaper().escape(spanName));

      // Running
      out.write("<td class=\"borderRL\">&nbsp;&nbsp;&nbsp;&nbsp;</td>");
      RunningSpanStore.PerSpanNameSummary runningSpanStorePerSpanNameSummary =
          runningSpanStoreSummary.getPerSpanNameSummary().get(spanName);

      // subtype ignored for running requests.
      emitSingleCell(
          out,
          formatter,
          spanName,
          runningSpanStorePerSpanNameSummary == null
              ? 0
              : runningSpanStorePerSpanNameSummary.getNumRunningSpans(),
          RequestType.RUNNING,
          0);

      SampledSpanStore.PerSpanNameSummary sampledSpanStorePerSpanNameSummary =
          sampledSpanStoreSummary.getPerSpanNameSummary().get(spanName);

      // Latency based samples
      out.write("<td class=\"borderLC\">&nbsp;&nbsp;&nbsp;&nbsp;</td>");
      Map<LatencyBucketBoundaries, Integer> latencyBucketsSummaries =
          sampledSpanStorePerSpanNameSummary != null
              ? sampledSpanStorePerSpanNameSummary.getNumbersOfLatencySampledSpans()
              : null;
      int subtype = 0;
      for (LatencyBucketBoundaries latencyBucketsBoundaries : LatencyBucketBoundaries.values()) {
        if (latencyBucketsSummaries != null) {
          int numSamples =
              latencyBucketsSummaries.containsKey(latencyBucketsBoundaries)
                  ? latencyBucketsSummaries.get(latencyBucketsBoundaries)
                  : 0;
          emitSingleCell(out, formatter, spanName, numSamples, RequestType.FINISHED, subtype++);
        } else {
          // numSamples < -1 means "Not Available".
          emitSingleCell(out, formatter, spanName, -1, RequestType.FINISHED, subtype++);
        }
      }

      // Error based samples.
      out.write("<td class=\"borderRL\">&nbsp;&nbsp;&nbsp;&nbsp;</td>");
      if (sampledSpanStorePerSpanNameSummary != null) {
        Map<CanonicalCode, Integer> errorBucketsSummaries =
            sampledSpanStorePerSpanNameSummary.getNumbersOfErrorSampledSpans();
        int numErrorSamples = 0;
        for (Map.Entry<CanonicalCode, Integer> it : errorBucketsSummaries.entrySet()) {
          numErrorSamples += it.getValue();
        }
        // subtype 0 means all;
        emitSingleCell(out, formatter, spanName, numErrorSamples, RequestType.FAILED, 0);
      } else {
        // numSamples < -1 means "Not Available".
        emitSingleCell(out, formatter, spanName, -1, RequestType.FAILED, 0);
      }

      out.write("</tr>\n");
    }
    out.write("</table>");
  }
private void emitSummaryTable ( PrintWriter out , Formatter formatter ) throws UnsupportedEncodingException { if ( runningSpanStore == null || sampledSpanStore == null ) { return ; } RunningSpanStore . Summary runningSpanStoreSummary = runningSpanStore . getSummary ( ) ; SampledSpanStore . Summary sampledSpanStoreSummary = sampledSpanStore . getSummary ( ) ; out . write ( "<table style='border-spacing: 0;\n" ) ; out . write ( "border-left:1px solid #3D3D3D;border-right:1px solid #3D3D3D;'>\n" ) ; emitSummaryTableHeader ( out , formatter ) ; Set < String > spanNames = new TreeSet < > ( runningSpanStoreSummary . getPerSpanNameSummary ( ) . keySet ( ) ) ; spanNames . addAll ( sampledSpanStoreSummary . getPerSpanNameSummary ( ) . keySet ( ) ) ; boolean zebraColor = true ; for ( String spanName : spanNames ) { out . write ( "<tr class=\"border\">\n" ) ; if ( ! zebraColor ) { out . write ( "<tr class=\"border\">\n" ) ; } else { formatter . format ( "<tr class=\"border\" style=\"background: %s\">%n" , ZEBRA_STRIPE_COLOR ) ; } zebraColor = ! zebraColor ; formatter . format ( "<td>%s</td>%n" , htmlEscaper ( ) . escape ( spanName ) ) ; out . write ( "<td class=\"borderRL\">&nbsp;&nbsp;&nbsp;&nbsp;</td>" ) ; RunningSpanStore . PerSpanNameSummary runningSpanStorePerSpanNameSummary = runningSpanStoreSummary . getPerSpanNameSummary ( ) . get ( spanName ) ; emitSingleCell ( out , formatter , spanName , runningSpanStorePerSpanNameSummary == null ? 0 : runningSpanStorePerSpanNameSummary . getNumRunningSpans ( ) , RequestType . RUNNING , 0 ) ; SampledSpanStore . PerSpanNameSummary sampledSpanStorePerSpanNameSummary = sampledSpanStoreSummary . getPerSpanNameSummary ( ) . get ( spanName ) ; out . write ( "<td class=\"borderLC\">&nbsp;&nbsp;&nbsp;&nbsp;</td>" ) ; Map < LatencyBucketBoundaries , Integer > latencyBucketsSummaries = sampledSpanStorePerSpanNameSummary != null ? sampledSpanStorePerSpanNameSummary . getNumbersOfLatencySampledSpans ( ) : null ; int subtype = 0 ; for ( LatencyBucketBoundaries latencyBucketsBoundaries : LatencyBucketBoundaries . values ( ) ) { if ( latencyBucketsSummaries != null ) { int numSamples = latencyBucketsSummaries . containsKey ( latencyBucketsBoundaries ) ? latencyBucketsSummaries . get ( latencyBucketsBoundaries ) : 0 ; emitSingleCell ( out , formatter , spanName , numSamples , RequestType . FINISHED , subtype ++ ) ; } else { emitSingleCell ( out , formatter , spanName , - 1 , RequestType . FINISHED , subtype ++ ) ; } } out . write ( "<td class=\"borderRL\">&nbsp;&nbsp;&nbsp;&nbsp;</td>" ) ; if ( sampledSpanStorePerSpanNameSummary != null ) { Map < CanonicalCode , Integer > errorBucketsSummaries = sampledSpanStorePerSpanNameSummary . getNumbersOfErrorSampledSpans ( ) ; int numErrorSamples = 0 ; for ( Map . Entry < CanonicalCode , Integer > it : errorBucketsSummaries . entrySet ( ) ) { numErrorSamples += it . getValue ( ) ; } emitSingleCell ( out , formatter , spanName , numErrorSamples , RequestType . FAILED , 0 ) ; } else { emitSingleCell ( out , formatter , spanName , - 1 , RequestType . FAILED , 0 ) ; } out . write ( "</tr>\n" ) ; } out . write ( "</table>" ) ; }
Emits the summary table with links to all samples.