new ArrayList<>( sampledSpanStore.getLatencySampledSpans( LatencyFilter.create( spanName, latencyBucketBoundaries.getLatencyLowerNs(),
@Override public Collection<SpanData> getLatencySampledSpans(LatencyFilter filter) { int numSpansToReturn = filter.getMaxSpansToReturn() == 0 ? MAX_PER_SPAN_NAME_SAMPLES : filter.getMaxSpansToReturn(); List<RecordEventsSpanImpl> spans = Collections.emptyList(); // Try to not keep the lock to much, do the RecordEventsSpanImpl -> SpanData conversion outside // the lock. synchronized (samples) { PerSpanNameSamples perSpanNameSamples = samples.get(filter.getSpanName()); if (perSpanNameSamples != null) { spans = perSpanNameSamples.getLatencySamples( filter.getLatencyLowerNs(), filter.getLatencyUpperNs(), numSpansToReturn); } } List<SpanData> ret = new ArrayList<SpanData>(spans.size()); for (RecordEventsSpanImpl span : spans) { ret.add(span.toSpanData()); } return Collections.unmodifiableList(ret); } }
@Override public Collection<SpanData> getLatencySampledSpans(LatencyFilter filter) { int numSpansToReturn = filter.getMaxSpansToReturn() == 0 ? MAX_PER_SPAN_NAME_SAMPLES : filter.getMaxSpansToReturn(); List<RecordEventsSpanImpl> spans = Collections.emptyList(); // Try to not keep the lock to much, do the RecordEventsSpanImpl -> SpanData conversion outside // the lock. synchronized (samples) { PerSpanNameSamples perSpanNameSamples = samples.get(filter.getSpanName()); if (perSpanNameSamples != null) { spans = perSpanNameSamples.getLatencySamples( filter.getLatencyLowerNs(), filter.getLatencyUpperNs(), numSpansToReturn); } } List<SpanData> ret = new ArrayList<SpanData>(spans.size()); for (RecordEventsSpanImpl span : spans) { ret.add(span.toSpanData()); } return Collections.unmodifiableList(ret); } }
@Test public void getLatencySampledSpans_MaxSpansToReturn() { RecordEventsSpanImpl span1 = createSampledSpan(REGISTERED_SPAN_NAME); testClock.advanceTime(Duration.create(0, (int) TimeUnit.MICROSECONDS.toNanos(20))); span1.end(); // Advance time to allow other spans to be sampled. testClock.advanceTime(Duration.create(5, 0)); RecordEventsSpanImpl span2 = createSampledSpan(REGISTERED_SPAN_NAME); testClock.advanceTime(Duration.create(0, (int) TimeUnit.MICROSECONDS.toNanos(200))); span2.end(); Collection<SpanData> samples = sampleStore.getLatencySampledSpans( LatencyFilter.create( REGISTERED_SPAN_NAME, TimeUnit.MICROSECONDS.toNanos(15), TimeUnit.MICROSECONDS.toNanos(250), 1)); assertThat(samples.size()).isEqualTo(1); assertThat(samples.contains(span1.toSpanData())).isTrue(); }
@Test public void getLatencySampledSpans_QueryBetweenMultipleBuckets() { RecordEventsSpanImpl span1 = createSampledSpan(REGISTERED_SPAN_NAME); testClock.advanceTime(Duration.create(0, (int) TimeUnit.MICROSECONDS.toNanos(20))); span1.end(); // Advance time to allow other spans to be sampled. testClock.advanceTime(Duration.create(5, 0)); RecordEventsSpanImpl span2 = createSampledSpan(REGISTERED_SPAN_NAME); testClock.advanceTime(Duration.create(0, (int) TimeUnit.MICROSECONDS.toNanos(200))); span2.end(); Collection<SpanData> samples = sampleStore.getLatencySampledSpans( LatencyFilter.create( REGISTERED_SPAN_NAME, TimeUnit.MICROSECONDS.toNanos(15), TimeUnit.MICROSECONDS.toNanos(250), 0)); assertThat(samples).containsExactly(span1.toSpanData(), span2.toSpanData()); }
@Test public void getLatencySampledSpans_InclusiveLowerBound() { RecordEventsSpanImpl span = createSampledSpan(REGISTERED_SPAN_NAME); testClock.advanceTime(Duration.create(0, (int) TimeUnit.MICROSECONDS.toNanos(20))); span.end(); Collection<SpanData> samples = sampleStore.getLatencySampledSpans( LatencyFilter.create( REGISTERED_SPAN_NAME, TimeUnit.MICROSECONDS.toNanos(20), TimeUnit.MICROSECONDS.toNanos(25), 0)); assertThat(samples.size()).isEqualTo(1); assertThat(samples.contains(span.toSpanData())).isTrue(); }
@Test public void getLatencySampledSpans() { RecordEventsSpanImpl span = createSampledSpan(REGISTERED_SPAN_NAME); testClock.advanceTime(Duration.create(0, (int) TimeUnit.MICROSECONDS.toNanos(20))); span.end(); Collection<SpanData> samples = sampleStore.getLatencySampledSpans( LatencyFilter.create( REGISTERED_SPAN_NAME, TimeUnit.MICROSECONDS.toNanos(15), TimeUnit.MICROSECONDS.toNanos(25), 0)); assertThat(samples.size()).isEqualTo(1); assertThat(samples.contains(span.toSpanData())).isTrue(); }
@Test public void getLatencySampledSpans_ExclusiveUpperBound() { RecordEventsSpanImpl span = createSampledSpan(REGISTERED_SPAN_NAME); testClock.advanceTime(Duration.create(0, (int) TimeUnit.MICROSECONDS.toNanos(20))); span.end(); Collection<SpanData> samples = sampleStore.getLatencySampledSpans( LatencyFilter.create( REGISTERED_SPAN_NAME, TimeUnit.MICROSECONDS.toNanos(15), TimeUnit.MICROSECONDS.toNanos(20), 0)); assertThat(samples.size()).isEqualTo(0); }
@Test public void ignoreNegativeSpanLatency() { RecordEventsSpanImpl span = createSampledSpan(REGISTERED_SPAN_NAME); testClock.advanceTime(Duration.create(0, (int) TimeUnit.MICROSECONDS.toNanos(-20))); span.end(); Collection<SpanData> samples = sampleStore.getLatencySampledSpans( LatencyFilter.create(REGISTERED_SPAN_NAME, 0, Long.MAX_VALUE, 0)); assertThat(samples.size()).isEqualTo(0); } }
@Test public void noopSampledSpanStore_GetLatencySampledSpans() { SampledSpanStore sampledSpanStore = ExportComponent.newNoopExportComponent().getSampledSpanStore(); Collection<SpanData> latencySampledSpans = sampledSpanStore.getLatencySampledSpans( SampledSpanStore.LatencyFilter.create("TestLatencyFilter", 0, 0, 0)); assertThat(latencySampledSpans).isEmpty(); }