private void serializeSpanCount(final SpanCount spanCount) { writeFieldName("span_count"); jw.writeByte(OBJECT_START); writeField("dropped", spanCount.getDropped().get()); writeLastField("started", spanCount.getStarted().get()); jw.writeByte(OBJECT_END); jw.writeByte(COMMA); }
@Override public void resetState() { super.resetState(); context.resetState(); result = null; spanCount.resetState(); noop = false; type = null; }
private boolean isTransactionSpanLimitReached(Transaction transaction) { return coreConfiguration.getTransactionMaxSpans() <= transaction.getSpanCount().getStarted().get(); }
public Span startSpan(AbstractSpan<?> parent, long epochMicros) { Span span; span = spanPool.createInstance(); final boolean dropped; Transaction transaction = currentTransaction(); if (transaction != null) { if (isTransactionSpanLimitReached(transaction)) { dropped = true; transaction.getSpanCount().getDropped().incrementAndGet(); } else { dropped = false; transaction.getSpanCount().getStarted().incrementAndGet(); } } else { dropped = false; } span.start(TraceContext.fromParent(), parent, epochMicros, dropped); return span; }
@Test void testEnableDropSpans() { when(tracerImpl.getConfig(CoreConfiguration.class).getTransactionMaxSpans()).thenReturn(1); Transaction transaction = tracerImpl.startTransaction(); try (Scope scope = transaction.activateInScope()) { Span span = tracerImpl.getActive().createSpan(); try (Scope spanScope = span.activateInScope()) { assertThat(span.isSampled()).isTrue(); span.end(); } Span span2 = tracerImpl.getActive().createSpan(); try (Scope spanScope = span2.activateInScope()) { assertThat(span2.isSampled()).isFalse(); span2.end(); } transaction.end(); } assertThat(reporter.getFirstTransaction().isSampled()).isTrue(); assertThat(reporter.getFirstTransaction().getSpanCount().getDropped().get()).isEqualTo(1); assertThat(reporter.getFirstTransaction().getSpanCount().getStarted().get()).isEqualTo(1); assertThat(reporter.getSpans()).hasSize(1); }