spans = new ArrayList<>( sampledSpanStore.getErrorSampledSpans(ErrorFilter.create(spanName, code, 0))); } else { if (subtype < 0 || subtype >= LatencyBucketBoundaries.values().length) {
@Override public Collection<SpanData> getErrorSampledSpans(ErrorFilter 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.getErrorSamples(filter.getCanonicalCode(), 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> getErrorSampledSpans(ErrorFilter 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.getErrorSamples(filter.getCanonicalCode(), numSpansToReturn); } } List<SpanData> ret = new ArrayList<SpanData>(spans.size()); for (RecordEventsSpanImpl span : spans) { ret.add(span.toSpanData()); } return Collections.unmodifiableList(ret); }
@Test public void getErrorSampledSpans_MaxSpansToReturn() { RecordEventsSpanImpl span1 = createSampledSpan(REGISTERED_SPAN_NAME); testClock.advanceTime(Duration.create(0, 1000)); span1.end(EndSpanOptions.builder().setStatus(Status.CANCELLED).build()); // 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, 1000)); span2.end(EndSpanOptions.builder().setStatus(Status.CANCELLED).build()); Collection<SpanData> samples = sampleStore.getErrorSampledSpans( ErrorFilter.create(REGISTERED_SPAN_NAME, CanonicalCode.CANCELLED, 1)); assertThat(samples.size()).isEqualTo(1); // No order guaranteed so one of the spans should be in the list. assertThat(samples).containsAnyOf(span1.toSpanData(), span2.toSpanData()); }
@Test public void getErrorSampledSpans_NullCode_MaxSpansToReturn() { RecordEventsSpanImpl span1 = createSampledSpan(REGISTERED_SPAN_NAME); testClock.advanceTime(Duration.create(0, 1000)); span1.end(EndSpanOptions.builder().setStatus(Status.CANCELLED).build()); RecordEventsSpanImpl span2 = createSampledSpan(REGISTERED_SPAN_NAME); testClock.advanceTime(Duration.create(0, 1000)); span2.end(EndSpanOptions.builder().setStatus(Status.UNKNOWN).build()); Collection<SpanData> samples = sampleStore.getErrorSampledSpans(ErrorFilter.create(REGISTERED_SPAN_NAME, null, 1)); assertThat(samples.size()).isEqualTo(1); assertThat(samples).containsAnyOf(span1.toSpanData(), span2.toSpanData()); }
@Test public void getErrorSampledSpans_NullCode() { RecordEventsSpanImpl span1 = createSampledSpan(REGISTERED_SPAN_NAME); testClock.advanceTime(Duration.create(0, 1000)); span1.end(EndSpanOptions.builder().setStatus(Status.CANCELLED).build()); RecordEventsSpanImpl span2 = createSampledSpan(REGISTERED_SPAN_NAME); testClock.advanceTime(Duration.create(0, 1000)); span2.end(EndSpanOptions.builder().setStatus(Status.UNKNOWN).build()); Collection<SpanData> samples = sampleStore.getErrorSampledSpans(ErrorFilter.create(REGISTERED_SPAN_NAME, null, 0)); assertThat(samples.size()).isEqualTo(2); assertThat(samples).containsExactly(span1.toSpanData(), span2.toSpanData()); }
@Test public void getErrorSampledSpans() { RecordEventsSpanImpl span = createSampledSpan(REGISTERED_SPAN_NAME); testClock.advanceTime(Duration.create(0, 1000)); span.end(EndSpanOptions.builder().setStatus(Status.CANCELLED).build()); Collection<SpanData> samples = sampleStore.getErrorSampledSpans( ErrorFilter.create(REGISTERED_SPAN_NAME, CanonicalCode.CANCELLED, 0)); assertThat(samples.size()).isEqualTo(1); assertThat(samples.contains(span.toSpanData())).isTrue(); }
@Test public void noopSampledSpanStore_GetErrorSampledSpans() { SampledSpanStore sampledSpanStore = ExportComponent.newNoopExportComponent().getSampledSpanStore(); Collection<SpanData> errorSampledSpans = sampledSpanStore.getErrorSampledSpans( SampledSpanStore.ErrorFilter.create("TestErrorFilter", null, 0)); assertThat(errorSampledSpans).isEmpty(); }