diff options
20 files changed, 476 insertions, 374 deletions
diff --git a/impl_core/src/main/java/io/opencensus/implcore/trace/NoRecordEventsSpanImpl.java b/impl_core/src/main/java/io/opencensus/implcore/trace/NoRecordEventsSpanImpl.java new file mode 100644 index 00000000..8a5f8e05 --- /dev/null +++ b/impl_core/src/main/java/io/opencensus/implcore/trace/NoRecordEventsSpanImpl.java @@ -0,0 +1,85 @@ +/* + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.opencensus.implcore.trace; + +import com.google.common.base.Preconditions; +import io.opencensus.trace.Annotation; +import io.opencensus.trace.AttributeValue; +import io.opencensus.trace.EndSpanOptions; +import io.opencensus.trace.Link; +import io.opencensus.trace.Span; +import io.opencensus.trace.SpanContext; +import io.opencensus.trace.Status; +import java.util.EnumSet; +import java.util.Map; + +/** Implementation for the {@link Span} class that does not record trace events. */ +final class NoRecordEventsSpanImpl extends Span { + + private static final EnumSet<Options> NOT_RECORD_EVENTS_SPAN_OPTIONS = + EnumSet.noneOf(Span.Options.class); + + static NoRecordEventsSpanImpl create(SpanContext context) { + return new NoRecordEventsSpanImpl(context); + } + + @Override + public void addAnnotation(String description, Map<String, AttributeValue> attributes) { + Preconditions.checkNotNull(description, "description"); + Preconditions.checkNotNull(attributes, "attribute"); + } + + @Override + public void addAnnotation(Annotation annotation) { + Preconditions.checkNotNull(annotation, "annotation"); + } + + @Override + public void putAttribute(String key, AttributeValue value) { + Preconditions.checkNotNull(key, "key"); + Preconditions.checkNotNull(value, "value"); + } + + @Override + public void putAttributes(Map<String, AttributeValue> attributes) { + Preconditions.checkNotNull(attributes, "attributes"); + } + + @Override + public void addMessageEvent(io.opencensus.trace.MessageEvent messageEvent) { + Preconditions.checkNotNull(messageEvent, "messageEvent"); + } + + @Override + public void addLink(Link link) { + Preconditions.checkNotNull(link, "link"); + } + + @Override + public void setStatus(Status status) { + Preconditions.checkNotNull(status, "status"); + } + + @Override + public void end(EndSpanOptions options) { + Preconditions.checkNotNull(options, "options"); + } + + private NoRecordEventsSpanImpl(SpanContext context) { + super(context, NOT_RECORD_EVENTS_SPAN_OPTIONS); + } +} diff --git a/impl_core/src/main/java/io/opencensus/implcore/trace/SpanImpl.java b/impl_core/src/main/java/io/opencensus/implcore/trace/RecordEventsSpanImpl.java index 75509a7f..af3545bc 100644 --- a/impl_core/src/main/java/io/opencensus/implcore/trace/SpanImpl.java +++ b/impl_core/src/main/java/io/opencensus/implcore/trace/RecordEventsSpanImpl.java @@ -51,11 +51,14 @@ import javax.annotation.concurrent.GuardedBy; import javax.annotation.concurrent.ThreadSafe; // TODO(hailongwen): remove the usage of `NetworkEvent` in the future. -/** Implementation for the {@link Span} class. */ +/** Implementation for the {@link Span} class that records trace events. */ @ThreadSafe -public final class SpanImpl extends Span implements Element<SpanImpl> { +public final class RecordEventsSpanImpl extends Span implements Element<RecordEventsSpanImpl> { private static final Logger logger = Logger.getLogger(Tracer.class.getName()); + private static final EnumSet<Span.Options> RECORD_EVENTS_SPAN_OPTIONS = + EnumSet.of(Span.Options.RECORD_EVENTS); + // The parent SpanId of this span. Null if this is a root span. @Nullable private final SpanId parentSpanId; // True if the parent is on a different process. @@ -73,8 +76,7 @@ public final class SpanImpl extends Span implements Element<SpanImpl> { // The time converter used to convert nano time to Timestamp. This is needed because Java has // millisecond granularity for Timestamp and tracing events are recorded more often. @Nullable private final TimestampConverter timestampConverter; - // The start time of the span. Set when the span is created iff the RECORD_EVENTS options is - // set, otherwise 0. + // The start time of the span. private final long startNanoTime; // Set of recorded attributes. DO NOT CALL any other method that changes the ordering of events. @GuardedBy("this") @@ -87,18 +89,16 @@ public final class SpanImpl extends Span implements Element<SpanImpl> { // List of recorded network events. @GuardedBy("this") @Nullable - @SuppressWarnings("deprecation") - private TraceEvents<EventWithNanoTime<io.opencensus.trace.NetworkEvent>> networkEvents; + private TraceEvents<EventWithNanoTime<io.opencensus.trace.MessageEvent>> messageEvents; // List of recorded links to parent and child spans. @GuardedBy("this") @Nullable private TraceEvents<Link> links; - // The status of the span. Set when the span is ended iff the RECORD_EVENTS options is set. + // The status of the span. @GuardedBy("this") @Nullable private Status status; - // The end time of the span. Set when the span is ended iff the RECORD_EVENTS options is set, - // otherwise 0. + // The end time of the span. @GuardedBy("this") private long endNanoTime; // True if the span is ended. @@ -109,14 +109,13 @@ public final class SpanImpl extends Span implements Element<SpanImpl> { private boolean sampleToLocalSpanStore; // Pointers for the ConcurrentIntrusiveList$Element. Guarded by the ConcurrentIntrusiveList. - @Nullable private SpanImpl next = null; - @Nullable private SpanImpl prev = null; + @Nullable private RecordEventsSpanImpl next = null; + @Nullable private RecordEventsSpanImpl prev = null; /** * Creates and starts a span with the given configuration. * * @param context supplies the trace_id and span_id for the newly started span. - * @param options the options for the new span, importantly Options.RECORD_EVENTS. * @param name the displayed name for the new span. * @param parentSpanId the span_id of the parent span, or null if the new span is a root span. * @param hasRemoteParent {@code true} if the parentContext is remote. {@code null} if this is a @@ -130,9 +129,8 @@ public final class SpanImpl extends Span implements Element<SpanImpl> { * @return a new and started span. */ @VisibleForTesting - public static SpanImpl startSpan( + public static RecordEventsSpanImpl startSpan( SpanContext context, - @Nullable EnumSet<Options> options, String name, @Nullable Kind kind, @Nullable SpanId parentSpanId, @@ -141,10 +139,9 @@ public final class SpanImpl extends Span implements Element<SpanImpl> { StartEndHandler startEndHandler, @Nullable TimestampConverter timestampConverter, Clock clock) { - SpanImpl span = - new SpanImpl( + RecordEventsSpanImpl span = + new RecordEventsSpanImpl( context, - options, name, kind, parentSpanId, @@ -155,9 +152,7 @@ public final class SpanImpl extends Span implements Element<SpanImpl> { clock); // Call onStart here instead of calling in the constructor to make sure the span is completely // initialized. - if (span.getOptions().contains(Options.RECORD_EVENTS)) { - startEndHandler.onStart(span); - } + startEndHandler.onStart(span); return span; } @@ -244,9 +239,6 @@ public final class SpanImpl extends Span implements Element<SpanImpl> { * @throws IllegalStateException if the Span doesn't have RECORD_EVENTS option. */ public SpanData toSpanData() { - checkState( - getOptions().contains(Options.RECORD_EVENTS), - "Getting SpanData for a Span without RECORD_EVENTS option."); synchronized (this) { SpanData.Attributes attributesSpanData = attributes == null @@ -254,8 +246,7 @@ public final class SpanImpl extends Span implements Element<SpanImpl> { : SpanData.Attributes.create(attributes, attributes.getNumberOfDroppedAttributes()); SpanData.TimedEvents<Annotation> annotationsSpanData = createTimedEvents(getInitializedAnnotations(), timestampConverter); - @SuppressWarnings("deprecation") - SpanData.TimedEvents<io.opencensus.trace.NetworkEvent> networkEventsSpanData = + SpanData.TimedEvents<io.opencensus.trace.MessageEvent> messageEventsSpanData = createTimedEvents(getInitializedNetworkEvents(), timestampConverter); SpanData.Links linksSpanData = links == null @@ -271,7 +262,7 @@ public final class SpanImpl extends Span implements Element<SpanImpl> { CheckerFrameworkUtils.castNonNull(timestampConverter).convertNanoTime(startNanoTime), attributesSpanData, annotationsSpanData, - networkEventsSpanData, + messageEventsSpanData, linksSpanData, null, // Not supported yet. hasBeenEnded ? getStatusWithDefault() : null, @@ -285,9 +276,6 @@ public final class SpanImpl extends Span implements Element<SpanImpl> { public void putAttribute(String key, AttributeValue value) { Preconditions.checkNotNull(key, "key"); Preconditions.checkNotNull(value, "value"); - if (!getOptions().contains(Options.RECORD_EVENTS)) { - return; - } synchronized (this) { if (hasBeenEnded) { logger.log(Level.FINE, "Calling putAttributes() on an ended Span."); @@ -300,9 +288,6 @@ public final class SpanImpl extends Span implements Element<SpanImpl> { @Override public void putAttributes(Map<String, AttributeValue> attributes) { Preconditions.checkNotNull(attributes, "attributes"); - if (!getOptions().contains(Options.RECORD_EVENTS)) { - return; - } synchronized (this) { if (hasBeenEnded) { logger.log(Level.FINE, "Calling putAttributes() on an ended Span."); @@ -316,9 +301,6 @@ public final class SpanImpl extends Span implements Element<SpanImpl> { public void addAnnotation(String description, Map<String, AttributeValue> attributes) { Preconditions.checkNotNull(description, "description"); Preconditions.checkNotNull(attributes, "attribute"); - if (!getOptions().contains(Options.RECORD_EVENTS)) { - return; - } synchronized (this) { if (hasBeenEnded) { logger.log(Level.FINE, "Calling addAnnotation() on an ended Span."); @@ -335,9 +317,6 @@ public final class SpanImpl extends Span implements Element<SpanImpl> { @Override public void addAnnotation(Annotation annotation) { Preconditions.checkNotNull(annotation, "annotation"); - if (!getOptions().contains(Options.RECORD_EVENTS)) { - return; - } synchronized (this) { if (hasBeenEnded) { logger.log(Level.FINE, "Calling addAnnotation() on an ended Span."); @@ -349,11 +328,8 @@ public final class SpanImpl extends Span implements Element<SpanImpl> { } @Override - @SuppressWarnings("deprecation") - public void addNetworkEvent(io.opencensus.trace.NetworkEvent networkEvent) { - if (!getOptions().contains(Options.RECORD_EVENTS)) { - return; - } + public void addMessageEvent(io.opencensus.trace.MessageEvent messageEvent) { + Preconditions.checkNotNull(messageEvent, "messageEvent"); synchronized (this) { if (hasBeenEnded) { logger.log(Level.FINE, "Calling addNetworkEvent() on an ended Span."); @@ -361,17 +337,14 @@ public final class SpanImpl extends Span implements Element<SpanImpl> { } getInitializedNetworkEvents() .addEvent( - new EventWithNanoTime<io.opencensus.trace.NetworkEvent>( - clock.nowNanos(), checkNotNull(networkEvent, "networkEvent"))); + new EventWithNanoTime<io.opencensus.trace.MessageEvent>( + clock.nowNanos(), checkNotNull(messageEvent, "networkEvent"))); } } @Override public void addLink(Link link) { Preconditions.checkNotNull(link, "link"); - if (!getOptions().contains(Options.RECORD_EVENTS)) { - return; - } synchronized (this) { if (hasBeenEnded) { logger.log(Level.FINE, "Calling addLink() on an ended Span."); @@ -384,9 +357,6 @@ public final class SpanImpl extends Span implements Element<SpanImpl> { @Override public void setStatus(Status status) { Preconditions.checkNotNull(status, "status"); - if (!getOptions().contains(Options.RECORD_EVENTS)) { - return; - } synchronized (this) { if (hasBeenEnded) { logger.log(Level.FINE, "Calling setStatus() on an ended Span."); @@ -399,9 +369,6 @@ public final class SpanImpl extends Span implements Element<SpanImpl> { @Override public void end(EndSpanOptions options) { Preconditions.checkNotNull(options, "options"); - if (!getOptions().contains(Options.RECORD_EVENTS)) { - return; - } synchronized (this) { if (hasBeenEnded) { logger.log(Level.FINE, "Calling end() on an ended Span."); @@ -435,15 +402,14 @@ public final class SpanImpl extends Span implements Element<SpanImpl> { } @GuardedBy("this") - @SuppressWarnings("deprecation") - private TraceEvents<EventWithNanoTime<io.opencensus.trace.NetworkEvent>> + private TraceEvents<EventWithNanoTime<io.opencensus.trace.MessageEvent>> getInitializedNetworkEvents() { - if (networkEvents == null) { - networkEvents = - new TraceEvents<EventWithNanoTime<io.opencensus.trace.NetworkEvent>>( - traceParams.getMaxNumberOfNetworkEvents()); + if (messageEvents == null) { + messageEvents = + new TraceEvents<EventWithNanoTime<io.opencensus.trace.MessageEvent>>( + traceParams.getMaxNumberOfMessageEvents()); } - return networkEvents; + return messageEvents; } @GuardedBy("this") @@ -474,23 +440,23 @@ public final class SpanImpl extends Span implements Element<SpanImpl> { @Override @Nullable - public SpanImpl getNext() { + public RecordEventsSpanImpl getNext() { return next; } @Override - public void setNext(@Nullable SpanImpl element) { + public void setNext(@Nullable RecordEventsSpanImpl element) { next = element; } @Override @Nullable - public SpanImpl getPrev() { + public RecordEventsSpanImpl getPrev() { return prev; } @Override - public void setPrev(@Nullable SpanImpl element) { + public void setPrev(@Nullable RecordEventsSpanImpl element) { prev = element; } @@ -505,9 +471,9 @@ public final class SpanImpl extends Span implements Element<SpanImpl> { * be thread-safe. */ public interface StartEndHandler { - void onStart(SpanImpl span); + void onStart(RecordEventsSpanImpl span); - void onEnd(SpanImpl span); + void onEnd(RecordEventsSpanImpl span); } // A map implementation with a fixed capacity that drops events when the map gets full. Eviction @@ -586,9 +552,8 @@ public final class SpanImpl extends Span implements Element<SpanImpl> { } } - private SpanImpl( + private RecordEventsSpanImpl( SpanContext context, - @Nullable EnumSet<Options> options, String name, @Nullable Kind kind, @Nullable SpanId parentSpanId, @@ -597,7 +562,7 @@ public final class SpanImpl extends Span implements Element<SpanImpl> { StartEndHandler startEndHandler, @Nullable TimestampConverter timestampConverter, Clock clock) { - super(context, options); + super(context, RECORD_EVENTS_SPAN_OPTIONS); this.parentSpanId = parentSpanId; this.hasRemoteParent = hasRemoteParent; this.name = name; @@ -607,13 +572,8 @@ public final class SpanImpl extends Span implements Element<SpanImpl> { this.clock = clock; this.hasBeenEnded = false; this.sampleToLocalSpanStore = false; - if (options != null && options.contains(Options.RECORD_EVENTS)) { - this.timestampConverter = - timestampConverter != null ? timestampConverter : TimestampConverter.now(clock); - startNanoTime = clock.nowNanos(); - } else { - this.startNanoTime = 0; - this.timestampConverter = timestampConverter; - } + this.timestampConverter = + timestampConverter != null ? timestampConverter : TimestampConverter.now(clock); + startNanoTime = clock.nowNanos(); } } diff --git a/impl_core/src/main/java/io/opencensus/implcore/trace/SpanBuilderImpl.java b/impl_core/src/main/java/io/opencensus/implcore/trace/SpanBuilderImpl.java index 3ea0ce33..5565e9de 100644 --- a/impl_core/src/main/java/io/opencensus/implcore/trace/SpanBuilderImpl.java +++ b/impl_core/src/main/java/io/opencensus/implcore/trace/SpanBuilderImpl.java @@ -35,7 +35,6 @@ import io.opencensus.trace.Tracestate; import io.opencensus.trace.config.TraceConfig; import io.opencensus.trace.config.TraceParams; import java.util.Collections; -import java.util.EnumSet; import java.util.List; import java.util.Random; import javax.annotation.Nullable; @@ -49,11 +48,6 @@ final class SpanBuilderImpl extends SpanBuilder { private static final TraceOptions NOT_SAMPLED_TRACE_OPTIONS = TraceOptions.builder().setIsSampled(false).build(); - private static final EnumSet<Span.Options> NOT_RECORD_EVENTS_SPAN_OPTIONS = - EnumSet.noneOf(Span.Options.class); - private static final EnumSet<Span.Options> RECORD_EVENTS_SPAN_OPTIONS = - EnumSet.of(Span.Options.RECORD_EVENTS); - private final Options options; private final String name; @Nullable private final Span parent; @@ -63,7 +57,7 @@ final class SpanBuilderImpl extends SpanBuilder { @Nullable private Boolean recordEvents; @Nullable private Kind kind; - private SpanImpl startSpanInternal( + private Span startSpanInternal( @Nullable SpanContext parent, @Nullable Boolean hasRemoteParent, String name, @@ -102,22 +96,20 @@ final class SpanBuilderImpl extends SpanBuilder { activeTraceParams) ? SAMPLED_TRACE_OPTIONS : NOT_SAMPLED_TRACE_OPTIONS; - EnumSet<Span.Options> spanOptions = + Span span = (traceOptions.isSampled() || Boolean.TRUE.equals(recordEvents)) - ? RECORD_EVENTS_SPAN_OPTIONS - : NOT_RECORD_EVENTS_SPAN_OPTIONS; - SpanImpl span = - SpanImpl.startSpan( - SpanContext.create(traceId, spanId, traceOptions, tracestate), - spanOptions, - name, - kind, - parentSpanId, - hasRemoteParent, - activeTraceParams, - options.startEndHandler, - timestampConverter, - options.clock); + ? RecordEventsSpanImpl.startSpan( + SpanContext.create(traceId, spanId, traceOptions, tracestate), + name, + kind, + parentSpanId, + hasRemoteParent, + activeTraceParams, + options.startEndHandler, + timestampConverter, + options.clock) + : NoRecordEventsSpanImpl.create( + SpanContext.create(traceId, spanId, traceOptions, tracestate)); linkSpans(span, parentLinks); return span; } @@ -186,7 +178,7 @@ final class SpanBuilderImpl extends SpanBuilder { } @Override - public SpanImpl startSpan() { + public Span startSpan() { SpanContext parentContext = remoteParentSpanContext; Boolean hasRemoteParent = Boolean.TRUE; TimestampConverter timestampConverter = null; @@ -199,8 +191,8 @@ final class SpanBuilderImpl extends SpanBuilder { parentContext = parent.getContext(); // Pass the timestamp converter from the parent to ensure that the recorded events are in // the right order. Implementation uses System.nanoTime() which is monotonically increasing. - if (parent instanceof SpanImpl) { - timestampConverter = ((SpanImpl) parent).getTimestampConverter(); + if (parent instanceof RecordEventsSpanImpl) { + timestampConverter = ((RecordEventsSpanImpl) parent).getTimestampConverter(); } } else { hasRemoteParent = null; @@ -219,13 +211,13 @@ final class SpanBuilderImpl extends SpanBuilder { static final class Options { private final RandomHandler randomHandler; - private final SpanImpl.StartEndHandler startEndHandler; + private final RecordEventsSpanImpl.StartEndHandler startEndHandler; private final Clock clock; private final TraceConfig traceConfig; Options( RandomHandler randomHandler, - SpanImpl.StartEndHandler startEndHandler, + RecordEventsSpanImpl.StartEndHandler startEndHandler, Clock clock, TraceConfig traceConfig) { this.randomHandler = checkNotNull(randomHandler, "randomHandler"); diff --git a/impl_core/src/main/java/io/opencensus/implcore/trace/StartEndHandlerImpl.java b/impl_core/src/main/java/io/opencensus/implcore/trace/StartEndHandlerImpl.java index e22a86bd..6adaa200 100644 --- a/impl_core/src/main/java/io/opencensus/implcore/trace/StartEndHandlerImpl.java +++ b/impl_core/src/main/java/io/opencensus/implcore/trace/StartEndHandlerImpl.java @@ -17,7 +17,7 @@ package io.opencensus.implcore.trace; import io.opencensus.implcore.internal.EventQueue; -import io.opencensus.implcore.trace.SpanImpl.StartEndHandler; +import io.opencensus.implcore.trace.RecordEventsSpanImpl.StartEndHandler; import io.opencensus.implcore.trace.export.RunningSpanStoreImpl; import io.opencensus.implcore.trace.export.SampledSpanStoreImpl; import io.opencensus.implcore.trace.export.SpanExporterImpl; @@ -61,14 +61,14 @@ public final class StartEndHandlerImpl implements StartEndHandler { } @Override - public void onStart(SpanImpl span) { + public void onStart(RecordEventsSpanImpl span) { if (span.getOptions().contains(Options.RECORD_EVENTS) && enqueueEventForNonSampledSpans) { eventQueue.enqueue(new SpanStartEvent(span, runningSpanStore)); } } @Override - public void onEnd(SpanImpl span) { + public void onEnd(RecordEventsSpanImpl span) { if ((span.getOptions().contains(Options.RECORD_EVENTS) && enqueueEventForNonSampledSpans) || span.getContext().getTraceOptions().isSampled()) { eventQueue.enqueue(new SpanEndEvent(span, spanExporter, runningSpanStore, sampledSpanStore)); @@ -77,10 +77,10 @@ public final class StartEndHandlerImpl implements StartEndHandler { // An EventQueue entry that records the start of the span event. private static final class SpanStartEvent implements EventQueue.Entry { - private final SpanImpl span; + private final RecordEventsSpanImpl span; @Nullable private final RunningSpanStoreImpl activeSpansExporter; - SpanStartEvent(SpanImpl span, @Nullable RunningSpanStoreImpl activeSpansExporter) { + SpanStartEvent(RecordEventsSpanImpl span, @Nullable RunningSpanStoreImpl activeSpansExporter) { this.span = span; this.activeSpansExporter = activeSpansExporter; } @@ -95,13 +95,13 @@ public final class StartEndHandlerImpl implements StartEndHandler { // An EventQueue entry that records the end of the span event. private static final class SpanEndEvent implements EventQueue.Entry { - private final SpanImpl span; + private final RecordEventsSpanImpl span; @Nullable private final RunningSpanStoreImpl runningSpanStore; private final SpanExporterImpl spanExporter; @Nullable private final SampledSpanStoreImpl sampledSpanStore; SpanEndEvent( - SpanImpl span, + RecordEventsSpanImpl span, SpanExporterImpl spanExporter, @Nullable RunningSpanStoreImpl runningSpanStore, @Nullable SampledSpanStoreImpl sampledSpanStore) { diff --git a/impl_core/src/main/java/io/opencensus/implcore/trace/TraceComponentImplBase.java b/impl_core/src/main/java/io/opencensus/implcore/trace/TraceComponentImplBase.java index f4c5ef76..c1432432 100644 --- a/impl_core/src/main/java/io/opencensus/implcore/trace/TraceComponentImplBase.java +++ b/impl_core/src/main/java/io/opencensus/implcore/trace/TraceComponentImplBase.java @@ -19,7 +19,7 @@ package io.opencensus.implcore.trace; import io.opencensus.common.Clock; import io.opencensus.implcore.internal.EventQueue; import io.opencensus.implcore.internal.SimpleEventQueue; -import io.opencensus.implcore.trace.SpanImpl.StartEndHandler; +import io.opencensus.implcore.trace.RecordEventsSpanImpl.StartEndHandler; import io.opencensus.implcore.trace.config.TraceConfigImpl; import io.opencensus.implcore.trace.export.ExportComponentImpl; import io.opencensus.implcore.trace.internal.RandomHandler; diff --git a/impl_core/src/main/java/io/opencensus/implcore/trace/TracerImpl.java b/impl_core/src/main/java/io/opencensus/implcore/trace/TracerImpl.java index fcf30ff0..48df8055 100644 --- a/impl_core/src/main/java/io/opencensus/implcore/trace/TracerImpl.java +++ b/impl_core/src/main/java/io/opencensus/implcore/trace/TracerImpl.java @@ -29,9 +29,9 @@ import javax.annotation.Nullable; public final class TracerImpl extends Tracer { private final SpanBuilderImpl.Options spanBuilderOptions; - public TracerImpl( + TracerImpl( RandomHandler randomHandler, - SpanImpl.StartEndHandler startEndHandler, + RecordEventsSpanImpl.StartEndHandler startEndHandler, Clock clock, TraceConfig traceConfig) { spanBuilderOptions = diff --git a/impl_core/src/main/java/io/opencensus/implcore/trace/export/InProcessRunningSpanStoreImpl.java b/impl_core/src/main/java/io/opencensus/implcore/trace/export/InProcessRunningSpanStoreImpl.java index 3d8fb9ae..f7aeac71 100644 --- a/impl_core/src/main/java/io/opencensus/implcore/trace/export/InProcessRunningSpanStoreImpl.java +++ b/impl_core/src/main/java/io/opencensus/implcore/trace/export/InProcessRunningSpanStoreImpl.java @@ -16,7 +16,7 @@ package io.opencensus.implcore.trace.export; -import io.opencensus.implcore.trace.SpanImpl; +import io.opencensus.implcore.trace.RecordEventsSpanImpl; import io.opencensus.implcore.trace.internal.ConcurrentIntrusiveList; import io.opencensus.trace.export.RunningSpanStore; import io.opencensus.trace.export.SpanData; @@ -30,27 +30,27 @@ import javax.annotation.concurrent.ThreadSafe; /** In-process implementation of the {@link RunningSpanStore}. */ @ThreadSafe public final class InProcessRunningSpanStoreImpl extends RunningSpanStoreImpl { - private final ConcurrentIntrusiveList<SpanImpl> runningSpans; + private final ConcurrentIntrusiveList<RecordEventsSpanImpl> runningSpans; public InProcessRunningSpanStoreImpl() { - runningSpans = new ConcurrentIntrusiveList<SpanImpl>(); + runningSpans = new ConcurrentIntrusiveList<RecordEventsSpanImpl>(); } @Override - public void onStart(SpanImpl span) { + public void onStart(RecordEventsSpanImpl span) { runningSpans.addElement(span); } @Override - public void onEnd(SpanImpl span) { + public void onEnd(RecordEventsSpanImpl span) { runningSpans.removeElement(span); } @Override public Summary getSummary() { - Collection<SpanImpl> allRunningSpans = runningSpans.getAll(); + Collection<RecordEventsSpanImpl> allRunningSpans = runningSpans.getAll(); Map<String, Integer> numSpansPerName = new HashMap<String, Integer>(); - for (SpanImpl span : allRunningSpans) { + for (RecordEventsSpanImpl span : allRunningSpans) { Integer prevValue = numSpansPerName.get(span.getName()); numSpansPerName.put(span.getName(), prevValue != null ? prevValue + 1 : 1); } @@ -64,11 +64,11 @@ public final class InProcessRunningSpanStoreImpl extends RunningSpanStoreImpl { @Override public Collection<SpanData> getRunningSpans(Filter filter) { - Collection<SpanImpl> allRunningSpans = runningSpans.getAll(); + Collection<RecordEventsSpanImpl> allRunningSpans = runningSpans.getAll(); int maxSpansToReturn = filter.getMaxSpansToReturn() == 0 ? allRunningSpans.size() : filter.getMaxSpansToReturn(); List<SpanData> ret = new ArrayList<SpanData>(maxSpansToReturn); - for (SpanImpl span : allRunningSpans) { + for (RecordEventsSpanImpl span : allRunningSpans) { if (ret.size() == maxSpansToReturn) { break; } diff --git a/impl_core/src/main/java/io/opencensus/implcore/trace/export/InProcessSampledSpanStoreImpl.java b/impl_core/src/main/java/io/opencensus/implcore/trace/export/InProcessSampledSpanStoreImpl.java index fe0132d8..0d8e493b 100644 --- a/impl_core/src/main/java/io/opencensus/implcore/trace/export/InProcessSampledSpanStoreImpl.java +++ b/impl_core/src/main/java/io/opencensus/implcore/trace/export/InProcessSampledSpanStoreImpl.java @@ -18,7 +18,7 @@ package io.opencensus.implcore.trace.export; import com.google.common.collect.EvictingQueue; import io.opencensus.implcore.internal.EventQueue; -import io.opencensus.implcore.trace.SpanImpl; +import io.opencensus.implcore.trace.RecordEventsSpanImpl; import io.opencensus.trace.Status; import io.opencensus.trace.Status.CanonicalCode; import io.opencensus.trace.export.SampledSpanStore; @@ -59,8 +59,8 @@ public final class InProcessSampledSpanStoreImpl extends SampledSpanStoreImpl { private static final class Bucket { - private final EvictingQueue<SpanImpl> sampledSpansQueue; - private final EvictingQueue<SpanImpl> notSampledSpansQueue; + private final EvictingQueue<RecordEventsSpanImpl> sampledSpansQueue; + private final EvictingQueue<RecordEventsSpanImpl> notSampledSpansQueue; private long lastSampledNanoTime; private long lastNotSampledNanoTime; @@ -69,7 +69,7 @@ public final class InProcessSampledSpanStoreImpl extends SampledSpanStoreImpl { notSampledSpansQueue = EvictingQueue.create(numSamples); } - private void considerForSampling(SpanImpl span) { + private void considerForSampling(RecordEventsSpanImpl span) { long spanEndNanoTime = span.getEndNanoTime(); if (span.getContext().getTraceOptions().isSampled()) { // Need to compare by doing the subtraction all the time because in case of an overflow, @@ -90,14 +90,16 @@ public final class InProcessSampledSpanStoreImpl extends SampledSpanStoreImpl { } } - private void getSamples(int maxSpansToReturn, List<SpanImpl> output) { + private void getSamples(int maxSpansToReturn, List<RecordEventsSpanImpl> output) { getSamples(maxSpansToReturn, output, sampledSpansQueue); getSamples(maxSpansToReturn, output, notSampledSpansQueue); } private static void getSamples( - int maxSpansToReturn, List<SpanImpl> output, EvictingQueue<SpanImpl> queue) { - for (SpanImpl span : queue) { + int maxSpansToReturn, + List<RecordEventsSpanImpl> output, + EvictingQueue<RecordEventsSpanImpl> queue) { + for (RecordEventsSpanImpl span : queue) { if (output.size() >= maxSpansToReturn) { break; } @@ -106,7 +108,10 @@ public final class InProcessSampledSpanStoreImpl extends SampledSpanStoreImpl { } private void getSamplesFilteredByLatency( - long latencyLowerNs, long latencyUpperNs, int maxSpansToReturn, List<SpanImpl> output) { + long latencyLowerNs, + long latencyUpperNs, + int maxSpansToReturn, + List<RecordEventsSpanImpl> output) { getSamplesFilteredByLatency( latencyLowerNs, latencyUpperNs, maxSpansToReturn, output, sampledSpansQueue); getSamplesFilteredByLatency( @@ -117,9 +122,9 @@ public final class InProcessSampledSpanStoreImpl extends SampledSpanStoreImpl { long latencyLowerNs, long latencyUpperNs, int maxSpansToReturn, - List<SpanImpl> output, - EvictingQueue<SpanImpl> queue) { - for (SpanImpl span : queue) { + List<RecordEventsSpanImpl> output, + EvictingQueue<RecordEventsSpanImpl> queue) { + for (RecordEventsSpanImpl span : queue) { if (output.size() >= maxSpansToReturn) { break; } @@ -173,7 +178,7 @@ public final class InProcessSampledSpanStoreImpl extends SampledSpanStoreImpl { return errorBuckets[code.value() - 1]; } - private void considerForSampling(SpanImpl span) { + private void considerForSampling(RecordEventsSpanImpl span) { Status status = span.getStatus(); // Null status means running Span, this should not happen in production, but the library // should not crash because of this. @@ -208,8 +213,10 @@ public final class InProcessSampledSpanStoreImpl extends SampledSpanStoreImpl { return errorBucketSummaries; } - private List<SpanImpl> getErrorSamples(@Nullable CanonicalCode code, int maxSpansToReturn) { - ArrayList<SpanImpl> output = new ArrayList<SpanImpl>(maxSpansToReturn); + private List<RecordEventsSpanImpl> getErrorSamples( + @Nullable CanonicalCode code, int maxSpansToReturn) { + ArrayList<RecordEventsSpanImpl> output = + new ArrayList<RecordEventsSpanImpl>(maxSpansToReturn); if (code != null) { getErrorBucket(code).getSamples(maxSpansToReturn, output); } else { @@ -220,9 +227,10 @@ public final class InProcessSampledSpanStoreImpl extends SampledSpanStoreImpl { return output; } - private List<SpanImpl> getLatencySamples( + private List<RecordEventsSpanImpl> getLatencySamples( long latencyLowerNs, long latencyUpperNs, int maxSpansToReturn) { - ArrayList<SpanImpl> output = new ArrayList<SpanImpl>(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() @@ -257,7 +265,7 @@ public final class InProcessSampledSpanStoreImpl extends SampledSpanStoreImpl { } @Override - public void considerForSampling(SpanImpl span) { + public void considerForSampling(RecordEventsSpanImpl span) { synchronized (samples) { String spanName = span.getName(); if (span.getSampleToLocalSpanStore() && !samples.containsKey(spanName)) { @@ -346,8 +354,9 @@ public final class InProcessSampledSpanStoreImpl extends SampledSpanStoreImpl { filter.getMaxSpansToReturn() == 0 ? MAX_PER_SPAN_NAME_SAMPLES : filter.getMaxSpansToReturn(); - List<SpanImpl> spans = Collections.emptyList(); - // Try to not keep the lock to much, do the SpanImpl -> SpanData conversion outside the lock. + 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) { @@ -355,7 +364,7 @@ public final class InProcessSampledSpanStoreImpl extends SampledSpanStoreImpl { } } List<SpanData> ret = new ArrayList<SpanData>(spans.size()); - for (SpanImpl span : spans) { + for (RecordEventsSpanImpl span : spans) { ret.add(span.toSpanData()); } return Collections.unmodifiableList(ret); @@ -367,8 +376,9 @@ public final class InProcessSampledSpanStoreImpl extends SampledSpanStoreImpl { filter.getMaxSpansToReturn() == 0 ? MAX_PER_SPAN_NAME_SAMPLES : filter.getMaxSpansToReturn(); - List<SpanImpl> spans = Collections.emptyList(); - // Try to not keep the lock to much, do the SpanImpl -> SpanData conversion outside the lock. + 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) { @@ -378,7 +388,7 @@ public final class InProcessSampledSpanStoreImpl extends SampledSpanStoreImpl { } } List<SpanData> ret = new ArrayList<SpanData>(spans.size()); - for (SpanImpl span : spans) { + for (RecordEventsSpanImpl span : spans) { ret.add(span.toSpanData()); } return Collections.unmodifiableList(ret); diff --git a/impl_core/src/main/java/io/opencensus/implcore/trace/export/RunningSpanStoreImpl.java b/impl_core/src/main/java/io/opencensus/implcore/trace/export/RunningSpanStoreImpl.java index 53147def..962f5b01 100644 --- a/impl_core/src/main/java/io/opencensus/implcore/trace/export/RunningSpanStoreImpl.java +++ b/impl_core/src/main/java/io/opencensus/implcore/trace/export/RunningSpanStoreImpl.java @@ -16,11 +16,8 @@ package io.opencensus.implcore.trace.export; -import io.opencensus.implcore.trace.SpanImpl; +import io.opencensus.implcore.trace.RecordEventsSpanImpl; import io.opencensus.trace.export.RunningSpanStore; -import io.opencensus.trace.export.RunningSpanStore.Filter; -import io.opencensus.trace.export.RunningSpanStore.PerSpanNameSummary; -import io.opencensus.trace.export.RunningSpanStore.Summary; import io.opencensus.trace.export.SpanData; import java.util.Collection; import java.util.Collections; @@ -41,14 +38,14 @@ public abstract class RunningSpanStoreImpl extends RunningSpanStore { * * @param span the {@code Span} that started. */ - public abstract void onStart(SpanImpl span); + public abstract void onStart(RecordEventsSpanImpl span); /** * Removes the {@code Span} from the running spans list when the {@code Span} ends. * * @param span the {@code Span} that ended. */ - public abstract void onEnd(SpanImpl span); + public abstract void onEnd(RecordEventsSpanImpl span); private static final class NoopRunningSpanStoreImpl extends RunningSpanStoreImpl { @@ -56,10 +53,10 @@ public abstract class RunningSpanStoreImpl extends RunningSpanStore { RunningSpanStore.Summary.create(Collections.<String, PerSpanNameSummary>emptyMap()); @Override - public void onStart(SpanImpl span) {} + public void onStart(RecordEventsSpanImpl span) {} @Override - public void onEnd(SpanImpl span) {} + public void onEnd(RecordEventsSpanImpl span) {} @Override public Summary getSummary() { diff --git a/impl_core/src/main/java/io/opencensus/implcore/trace/export/SampledSpanStoreImpl.java b/impl_core/src/main/java/io/opencensus/implcore/trace/export/SampledSpanStoreImpl.java index 302d5cd3..e67c2f8e 100644 --- a/impl_core/src/main/java/io/opencensus/implcore/trace/export/SampledSpanStoreImpl.java +++ b/impl_core/src/main/java/io/opencensus/implcore/trace/export/SampledSpanStoreImpl.java @@ -16,12 +16,8 @@ package io.opencensus.implcore.trace.export; -import io.opencensus.implcore.trace.SpanImpl; +import io.opencensus.implcore.trace.RecordEventsSpanImpl; import io.opencensus.trace.export.SampledSpanStore; -import io.opencensus.trace.export.SampledSpanStore.ErrorFilter; -import io.opencensus.trace.export.SampledSpanStore.LatencyFilter; -import io.opencensus.trace.export.SampledSpanStore.PerSpanNameSummary; -import io.opencensus.trace.export.SampledSpanStore.Summary; import io.opencensus.trace.export.SpanData; import java.util.Collection; import java.util.Collections; @@ -43,7 +39,7 @@ public abstract class SampledSpanStoreImpl extends SampledSpanStore { * * @param span the span to be consider for storing into the store buckets. */ - public abstract void considerForSampling(SpanImpl span); + public abstract void considerForSampling(RecordEventsSpanImpl span); protected void shutdown() {} @@ -59,7 +55,7 @@ public abstract class SampledSpanStoreImpl extends SampledSpanStore { } @Override - public void considerForSampling(SpanImpl span) {} + public void considerForSampling(RecordEventsSpanImpl span) {} @Override public void registerSpanNamesForCollection(Collection<String> spanNames) {} diff --git a/impl_core/src/main/java/io/opencensus/implcore/trace/export/SpanExporterImpl.java b/impl_core/src/main/java/io/opencensus/implcore/trace/export/SpanExporterImpl.java index b9b1e98c..51a7b05c 100644 --- a/impl_core/src/main/java/io/opencensus/implcore/trace/export/SpanExporterImpl.java +++ b/impl_core/src/main/java/io/opencensus/implcore/trace/export/SpanExporterImpl.java @@ -19,7 +19,7 @@ package io.opencensus.implcore.trace.export; import com.google.common.annotations.VisibleForTesting; import io.opencensus.common.Duration; import io.opencensus.implcore.internal.DaemonThreadFactory; -import io.opencensus.implcore.trace.SpanImpl; +import io.opencensus.implcore.trace.RecordEventsSpanImpl; import io.opencensus.trace.export.ExportComponent; import io.opencensus.trace.export.SpanData; import io.opencensus.trace.export.SpanExporter; @@ -60,7 +60,7 @@ public final class SpanExporterImpl extends SpanExporter { * * @param span the {@code Span} to be added. */ - public void addSpan(SpanImpl span) { + public void addSpan(RecordEventsSpanImpl span) { worker.addSpan(span); } @@ -108,14 +108,14 @@ public final class SpanExporterImpl extends SpanExporter { private final Object monitor = new Object(); @GuardedBy("monitor") - private final List<SpanImpl> spans; + private final List<RecordEventsSpanImpl> spans; private final Map<String, Handler> serviceHandlers = new ConcurrentHashMap<String, Handler>(); private final int bufferSize; private final long scheduleDelayMillis; // See SpanExporterImpl#addSpan. - private void addSpan(SpanImpl span) { + private void addSpan(RecordEventsSpanImpl span) { synchronized (monitor) { this.spans.add(span); if (spans.size() > bufferSize) { @@ -152,16 +152,16 @@ public final class SpanExporterImpl extends SpanExporter { } private Worker(int bufferSize, Duration scheduleDelay) { - spans = new ArrayList<SpanImpl>(bufferSize); + spans = new ArrayList<RecordEventsSpanImpl>(bufferSize); this.bufferSize = bufferSize; this.scheduleDelayMillis = scheduleDelay.toMillis(); } // Returns an unmodifiable list of all buffered spans data to ensure that any registered // service handler cannot modify the list. - private static List<SpanData> fromSpanImplToSpanData(List<SpanImpl> spans) { + private static List<SpanData> fromSpanImplToSpanData(List<RecordEventsSpanImpl> spans) { List<SpanData> spanDatas = new ArrayList<SpanData>(spans.size()); - for (SpanImpl span : spans) { + for (RecordEventsSpanImpl span : spans) { spanDatas.add(span.toSpanData()); } return Collections.unmodifiableList(spanDatas); @@ -172,7 +172,7 @@ public final class SpanExporterImpl extends SpanExporter { while (true) { // Copy all the batched spans in a separate list to release the monitor lock asap to // avoid blocking the producer thread. - List<SpanImpl> spansCopy; + List<RecordEventsSpanImpl> spansCopy; synchronized (monitor) { if (spans.size() < bufferSize) { do { @@ -187,7 +187,7 @@ public final class SpanExporterImpl extends SpanExporter { } } while (spans.isEmpty()); } - spansCopy = new ArrayList<SpanImpl>(spans); + spansCopy = new ArrayList<RecordEventsSpanImpl>(spans); spans.clear(); } // Execute the batch export outside the synchronized to not block all producers. @@ -199,9 +199,9 @@ public final class SpanExporterImpl extends SpanExporter { } void flush() { - List<SpanImpl> spansCopy; + List<RecordEventsSpanImpl> spansCopy; synchronized (monitor) { - spansCopy = new ArrayList<SpanImpl>(spans); + spansCopy = new ArrayList<RecordEventsSpanImpl>(spans); spans.clear(); } diff --git a/impl_core/src/test/java/io/opencensus/implcore/trace/NoRecordEventsSpanImplTest.java b/impl_core/src/test/java/io/opencensus/implcore/trace/NoRecordEventsSpanImplTest.java new file mode 100644 index 00000000..c576860d --- /dev/null +++ b/impl_core/src/test/java/io/opencensus/implcore/trace/NoRecordEventsSpanImplTest.java @@ -0,0 +1,91 @@ +/* + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.opencensus.implcore.trace; + +import static com.google.common.truth.Truth.assertThat; + +import io.opencensus.trace.Annotation; +import io.opencensus.trace.AttributeValue; +import io.opencensus.trace.EndSpanOptions; +import io.opencensus.trace.Link; +import io.opencensus.trace.MessageEvent; +import io.opencensus.trace.NetworkEvent; +import io.opencensus.trace.Span.Options; +import io.opencensus.trace.SpanContext; +import io.opencensus.trace.SpanId; +import io.opencensus.trace.Status; +import io.opencensus.trace.TraceId; +import io.opencensus.trace.TraceOptions; +import io.opencensus.trace.Tracestate; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** Unit tests for {@link NoRecordEventsSpanImpl}. */ +@RunWith(JUnit4.class) +public class NoRecordEventsSpanImplTest { + private final Random random = new Random(1234); + private final SpanContext spanContext = + SpanContext.create( + TraceId.generateRandomId(random), + SpanId.generateRandomId(random), + TraceOptions.DEFAULT, + Tracestate.builder().build()); + private final NoRecordEventsSpanImpl noRecordEventsSpan = + NoRecordEventsSpanImpl.create(spanContext); + + @Test + public void propagatesSpanContext() { + assertThat(noRecordEventsSpan.getContext()).isEqualTo(spanContext); + } + + @Test + public void hasNoRecordEventsOption() { + assertThat(noRecordEventsSpan.getOptions()).doesNotContain(Options.RECORD_EVENTS); + } + + @Test + public void doNotCrash() { + Map<String, AttributeValue> attributes = new HashMap<String, AttributeValue>(); + attributes.put( + "MyStringAttributeKey", AttributeValue.stringAttributeValue("MyStringAttributeValue")); + Map<String, AttributeValue> multipleAttributes = new HashMap<String, AttributeValue>(); + multipleAttributes.put( + "MyStringAttributeKey", AttributeValue.stringAttributeValue("MyStringAttributeValue")); + multipleAttributes.put("MyBooleanAttributeKey", AttributeValue.booleanAttributeValue(true)); + multipleAttributes.put("MyLongAttributeKey", AttributeValue.longAttributeValue(123)); + // Tests only that all the methods are not crashing/throwing errors. + noRecordEventsSpan.putAttribute( + "MyStringAttributeKey2", AttributeValue.stringAttributeValue("MyStringAttributeValue2")); + noRecordEventsSpan.addAttributes(attributes); + noRecordEventsSpan.addAttributes(multipleAttributes); + noRecordEventsSpan.addAnnotation("MyAnnotation"); + noRecordEventsSpan.addAnnotation("MyAnnotation", attributes); + noRecordEventsSpan.addAnnotation("MyAnnotation", multipleAttributes); + noRecordEventsSpan.addAnnotation(Annotation.fromDescription("MyAnnotation")); + noRecordEventsSpan.addNetworkEvent(NetworkEvent.builder(NetworkEvent.Type.SENT, 1L).build()); + noRecordEventsSpan.addMessageEvent(MessageEvent.builder(MessageEvent.Type.SENT, 1L).build()); + noRecordEventsSpan.addLink( + Link.fromSpanContext(SpanContext.INVALID, Link.Type.CHILD_LINKED_SPAN)); + noRecordEventsSpan.setStatus(Status.OK); + noRecordEventsSpan.end(EndSpanOptions.DEFAULT); + noRecordEventsSpan.end(); + } +} diff --git a/impl_core/src/test/java/io/opencensus/implcore/trace/SpanImplTest.java b/impl_core/src/test/java/io/opencensus/implcore/trace/RecordEventsSpanImplTest.java index 57818eea..b293a225 100644 --- a/impl_core/src/test/java/io/opencensus/implcore/trace/SpanImplTest.java +++ b/impl_core/src/test/java/io/opencensus/implcore/trace/RecordEventsSpanImplTest.java @@ -21,7 +21,7 @@ import static com.google.common.truth.Truth.assertThat; import io.opencensus.common.Duration; import io.opencensus.common.Timestamp; import io.opencensus.implcore.internal.TimestampConverter; -import io.opencensus.implcore.trace.SpanImpl.StartEndHandler; +import io.opencensus.implcore.trace.RecordEventsSpanImpl.StartEndHandler; import io.opencensus.testing.common.TestClock; import io.opencensus.trace.Annotation; import io.opencensus.trace.AttributeValue; @@ -29,7 +29,6 @@ import io.opencensus.trace.EndSpanOptions; import io.opencensus.trace.Link; import io.opencensus.trace.NetworkEvent; import io.opencensus.trace.Span.Kind; -import io.opencensus.trace.Span.Options; import io.opencensus.trace.SpanContext; import io.opencensus.trace.SpanId; import io.opencensus.trace.Status; @@ -37,7 +36,6 @@ import io.opencensus.trace.TraceId; import io.opencensus.trace.TraceOptions; import io.opencensus.trace.config.TraceParams; import io.opencensus.trace.export.SpanData; -import java.util.EnumSet; import java.util.HashMap; import java.util.Map; import java.util.Random; @@ -51,9 +49,9 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; -/** Unit tests for {@link SpanImpl}. */ +/** Unit tests for {@link RecordEventsSpanImpl}. */ @RunWith(JUnit4.class) -public class SpanImplTest { +public class RecordEventsSpanImplTest { private static final String SPAN_NAME = "MySpanName"; private static final String ANNOTATION_DESCRIPTION = "MyAnnotation"; private final Random random = new Random(1234); @@ -64,8 +62,6 @@ public class SpanImplTest { private final Timestamp timestamp = Timestamp.create(1234, 5678); private final TestClock testClock = TestClock.create(timestamp); private final TimestampConverter timestampConverter = TimestampConverter.now(testClock); - private final EnumSet<Options> noRecordSpanOptions = EnumSet.noneOf(Options.class); - private final EnumSet<Options> recordSpanOptions = EnumSet.of(Options.RECORD_EVENTS); private final Map<String, AttributeValue> attributes = new HashMap<String, AttributeValue>(); private final Map<String, AttributeValue> expectedAttributes = new HashMap<String, AttributeValue>(); @@ -86,37 +82,10 @@ public class SpanImplTest { } @Test - public void toSpanData_NoRecordEvents() { - SpanImpl span = - SpanImpl.startSpan( - spanContext, - noRecordSpanOptions, - SPAN_NAME, - null, - parentSpanId, - false, - TraceParams.DEFAULT, - startEndHandler, - timestampConverter, - testClock); - // Check that adding trace events after Span#end() does not throw any exception. - span.putAttributes(attributes); - span.addAnnotation(Annotation.fromDescription(ANNOTATION_DESCRIPTION)); - span.addAnnotation(ANNOTATION_DESCRIPTION, attributes); - span.addNetworkEvent( - NetworkEvent.builder(NetworkEvent.Type.RECV, 1).setUncompressedMessageSize(3).build()); - span.addLink(Link.fromSpanContext(spanContext, Link.Type.CHILD_LINKED_SPAN)); - span.end(); - exception.expect(IllegalStateException.class); - span.toSpanData(); - } - - @Test public void noEventsRecordedAfterEnd() { - SpanImpl span = - SpanImpl.startSpan( + RecordEventsSpanImpl span = + RecordEventsSpanImpl.startSpan( spanContext, - recordSpanOptions, SPAN_NAME, null, parentSpanId, @@ -149,10 +118,9 @@ public class SpanImplTest { @Test public void deprecatedAddAttributesStillWorks() { - SpanImpl span = - SpanImpl.startSpan( + RecordEventsSpanImpl span = + RecordEventsSpanImpl.startSpan( spanContext, - recordSpanOptions, SPAN_NAME, null, parentSpanId, @@ -169,10 +137,9 @@ public class SpanImplTest { @Test public void toSpanData_ActiveSpan() { - SpanImpl span = - SpanImpl.startSpan( + RecordEventsSpanImpl span = + RecordEventsSpanImpl.startSpan( spanContext, - recordSpanOptions, SPAN_NAME, null, parentSpanId, @@ -229,10 +196,9 @@ public class SpanImplTest { @Test public void toSpanData_EndedSpan() { - SpanImpl span = - SpanImpl.startSpan( + RecordEventsSpanImpl span = + RecordEventsSpanImpl.startSpan( spanContext, - recordSpanOptions, SPAN_NAME, null, parentSpanId, @@ -291,10 +257,9 @@ public class SpanImplTest { @Test public void status_ViaSetStatus() { - SpanImpl span = - SpanImpl.startSpan( + RecordEventsSpanImpl span = + RecordEventsSpanImpl.startSpan( spanContext, - recordSpanOptions, SPAN_NAME, null, parentSpanId, @@ -314,10 +279,9 @@ public class SpanImplTest { @Test public void status_ViaEndSpanOptions() { - SpanImpl span = - SpanImpl.startSpan( + RecordEventsSpanImpl span = + RecordEventsSpanImpl.startSpan( spanContext, - recordSpanOptions, SPAN_NAME, null, parentSpanId, @@ -340,10 +304,9 @@ public class SpanImplTest { final int maxNumberOfAttributes = 8; TraceParams traceParams = TraceParams.DEFAULT.toBuilder().setMaxNumberOfAttributes(maxNumberOfAttributes).build(); - SpanImpl span = - SpanImpl.startSpan( + RecordEventsSpanImpl span = + RecordEventsSpanImpl.startSpan( spanContext, - recordSpanOptions, SPAN_NAME, null, parentSpanId, @@ -389,10 +352,9 @@ public class SpanImplTest { final int maxNumberOfAttributes = 8; TraceParams traceParams = TraceParams.DEFAULT.toBuilder().setMaxNumberOfAttributes(maxNumberOfAttributes).build(); - SpanImpl span = - SpanImpl.startSpan( + RecordEventsSpanImpl span = + RecordEventsSpanImpl.startSpan( spanContext, - recordSpanOptions, SPAN_NAME, null, parentSpanId, @@ -448,10 +410,9 @@ public class SpanImplTest { final int maxNumberOfAnnotations = 8; TraceParams traceParams = TraceParams.DEFAULT.toBuilder().setMaxNumberOfAnnotations(maxNumberOfAnnotations).build(); - SpanImpl span = - SpanImpl.startSpan( + RecordEventsSpanImpl span = + RecordEventsSpanImpl.startSpan( spanContext, - recordSpanOptions, SPAN_NAME, null, parentSpanId, @@ -492,10 +453,9 @@ public class SpanImplTest { .toBuilder() .setMaxNumberOfNetworkEvents(maxNumberOfNetworkEvents) .build(); - SpanImpl span = - SpanImpl.startSpan( + RecordEventsSpanImpl span = + RecordEventsSpanImpl.startSpan( spanContext, - recordSpanOptions, SPAN_NAME, null, parentSpanId, @@ -536,10 +496,9 @@ public class SpanImplTest { final int maxNumberOfLinks = 8; TraceParams traceParams = TraceParams.DEFAULT.toBuilder().setMaxNumberOfLinks(maxNumberOfLinks).build(); - SpanImpl span = - SpanImpl.startSpan( + RecordEventsSpanImpl span = + RecordEventsSpanImpl.startSpan( spanContext, - recordSpanOptions, SPAN_NAME, null, parentSpanId, @@ -569,10 +528,9 @@ public class SpanImplTest { @Test public void sampleToLocalSpanStore() { - SpanImpl span = - SpanImpl.startSpan( + RecordEventsSpanImpl span = + RecordEventsSpanImpl.startSpan( spanContext, - recordSpanOptions, SPAN_NAME, null, parentSpanId, @@ -585,9 +543,8 @@ public class SpanImplTest { Mockito.verify(startEndHandler, Mockito.times(1)).onEnd(span); assertThat(span.getSampleToLocalSpanStore()).isTrue(); span = - SpanImpl.startSpan( + RecordEventsSpanImpl.startSpan( spanContext, - recordSpanOptions, SPAN_NAME, null, parentSpanId, @@ -603,10 +560,9 @@ public class SpanImplTest { @Test public void sampleToLocalSpanStore_RunningSpan() { - SpanImpl span = - SpanImpl.startSpan( + RecordEventsSpanImpl span = + RecordEventsSpanImpl.startSpan( spanContext, - recordSpanOptions, SPAN_NAME, null, parentSpanId, @@ -622,10 +578,9 @@ public class SpanImplTest { @Test public void getSpanKind() { - SpanImpl span = - SpanImpl.startSpan( + RecordEventsSpanImpl span = + RecordEventsSpanImpl.startSpan( spanContext, - recordSpanOptions, SPAN_NAME, Kind.SERVER, parentSpanId, diff --git a/impl_core/src/test/java/io/opencensus/implcore/trace/SpanBuilderImplTest.java b/impl_core/src/test/java/io/opencensus/implcore/trace/SpanBuilderImplTest.java index 1804130c..3267eac5 100644 --- a/impl_core/src/test/java/io/opencensus/implcore/trace/SpanBuilderImplTest.java +++ b/impl_core/src/test/java/io/opencensus/implcore/trace/SpanBuilderImplTest.java @@ -19,7 +19,7 @@ package io.opencensus.implcore.trace; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.when; -import io.opencensus.implcore.trace.SpanImpl.StartEndHandler; +import io.opencensus.implcore.trace.RecordEventsSpanImpl.StartEndHandler; import io.opencensus.implcore.trace.internal.RandomHandler; import io.opencensus.testing.common.TestClock; import io.opencensus.trace.Span; @@ -63,27 +63,55 @@ public class SpanBuilderImplTest { } @Test + public void startSpan_CreatesTheCorrectSpanImplInstance() { + assertThat( + SpanBuilderImpl.createWithParent(SPAN_NAME, null, spanBuilderOptions) + .setSampler(Samplers.alwaysSample()) + .startSpan()) + .isInstanceOf(RecordEventsSpanImpl.class); + assertThat( + SpanBuilderImpl.createWithParent(SPAN_NAME, null, spanBuilderOptions) + .setRecordEvents(true) + .setSampler(Samplers.neverSample()) + .startSpan()) + .isInstanceOf(RecordEventsSpanImpl.class); + assertThat( + SpanBuilderImpl.createWithParent(SPAN_NAME, null, spanBuilderOptions) + .setSampler(Samplers.neverSample()) + .startSpan()) + .isInstanceOf(NoRecordEventsSpanImpl.class); + } + + @Test public void setSpanKind_NotNull() { - SpanImpl span = - SpanBuilderImpl.createWithParent(SPAN_NAME, null, spanBuilderOptions) - .setSpanKind(Kind.CLIENT) - .startSpan(); + RecordEventsSpanImpl span = + (RecordEventsSpanImpl) + SpanBuilderImpl.createWithParent(SPAN_NAME, null, spanBuilderOptions) + .setSpanKind(Kind.CLIENT) + .setRecordEvents(true) + .startSpan(); assertThat(span.getKind()).isEqualTo(Kind.CLIENT); assertThat(span.toSpanData().getKind()).isEqualTo(Kind.CLIENT); } @Test public void setSpanKind_DefaultNull() { - SpanImpl span = - SpanBuilderImpl.createWithParent(SPAN_NAME, null, spanBuilderOptions).startSpan(); + RecordEventsSpanImpl span = + (RecordEventsSpanImpl) + SpanBuilderImpl.createWithParent(SPAN_NAME, null, spanBuilderOptions) + .setRecordEvents(true) + .startSpan(); assertThat(span.getKind()).isNull(); assertThat(span.toSpanData().getKind()).isNull(); } @Test public void startSpanNullParent() { - SpanImpl span = - SpanBuilderImpl.createWithParent(SPAN_NAME, null, spanBuilderOptions).startSpan(); + RecordEventsSpanImpl span = + (RecordEventsSpanImpl) + SpanBuilderImpl.createWithParent(SPAN_NAME, null, spanBuilderOptions) + .setRecordEvents(true) + .startSpan(); assertThat(span.getContext().isValid()).isTrue(); assertThat(span.getOptions().contains(Options.RECORD_EVENTS)).isTrue(); assertThat(span.getContext().getTraceOptions().isSampled()).isTrue(); @@ -96,11 +124,12 @@ public class SpanBuilderImplTest { @Test public void startSpanNullParentWithRecordEvents() { - SpanImpl span = - SpanBuilderImpl.createWithParent(SPAN_NAME, null, spanBuilderOptions) - .setSampler(Samplers.neverSample()) - .setRecordEvents(true) - .startSpan(); + RecordEventsSpanImpl span = + (RecordEventsSpanImpl) + SpanBuilderImpl.createWithParent(SPAN_NAME, null, spanBuilderOptions) + .setSampler(Samplers.neverSample()) + .setRecordEvents(true) + .startSpan(); assertThat(span.getContext().isValid()).isTrue(); assertThat(span.getOptions().contains(Options.RECORD_EVENTS)).isTrue(); assertThat(span.getContext().getTraceOptions().isSampled()).isFalse(); @@ -127,22 +156,25 @@ public class SpanBuilderImplTest { assertThat(rootSpan.getContext().isValid()).isTrue(); assertThat(rootSpan.getOptions().contains(Options.RECORD_EVENTS)).isTrue(); assertThat(rootSpan.getContext().getTraceOptions().isSampled()).isTrue(); - assertThat(((SpanImpl) rootSpan).toSpanData().getHasRemoteParent()).isNull(); + assertThat(((RecordEventsSpanImpl) rootSpan).toSpanData().getHasRemoteParent()).isNull(); Span childSpan = SpanBuilderImpl.createWithParent(SPAN_NAME, rootSpan, spanBuilderOptions).startSpan(); assertThat(childSpan.getContext().isValid()).isTrue(); assertThat(childSpan.getContext().getTraceId()).isEqualTo(rootSpan.getContext().getTraceId()); - assertThat(((SpanImpl) childSpan).toSpanData().getParentSpanId()) + assertThat(((RecordEventsSpanImpl) childSpan).toSpanData().getParentSpanId()) .isEqualTo(rootSpan.getContext().getSpanId()); - assertThat(((SpanImpl) childSpan).toSpanData().getHasRemoteParent()).isFalse(); - assertThat(((SpanImpl) childSpan).getTimestampConverter()) - .isEqualTo(((SpanImpl) rootSpan).getTimestampConverter()); + assertThat(((RecordEventsSpanImpl) childSpan).toSpanData().getHasRemoteParent()).isFalse(); + assertThat(((RecordEventsSpanImpl) childSpan).getTimestampConverter()) + .isEqualTo(((RecordEventsSpanImpl) rootSpan).getTimestampConverter()); } @Test public void startRemoteSpan_NullParent() { - SpanImpl span = - SpanBuilderImpl.createWithRemoteParent(SPAN_NAME, null, spanBuilderOptions).startSpan(); + RecordEventsSpanImpl span = + (RecordEventsSpanImpl) + SpanBuilderImpl.createWithRemoteParent(SPAN_NAME, null, spanBuilderOptions) + .setRecordEvents(true) + .startSpan(); assertThat(span.getContext().isValid()).isTrue(); assertThat(span.getOptions().contains(Options.RECORD_EVENTS)).isTrue(); assertThat(span.getContext().getTraceOptions().isSampled()).isTrue(); @@ -153,9 +185,11 @@ public class SpanBuilderImplTest { @Test public void startRemoteSpanInvalidParent() { - SpanImpl span = - SpanBuilderImpl.createWithRemoteParent(SPAN_NAME, SpanContext.INVALID, spanBuilderOptions) - .startSpan(); + RecordEventsSpanImpl span = + (RecordEventsSpanImpl) + SpanBuilderImpl.createWithRemoteParent( + SPAN_NAME, SpanContext.INVALID, spanBuilderOptions) + .startSpan(); assertThat(span.getContext().isValid()).isTrue(); assertThat(span.getOptions().contains(Options.RECORD_EVENTS)).isTrue(); assertThat(span.getContext().getTraceOptions().isSampled()).isTrue(); @@ -171,9 +205,11 @@ public class SpanBuilderImplTest { TraceId.generateRandomId(randomHandler.current()), SpanId.generateRandomId(randomHandler.current()), TraceOptions.DEFAULT); - SpanImpl span = - SpanBuilderImpl.createWithRemoteParent(SPAN_NAME, spanContext, spanBuilderOptions) - .startSpan(); + RecordEventsSpanImpl span = + (RecordEventsSpanImpl) + SpanBuilderImpl.createWithRemoteParent(SPAN_NAME, spanContext, spanBuilderOptions) + .setRecordEvents(true) + .startSpan(); assertThat(span.getContext().isValid()).isTrue(); assertThat(span.getContext().getTraceId()).isEqualTo(spanContext.getTraceId()); assertThat(span.getContext().getTraceOptions().isSampled()).isTrue(); diff --git a/impl_core/src/test/java/io/opencensus/implcore/trace/TracerImplTest.java b/impl_core/src/test/java/io/opencensus/implcore/trace/TracerImplTest.java index 21143e3c..d10be6a2 100644 --- a/impl_core/src/test/java/io/opencensus/implcore/trace/TracerImplTest.java +++ b/impl_core/src/test/java/io/opencensus/implcore/trace/TracerImplTest.java @@ -18,7 +18,7 @@ package io.opencensus.implcore.trace; import static com.google.common.truth.Truth.assertThat; -import io.opencensus.implcore.trace.SpanImpl.StartEndHandler; +import io.opencensus.implcore.trace.RecordEventsSpanImpl.StartEndHandler; import io.opencensus.implcore.trace.internal.RandomHandler.SecureRandomHandler; import io.opencensus.testing.common.TestClock; import io.opencensus.trace.BlankSpan; diff --git a/impl_core/src/test/java/io/opencensus/implcore/trace/export/InProcessRunningSpanStoreImplTest.java b/impl_core/src/test/java/io/opencensus/implcore/trace/export/InProcessRunningSpanStoreImplTest.java index 85db0868..68ce1c18 100644 --- a/impl_core/src/test/java/io/opencensus/implcore/trace/export/InProcessRunningSpanStoreImplTest.java +++ b/impl_core/src/test/java/io/opencensus/implcore/trace/export/InProcessRunningSpanStoreImplTest.java @@ -21,17 +21,15 @@ import static com.google.common.truth.Truth.assertThat; import io.opencensus.common.Duration; import io.opencensus.implcore.common.MillisClock; import io.opencensus.implcore.internal.SimpleEventQueue; -import io.opencensus.implcore.trace.SpanImpl; -import io.opencensus.implcore.trace.SpanImpl.StartEndHandler; +import io.opencensus.implcore.trace.RecordEventsSpanImpl; +import io.opencensus.implcore.trace.RecordEventsSpanImpl.StartEndHandler; import io.opencensus.implcore.trace.StartEndHandlerImpl; -import io.opencensus.trace.Span.Options; import io.opencensus.trace.SpanContext; import io.opencensus.trace.SpanId; import io.opencensus.trace.TraceId; import io.opencensus.trace.TraceOptions; import io.opencensus.trace.config.TraceParams; import io.opencensus.trace.export.RunningSpanStore.Filter; -import java.util.EnumSet; import java.util.Random; import org.junit.Test; import org.junit.runner.RunWith; @@ -51,17 +49,15 @@ public class InProcessRunningSpanStoreImplTest { private final StartEndHandler startEndHandler = new StartEndHandlerImpl( sampledSpansServiceExporter, activeSpansExporter, null, new SimpleEventQueue()); - private final EnumSet<Options> recordSpanOptions = EnumSet.of(Options.RECORD_EVENTS); - private SpanImpl createSpan(String spanName) { + private RecordEventsSpanImpl createSpan(String spanName) { final SpanContext spanContext = SpanContext.create( TraceId.generateRandomId(random), SpanId.generateRandomId(random), TraceOptions.DEFAULT); - return SpanImpl.startSpan( + return RecordEventsSpanImpl.startSpan( spanContext, - recordSpanOptions, spanName, null, SpanId.generateRandomId(random), @@ -74,8 +70,8 @@ public class InProcessRunningSpanStoreImplTest { @Test public void getSummary_SpansWithDifferentNames() { - final SpanImpl span1 = createSpan(SPAN_NAME_1); - final SpanImpl span2 = createSpan(SPAN_NAME_2); + final RecordEventsSpanImpl span1 = createSpan(SPAN_NAME_1); + final RecordEventsSpanImpl span2 = createSpan(SPAN_NAME_2); assertThat(activeSpansExporter.getSummary().getPerSpanNameSummary().size()).isEqualTo(2); assertThat( activeSpansExporter @@ -107,9 +103,9 @@ public class InProcessRunningSpanStoreImplTest { @Test public void getSummary_SpansWithSameName() { - final SpanImpl span1 = createSpan(SPAN_NAME_1); - final SpanImpl span2 = createSpan(SPAN_NAME_1); - final SpanImpl span3 = createSpan(SPAN_NAME_1); + final RecordEventsSpanImpl span1 = createSpan(SPAN_NAME_1); + final RecordEventsSpanImpl span2 = createSpan(SPAN_NAME_1); + final RecordEventsSpanImpl span3 = createSpan(SPAN_NAME_1); assertThat(activeSpansExporter.getSummary().getPerSpanNameSummary().size()).isEqualTo(1); assertThat( activeSpansExporter @@ -142,8 +138,8 @@ public class InProcessRunningSpanStoreImplTest { @Test public void getActiveSpans_SpansWithDifferentNames() { - SpanImpl span1 = createSpan(SPAN_NAME_1); - SpanImpl span2 = createSpan(SPAN_NAME_2); + RecordEventsSpanImpl span1 = createSpan(SPAN_NAME_1); + RecordEventsSpanImpl span2 = createSpan(SPAN_NAME_2); assertThat(activeSpansExporter.getRunningSpans(Filter.create(SPAN_NAME_1, 0))) .containsExactly(span1.toSpanData()); assertThat(activeSpansExporter.getRunningSpans(Filter.create(SPAN_NAME_1, 2))) @@ -156,9 +152,9 @@ public class InProcessRunningSpanStoreImplTest { @Test public void getActiveSpans_SpansWithSameName() { - SpanImpl span1 = createSpan(SPAN_NAME_1); - SpanImpl span2 = createSpan(SPAN_NAME_1); - SpanImpl span3 = createSpan(SPAN_NAME_1); + RecordEventsSpanImpl span1 = createSpan(SPAN_NAME_1); + RecordEventsSpanImpl span2 = createSpan(SPAN_NAME_1); + RecordEventsSpanImpl span3 = createSpan(SPAN_NAME_1); assertThat(activeSpansExporter.getRunningSpans(Filter.create(SPAN_NAME_1, 0))) .containsExactly(span1.toSpanData(), span2.toSpanData(), span3.toSpanData()); assertThat(activeSpansExporter.getRunningSpans(Filter.create(SPAN_NAME_1, 2)).size()) diff --git a/impl_core/src/test/java/io/opencensus/implcore/trace/export/InProcessSampledSpanStoreImplTest.java b/impl_core/src/test/java/io/opencensus/implcore/trace/export/InProcessSampledSpanStoreImplTest.java index e1d2c4bb..7d8b434e 100644 --- a/impl_core/src/test/java/io/opencensus/implcore/trace/export/InProcessSampledSpanStoreImplTest.java +++ b/impl_core/src/test/java/io/opencensus/implcore/trace/export/InProcessSampledSpanStoreImplTest.java @@ -21,12 +21,11 @@ import static com.google.common.truth.Truth.assertThat; import io.opencensus.common.Duration; import io.opencensus.common.Timestamp; import io.opencensus.implcore.internal.SimpleEventQueue; -import io.opencensus.implcore.trace.SpanImpl; -import io.opencensus.implcore.trace.SpanImpl.StartEndHandler; +import io.opencensus.implcore.trace.RecordEventsSpanImpl; +import io.opencensus.implcore.trace.RecordEventsSpanImpl.StartEndHandler; import io.opencensus.testing.common.TestClock; import io.opencensus.trace.EndSpanOptions; import io.opencensus.trace.Span; -import io.opencensus.trace.Span.Options; import io.opencensus.trace.SpanContext; import io.opencensus.trace.SpanId; import io.opencensus.trace.Status; @@ -41,7 +40,6 @@ import io.opencensus.trace.export.SampledSpanStore.PerSpanNameSummary; import io.opencensus.trace.export.SpanData; import java.util.Collection; import java.util.Collections; -import java.util.EnumSet; import java.util.Map; import java.util.Random; import java.util.concurrent.TimeUnit; @@ -66,19 +64,18 @@ public class InProcessSampledSpanStoreImplTest { SpanContext.create( TraceId.generateRandomId(random), SpanId.generateRandomId(random), TraceOptions.DEFAULT); private final SpanId parentSpanId = SpanId.generateRandomId(random); - private final EnumSet<Options> recordSpanOptions = EnumSet.of(Options.RECORD_EVENTS); private final TestClock testClock = TestClock.create(Timestamp.create(12345, 54321)); private final InProcessSampledSpanStoreImpl sampleStore = new InProcessSampledSpanStoreImpl(new SimpleEventQueue()); private final StartEndHandler startEndHandler = new StartEndHandler() { @Override - public void onStart(SpanImpl span) { + public void onStart(RecordEventsSpanImpl span) { // Do nothing. } @Override - public void onEnd(SpanImpl span) { + public void onEnd(RecordEventsSpanImpl span) { sampleStore.considerForSampling(span); } }; @@ -88,10 +85,9 @@ public class InProcessSampledSpanStoreImplTest { sampleStore.registerSpanNamesForCollection(Collections.singletonList(REGISTERED_SPAN_NAME)); } - private SpanImpl createSampledSpan(String spanName) { - return SpanImpl.startSpan( + private RecordEventsSpanImpl createSampledSpan(String spanName) { + return RecordEventsSpanImpl.startSpan( sampledSpanContext, - recordSpanOptions, spanName, null, parentSpanId, @@ -102,10 +98,9 @@ public class InProcessSampledSpanStoreImplTest { testClock); } - private SpanImpl createNotSampledSpan(String spanName) { - return SpanImpl.startSpan( + private RecordEventsSpanImpl createNotSampledSpan(String spanName) { + return RecordEventsSpanImpl.startSpan( notSampledSpanContext, - recordSpanOptions, spanName, null, parentSpanId, @@ -216,7 +211,7 @@ public class InProcessSampledSpanStoreImplTest { @Test public void getErrorSampledSpans() { - SpanImpl span = createSampledSpan(REGISTERED_SPAN_NAME); + RecordEventsSpanImpl span = createSampledSpan(REGISTERED_SPAN_NAME); testClock.advanceTime(Duration.create(0, 1000)); span.end(EndSpanOptions.builder().setStatus(Status.CANCELLED).build()); Collection<SpanData> samples = @@ -228,12 +223,12 @@ public class InProcessSampledSpanStoreImplTest { @Test public void getErrorSampledSpans_MaxSpansToReturn() { - SpanImpl span1 = createSampledSpan(REGISTERED_SPAN_NAME); + 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)); - SpanImpl span2 = createSampledSpan(REGISTERED_SPAN_NAME); + RecordEventsSpanImpl span2 = createSampledSpan(REGISTERED_SPAN_NAME); testClock.advanceTime(Duration.create(0, 1000)); span2.end(EndSpanOptions.builder().setStatus(Status.CANCELLED).build()); Collection<SpanData> samples = @@ -246,10 +241,10 @@ public class InProcessSampledSpanStoreImplTest { @Test public void getErrorSampledSpans_NullCode() { - SpanImpl span1 = createSampledSpan(REGISTERED_SPAN_NAME); + RecordEventsSpanImpl span1 = createSampledSpan(REGISTERED_SPAN_NAME); testClock.advanceTime(Duration.create(0, 1000)); span1.end(EndSpanOptions.builder().setStatus(Status.CANCELLED).build()); - SpanImpl span2 = createSampledSpan(REGISTERED_SPAN_NAME); + RecordEventsSpanImpl span2 = createSampledSpan(REGISTERED_SPAN_NAME); testClock.advanceTime(Duration.create(0, 1000)); span2.end(EndSpanOptions.builder().setStatus(Status.UNKNOWN).build()); Collection<SpanData> samples = @@ -260,10 +255,10 @@ public class InProcessSampledSpanStoreImplTest { @Test public void getErrorSampledSpans_NullCode_MaxSpansToReturn() { - SpanImpl span1 = createSampledSpan(REGISTERED_SPAN_NAME); + RecordEventsSpanImpl span1 = createSampledSpan(REGISTERED_SPAN_NAME); testClock.advanceTime(Duration.create(0, 1000)); span1.end(EndSpanOptions.builder().setStatus(Status.CANCELLED).build()); - SpanImpl span2 = createSampledSpan(REGISTERED_SPAN_NAME); + RecordEventsSpanImpl span2 = createSampledSpan(REGISTERED_SPAN_NAME); testClock.advanceTime(Duration.create(0, 1000)); span2.end(EndSpanOptions.builder().setStatus(Status.UNKNOWN).build()); Collection<SpanData> samples = @@ -274,7 +269,7 @@ public class InProcessSampledSpanStoreImplTest { @Test public void getLatencySampledSpans() { - SpanImpl span = createSampledSpan(REGISTERED_SPAN_NAME); + RecordEventsSpanImpl span = createSampledSpan(REGISTERED_SPAN_NAME); testClock.advanceTime(Duration.create(0, (int) TimeUnit.MICROSECONDS.toNanos(20))); span.end(); Collection<SpanData> samples = @@ -290,7 +285,7 @@ public class InProcessSampledSpanStoreImplTest { @Test public void getLatencySampledSpans_ExclusiveUpperBound() { - SpanImpl span = createSampledSpan(REGISTERED_SPAN_NAME); + RecordEventsSpanImpl span = createSampledSpan(REGISTERED_SPAN_NAME); testClock.advanceTime(Duration.create(0, (int) TimeUnit.MICROSECONDS.toNanos(20))); span.end(); Collection<SpanData> samples = @@ -305,7 +300,7 @@ public class InProcessSampledSpanStoreImplTest { @Test public void getLatencySampledSpans_InclusiveLowerBound() { - SpanImpl span = createSampledSpan(REGISTERED_SPAN_NAME); + RecordEventsSpanImpl span = createSampledSpan(REGISTERED_SPAN_NAME); testClock.advanceTime(Duration.create(0, (int) TimeUnit.MICROSECONDS.toNanos(20))); span.end(); Collection<SpanData> samples = @@ -321,12 +316,12 @@ public class InProcessSampledSpanStoreImplTest { @Test public void getLatencySampledSpans_QueryBetweenMultipleBuckets() { - SpanImpl span1 = createSampledSpan(REGISTERED_SPAN_NAME); + 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)); - SpanImpl span2 = createSampledSpan(REGISTERED_SPAN_NAME); + RecordEventsSpanImpl span2 = createSampledSpan(REGISTERED_SPAN_NAME); testClock.advanceTime(Duration.create(0, (int) TimeUnit.MICROSECONDS.toNanos(200))); span2.end(); Collection<SpanData> samples = @@ -341,12 +336,12 @@ public class InProcessSampledSpanStoreImplTest { @Test public void getLatencySampledSpans_MaxSpansToReturn() { - SpanImpl span1 = createSampledSpan(REGISTERED_SPAN_NAME); + 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)); - SpanImpl span2 = createSampledSpan(REGISTERED_SPAN_NAME); + RecordEventsSpanImpl span2 = createSampledSpan(REGISTERED_SPAN_NAME); testClock.advanceTime(Duration.create(0, (int) TimeUnit.MICROSECONDS.toNanos(200))); span2.end(); Collection<SpanData> samples = @@ -362,7 +357,7 @@ public class InProcessSampledSpanStoreImplTest { @Test public void ignoreNegativeSpanLatency() { - SpanImpl span = createSampledSpan(REGISTERED_SPAN_NAME); + RecordEventsSpanImpl span = createSampledSpan(REGISTERED_SPAN_NAME); testClock.advanceTime(Duration.create(0, (int) TimeUnit.MICROSECONDS.toNanos(-20))); span.end(); Collection<SpanData> samples = diff --git a/impl_core/src/test/java/io/opencensus/implcore/trace/export/NoopRunningSpanStoreImplTest.java b/impl_core/src/test/java/io/opencensus/implcore/trace/export/NoopRunningSpanStoreImplTest.java index 2877bb33..96669df7 100644 --- a/impl_core/src/test/java/io/opencensus/implcore/trace/export/NoopRunningSpanStoreImplTest.java +++ b/impl_core/src/test/java/io/opencensus/implcore/trace/export/NoopRunningSpanStoreImplTest.java @@ -22,17 +22,15 @@ import io.opencensus.common.Timestamp; import io.opencensus.implcore.internal.EventQueue; import io.opencensus.implcore.internal.SimpleEventQueue; import io.opencensus.implcore.internal.TimestampConverter; -import io.opencensus.implcore.trace.SpanImpl; -import io.opencensus.implcore.trace.SpanImpl.StartEndHandler; +import io.opencensus.implcore.trace.RecordEventsSpanImpl; +import io.opencensus.implcore.trace.RecordEventsSpanImpl.StartEndHandler; import io.opencensus.testing.common.TestClock; -import io.opencensus.trace.Span.Options; import io.opencensus.trace.SpanContext; import io.opencensus.trace.SpanId; import io.opencensus.trace.TraceId; import io.opencensus.trace.TraceOptions; import io.opencensus.trace.config.TraceParams; import io.opencensus.trace.export.RunningSpanStore.Filter; -import java.util.EnumSet; import java.util.Random; import org.junit.Before; import org.junit.Test; @@ -54,9 +52,8 @@ public class NoopRunningSpanStoreImplTest { TraceId.generateRandomId(random), SpanId.generateRandomId(random), TraceOptions.DEFAULT); private final TestClock testClock = TestClock.create(timestamp); private final TimestampConverter timestampConverter = TimestampConverter.now(testClock); - private final EnumSet<Options> recordSpanOptions = EnumSet.of(Options.RECORD_EVENTS); @Mock private StartEndHandler startEndHandler; - private SpanImpl spanImpl; + private RecordEventsSpanImpl recordEventsSpanImpl; // maxSpansToReturn=0 means all private final Filter filter = Filter.create(SPAN_NAME, 0 /* maxSpansToReturn */); private final EventQueue eventQueue = new SimpleEventQueue(); @@ -66,10 +63,9 @@ public class NoopRunningSpanStoreImplTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); - spanImpl = - SpanImpl.startSpan( + recordEventsSpanImpl = + RecordEventsSpanImpl.startSpan( spanContext, - recordSpanOptions, SPAN_NAME, null, null, @@ -90,10 +86,10 @@ public class NoopRunningSpanStoreImplTest { public void noopImplementation() { getMethodsShouldReturnEmpty(); // onStart() does not affect the result. - runningSpanStoreImpl.onStart(spanImpl); + runningSpanStoreImpl.onStart(recordEventsSpanImpl); getMethodsShouldReturnEmpty(); // onEnd() does not affect the result. - runningSpanStoreImpl.onEnd(spanImpl); + runningSpanStoreImpl.onEnd(recordEventsSpanImpl); getMethodsShouldReturnEmpty(); } } diff --git a/impl_core/src/test/java/io/opencensus/implcore/trace/export/NoopSampledSpanStoreImplTest.java b/impl_core/src/test/java/io/opencensus/implcore/trace/export/NoopSampledSpanStoreImplTest.java index 3ba33fd1..b9fbd432 100644 --- a/impl_core/src/test/java/io/opencensus/implcore/trace/export/NoopSampledSpanStoreImplTest.java +++ b/impl_core/src/test/java/io/opencensus/implcore/trace/export/NoopSampledSpanStoreImplTest.java @@ -22,10 +22,9 @@ import io.opencensus.common.Timestamp; import io.opencensus.implcore.internal.EventQueue; import io.opencensus.implcore.internal.SimpleEventQueue; import io.opencensus.implcore.internal.TimestampConverter; -import io.opencensus.implcore.trace.SpanImpl; -import io.opencensus.implcore.trace.SpanImpl.StartEndHandler; +import io.opencensus.implcore.trace.RecordEventsSpanImpl; +import io.opencensus.implcore.trace.RecordEventsSpanImpl.StartEndHandler; import io.opencensus.testing.common.TestClock; -import io.opencensus.trace.Span.Options; import io.opencensus.trace.SpanContext; import io.opencensus.trace.SpanId; import io.opencensus.trace.TraceId; @@ -35,7 +34,6 @@ import io.opencensus.trace.export.SampledSpanStore.ErrorFilter; import io.opencensus.trace.export.SampledSpanStore.LatencyFilter; import java.util.Collection; import java.util.Collections; -import java.util.EnumSet; import java.util.Random; import org.junit.Before; import org.junit.Test; @@ -59,9 +57,8 @@ public final class NoopSampledSpanStoreImplTest { TraceId.generateRandomId(random), SpanId.generateRandomId(random), TraceOptions.DEFAULT); private final TestClock testClock = TestClock.create(timestamp); private final TimestampConverter timestampConverter = TimestampConverter.now(testClock); - private final EnumSet<Options> recordSpanOptions = EnumSet.of(Options.RECORD_EVENTS); @Mock private StartEndHandler startEndHandler; - private SpanImpl spanImpl; + private RecordEventsSpanImpl recordEventsSpanImpl; // maxSpansToReturn=0 means all private final ErrorFilter errorFilter = ErrorFilter.create(SPAN_NAME, null /* canonicalCode */, 0 /* maxSpansToReturn */); @@ -99,10 +96,9 @@ public final class NoopSampledSpanStoreImplTest { // considerForSampling() should do nothing and do not affect the result. // It should be called after registerSpanNamesForCollection. - spanImpl = - SpanImpl.startSpan( + recordEventsSpanImpl = + RecordEventsSpanImpl.startSpan( spanContext, - recordSpanOptions, SPAN_NAME, null, null, @@ -111,8 +107,8 @@ public final class NoopSampledSpanStoreImplTest { startEndHandler, timestampConverter, testClock); - spanImpl.end(); - sampledSpanStoreImpl.considerForSampling(spanImpl); + recordEventsSpanImpl.end(); + sampledSpanStoreImpl.considerForSampling(recordEventsSpanImpl); getMethodsShouldReturnEmpty(); // unregisterSpanNamesForCollection() should do nothing and do not affect the result. diff --git a/impl_core/src/test/java/io/opencensus/implcore/trace/export/SpanExporterImplTest.java b/impl_core/src/test/java/io/opencensus/implcore/trace/export/SpanExporterImplTest.java index d99776d1..f8f1d917 100644 --- a/impl_core/src/test/java/io/opencensus/implcore/trace/export/SpanExporterImplTest.java +++ b/impl_core/src/test/java/io/opencensus/implcore/trace/export/SpanExporterImplTest.java @@ -23,11 +23,10 @@ import static org.mockito.Mockito.doThrow; import io.opencensus.common.Duration; import io.opencensus.implcore.common.MillisClock; import io.opencensus.implcore.internal.SimpleEventQueue; -import io.opencensus.implcore.trace.SpanImpl; -import io.opencensus.implcore.trace.SpanImpl.StartEndHandler; +import io.opencensus.implcore.trace.RecordEventsSpanImpl; +import io.opencensus.implcore.trace.RecordEventsSpanImpl.StartEndHandler; import io.opencensus.implcore.trace.StartEndHandlerImpl; import io.opencensus.testing.export.TestHandler; -import io.opencensus.trace.Span.Options; import io.opencensus.trace.SpanContext; import io.opencensus.trace.SpanId; import io.opencensus.trace.TraceId; @@ -35,7 +34,6 @@ import io.opencensus.trace.TraceOptions; import io.opencensus.trace.config.TraceParams; import io.opencensus.trace.export.SpanData; import io.opencensus.trace.export.SpanExporter.Handler; -import java.util.EnumSet; import java.util.List; import java.util.Random; import org.junit.Before; @@ -60,7 +58,6 @@ public class SpanExporterImplTest { SpanContext.create( TraceId.generateRandomId(random), SpanId.generateRandomId(random), TraceOptions.DEFAULT); private final RunningSpanStoreImpl runningSpanStore = new InProcessRunningSpanStoreImpl(); - private final EnumSet<Options> recordSpanOptions = EnumSet.of(Options.RECORD_EVENTS); private final TestHandler serviceHandler = new TestHandler(); @Mock private Handler mockServiceHandler; @@ -69,11 +66,11 @@ public class SpanExporterImplTest { MockitoAnnotations.initMocks(this); } - private SpanImpl createSampledEndedSpan(StartEndHandler startEndHandler, String spanName) { - SpanImpl span = - SpanImpl.startSpan( + private RecordEventsSpanImpl createSampledEndedSpan( + StartEndHandler startEndHandler, String spanName) { + RecordEventsSpanImpl span = + RecordEventsSpanImpl.startSpan( sampledSpanContext, - recordSpanOptions, spanName, null, null, @@ -86,11 +83,11 @@ public class SpanExporterImplTest { return span; } - private SpanImpl createNotSampledEndedSpan(StartEndHandler startEndHandler, String spanName) { - SpanImpl span = - SpanImpl.startSpan( + private RecordEventsSpanImpl createNotSampledEndedSpan( + StartEndHandler startEndHandler, String spanName) { + RecordEventsSpanImpl span = + RecordEventsSpanImpl.startSpan( notSampledSpanContext, - recordSpanOptions, spanName, null, null, @@ -111,8 +108,8 @@ public class SpanExporterImplTest { spanExporter.registerHandler("test.service", serviceHandler); - SpanImpl span1 = createSampledEndedSpan(startEndHandler, SPAN_NAME_1); - SpanImpl span2 = createSampledEndedSpan(startEndHandler, SPAN_NAME_2); + RecordEventsSpanImpl span1 = createSampledEndedSpan(startEndHandler, SPAN_NAME_1); + RecordEventsSpanImpl span2 = createSampledEndedSpan(startEndHandler, SPAN_NAME_2); List<SpanData> exported = serviceHandler.waitForExport(2); assertThat(exported).containsExactly(span1.toSpanData(), span2.toSpanData()); } @@ -125,12 +122,12 @@ public class SpanExporterImplTest { spanExporter.registerHandler("test.service", serviceHandler); - SpanImpl span1 = createSampledEndedSpan(startEndHandler, SPAN_NAME_1); - SpanImpl span2 = createSampledEndedSpan(startEndHandler, SPAN_NAME_1); - SpanImpl span3 = createSampledEndedSpan(startEndHandler, SPAN_NAME_1); - SpanImpl span4 = createSampledEndedSpan(startEndHandler, SPAN_NAME_1); - SpanImpl span5 = createSampledEndedSpan(startEndHandler, SPAN_NAME_1); - SpanImpl span6 = createSampledEndedSpan(startEndHandler, SPAN_NAME_1); + RecordEventsSpanImpl span1 = createSampledEndedSpan(startEndHandler, SPAN_NAME_1); + RecordEventsSpanImpl span2 = createSampledEndedSpan(startEndHandler, SPAN_NAME_1); + RecordEventsSpanImpl span3 = createSampledEndedSpan(startEndHandler, SPAN_NAME_1); + RecordEventsSpanImpl span4 = createSampledEndedSpan(startEndHandler, SPAN_NAME_1); + RecordEventsSpanImpl span5 = createSampledEndedSpan(startEndHandler, SPAN_NAME_1); + RecordEventsSpanImpl span6 = createSampledEndedSpan(startEndHandler, SPAN_NAME_1); List<SpanData> exported = serviceHandler.waitForExport(6); assertThat(exported) .containsExactly( @@ -167,11 +164,11 @@ public class SpanExporterImplTest { spanExporter.registerHandler("test.service", serviceHandler); spanExporter.registerHandler("mock.service", mockServiceHandler); - SpanImpl span1 = createSampledEndedSpan(startEndHandler, SPAN_NAME_1); + RecordEventsSpanImpl span1 = createSampledEndedSpan(startEndHandler, SPAN_NAME_1); List<SpanData> exported = serviceHandler.waitForExport(1); assertThat(exported).containsExactly(span1.toSpanData()); // Continue to export after the exception was received. - SpanImpl span2 = createSampledEndedSpan(startEndHandler, SPAN_NAME_1); + RecordEventsSpanImpl span2 = createSampledEndedSpan(startEndHandler, SPAN_NAME_1); exported = serviceHandler.waitForExport(1); assertThat(exported).containsExactly(span2.toSpanData()); } @@ -186,8 +183,8 @@ public class SpanExporterImplTest { TestHandler serviceHandler2 = new TestHandler(); spanExporter.registerHandler("test.service2", serviceHandler2); - SpanImpl span1 = createSampledEndedSpan(startEndHandler, SPAN_NAME_1); - SpanImpl span2 = createSampledEndedSpan(startEndHandler, SPAN_NAME_2); + RecordEventsSpanImpl span1 = createSampledEndedSpan(startEndHandler, SPAN_NAME_1); + RecordEventsSpanImpl span2 = createSampledEndedSpan(startEndHandler, SPAN_NAME_2); List<SpanData> exported1 = serviceHandler.waitForExport(2); List<SpanData> exported2 = serviceHandler2.waitForExport(2); assertThat(exported1).containsExactly(span1.toSpanData(), span2.toSpanData()); @@ -202,8 +199,8 @@ public class SpanExporterImplTest { spanExporter.registerHandler("test.service", serviceHandler); - SpanImpl span1 = createNotSampledEndedSpan(startEndHandler, SPAN_NAME_1); - SpanImpl span2 = createSampledEndedSpan(startEndHandler, SPAN_NAME_2); + RecordEventsSpanImpl span1 = createNotSampledEndedSpan(startEndHandler, SPAN_NAME_1); + RecordEventsSpanImpl span2 = createSampledEndedSpan(startEndHandler, SPAN_NAME_2); // Spans are recorded and exported in the same order as they are ended, we test that a non // sampled span is not exported by creating and ending a sampled span after a non sampled span // and checking that the first exported span is the sampled span (the non sampled did not get @@ -224,7 +221,7 @@ public class SpanExporterImplTest { spanExporter.registerHandler("test.service", serviceHandler); - SpanImpl span2 = createSampledEndedSpan(startEndHandler, SPAN_NAME_2); + RecordEventsSpanImpl span2 = createSampledEndedSpan(startEndHandler, SPAN_NAME_2); // Force a flush, without this, the #waitForExport() call below would block indefinitely. spanExporter.flush(); |