private static void emitSummaryTableHeader(PrintWriter out, Formatter formatter) { // First line. out.write("<tr class=\"bgcolor\">\n"); out.write("<td colspan=1 class=\"head\"><b>Span Name</b></td>\n"); out.write("<td class=\"borderRW\"> </td>"); out.write("<td colspan=1 class=\"head\"><b>Running</b></td>\n"); out.write("<td class=\"borderLW\"> </td>"); out.write("<td colspan=9 class=\"head\"><b>Latency Samples</b></td>\n"); out.write("<td class=\"borderRW\"> </td>"); out.write("<td colspan=1 class=\"head\"><b>Error Samples</b></td>\n"); out.write("</tr>\n"); // Second line. out.write("<tr class=\"bgcolor\">\n"); out.write("<td colspan=1></td>\n"); out.write("<td class=\"borderRW\"> </td>"); out.write("<td colspan=1></td>\n"); out.write("<td class=\"borderLW\"> </td>"); for (LatencyBucketBoundaries latencyBucketsBoundaries : LatencyBucketBoundaries.values()) { formatter.format( "<td colspan=1 class=\"centerW\"><b>[%s]</b></td>%n", LATENCY_BUCKET_BOUNDARIES_STRING_MAP.get(latencyBucketsBoundaries)); } out.write("<td class=\"borderRW\"> </td>"); out.write("<td colspan=1></td>\n"); out.write("</tr>\n"); }
: null; int subtype = 0; for (LatencyBucketBoundaries latencyBucketsBoundaries : LatencyBucketBoundaries.values()) { if (latencyBucketsSummaries != null) { int numSamples =
sampledSpanStore.getErrorSampledSpans(ErrorFilter.create(spanName, code, 0))); } else { if (subtype < 0 || subtype >= LatencyBucketBoundaries.values().length) { return; LatencyBucketBoundaries.values()[subtype]; spans = new ArrayList<>( LatencyFilter.create( spanName, latencyBucketBoundaries.getLatencyLowerNs(), latencyBucketBoundaries.getLatencyUpperNs(), 0)));
private List<RecordEventsSpanImpl> getLatencySamples( long latencyLowerNs, long latencyUpperNs, int maxSpansToReturn) { ArrayList<RecordEventsSpanImpl> output = new ArrayList<RecordEventsSpanImpl>(maxSpansToReturn); for (int i = 0; i < NUM_LATENCY_BUCKETS; i++) { LatencyBucketBoundaries boundaries = LatencyBucketBoundaries.values()[i]; if (latencyUpperNs >= boundaries.getLatencyLowerNs() && latencyLowerNs < boundaries.getLatencyUpperNs()) { latencyBuckets[i].getSamplesFilteredByLatency( latencyLowerNs, latencyUpperNs, maxSpansToReturn, output); } } return output; } }
private void addSpanNameToAllLatencyBuckets(String spanName) { for (LatencyBucketBoundaries boundaries : LatencyBucketBoundaries.values()) { Span sampledSpan = createSampledSpan(spanName); Span notSampledSpan = createNotSampledSpan(spanName); if (boundaries.getLatencyLowerNs() < NUM_NANOS_PER_SECOND) { testClock.advanceTime(Duration.create(0, (int) boundaries.getLatencyLowerNs())); } else { testClock.advanceTime( Duration.create( boundaries.getLatencyLowerNs() / NUM_NANOS_PER_SECOND, (int) (boundaries.getLatencyLowerNs() % NUM_NANOS_PER_SECOND))); } sampledSpan.end(); notSampledSpan.end(); } }
private List<RecordEventsSpanImpl> getLatencySamples( long latencyLowerNs, long latencyUpperNs, int maxSpansToReturn) { ArrayList<RecordEventsSpanImpl> output = new ArrayList<RecordEventsSpanImpl>(maxSpansToReturn); for (int i = 0; i < NUM_LATENCY_BUCKETS; i++) { LatencyBucketBoundaries boundaries = LatencyBucketBoundaries.values()[i]; if (latencyUpperNs >= boundaries.getLatencyLowerNs() && latencyLowerNs < boundaries.getLatencyUpperNs()) { latencyBuckets[i].getSamplesFilteredByLatency( latencyLowerNs, latencyUpperNs, maxSpansToReturn, output); } } return output; } }
@Nullable private Bucket getLatencyBucket(long latencyNs) { for (int i = 0; i < NUM_LATENCY_BUCKETS; i++) { LatencyBucketBoundaries boundaries = LatencyBucketBoundaries.values()[i]; if (latencyNs >= boundaries.getLatencyLowerNs() && latencyNs < boundaries.getLatencyUpperNs()) { return latencyBuckets[i]; } } // latencyNs is negative or Long.MAX_VALUE, so this Span can be ignored. This cannot happen // in real production because System#nanoTime is monotonic. return null; }
private Map<LatencyBucketBoundaries, Integer> getNumbersOfLatencySampledSpans() { Map<LatencyBucketBoundaries, Integer> latencyBucketSummaries = new EnumMap<LatencyBucketBoundaries, Integer>(LatencyBucketBoundaries.class); for (int i = 0; i < NUM_LATENCY_BUCKETS; i++) { latencyBucketSummaries.put( LatencyBucketBoundaries.values()[i], latencyBuckets[i].getNumSamples()); } return latencyBucketSummaries; }
@Nullable private Bucket getLatencyBucket(long latencyNs) { for (int i = 0; i < NUM_LATENCY_BUCKETS; i++) { LatencyBucketBoundaries boundaries = LatencyBucketBoundaries.values()[i]; if (latencyNs >= boundaries.getLatencyLowerNs() && latencyNs < boundaries.getLatencyUpperNs()) { return latencyBuckets[i]; } } // latencyNs is negative or Long.MAX_VALUE, so this Span can be ignored. This cannot happen // in real production because System#nanoTime is monotonic. return null; }
@Test public void addSpansWithRegisteredNamesInAllLatencyBuckets() { addSpanNameToAllLatencyBuckets(REGISTERED_SPAN_NAME); Map<String, PerSpanNameSummary> perSpanNameSummary = sampleStore.getSummary().getPerSpanNameSummary(); assertThat(perSpanNameSummary.size()).isEqualTo(1); Map<LatencyBucketBoundaries, Integer> latencyBucketsSummaries = perSpanNameSummary.get(REGISTERED_SPAN_NAME).getNumbersOfLatencySampledSpans(); assertThat(latencyBucketsSummaries.size()).isEqualTo(LatencyBucketBoundaries.values().length); for (Map.Entry<LatencyBucketBoundaries, Integer> it : latencyBucketsSummaries.entrySet()) { assertThat(it.getValue()).isEqualTo(2); } }
private Map<LatencyBucketBoundaries, Integer> getNumbersOfLatencySampledSpans() { Map<LatencyBucketBoundaries, Integer> latencyBucketSummaries = new EnumMap<LatencyBucketBoundaries, Integer>(LatencyBucketBoundaries.class); for (int i = 0; i < NUM_LATENCY_BUCKETS; i++) { latencyBucketSummaries.put( LatencyBucketBoundaries.values()[i], latencyBuckets[i].getNumSamples()); } return latencyBucketSummaries; }
private static Map<LatencyBucketBoundaries, String> buildLatencyBucketBoundariesStringMap() { Map<LatencyBucketBoundaries, String> ret = new HashMap<>(); for (LatencyBucketBoundaries latencyBucketBoundaries : LatencyBucketBoundaries.values()) { ret.put(latencyBucketBoundaries, latencyBucketBoundariesToString(latencyBucketBoundaries)); } return Collections.unmodifiableMap(ret); }