diff options
author | Hailong Wen <youxiabsyw@gmail.com> | 2018-02-16 15:09:17 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-02-16 15:09:17 +0800 |
commit | 131b6f062a68d91b4d7a06d1edc25d8e856b6a21 (patch) | |
tree | 2481d17d4feb6f7c2828326c96f001e11a314b30 /api/src | |
parent | 490dfe8c1984ffbe0eb9118fba450eed90b414f9 (diff) | |
download | opencensus-java-131b6f062a68d91b4d7a06d1edc25d8e856b6a21.tar.gz |
Add MessageEvent and deprecate NetworkEvent. (closes #858) (#894)
Diffstat (limited to 'api/src')
16 files changed, 642 insertions, 24 deletions
diff --git a/api/src/main/java/io/opencensus/internal/BaseMessageEventUtil.java b/api/src/main/java/io/opencensus/internal/BaseMessageEventUtil.java new file mode 100644 index 00000000..56ec3301 --- /dev/null +++ b/api/src/main/java/io/opencensus/internal/BaseMessageEventUtil.java @@ -0,0 +1,80 @@ +/* + * 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.internal; + +import static com.google.common.base.Preconditions.checkNotNull; + +import io.opencensus.trace.MessageEvent; + +/** + * Helper class to convert/cast between for {@link MessageEvent} and {@link NetworkEvent}. + * + * @since 0.12 + */ +@SuppressWarnings("deprecation") +public final class BaseMessageEventUtil { + /** + * Cast or convert a {@link io.opencensus.trace.BaseMessageEvent} to {@link MessageEvent}. + * + * <p>Warning: if the input is a {@code io.opencensus.trace.NetworkEvent} and contains {@code + * kernelTimestamp} information, this information will be dropped. + * + * @param event the {@code BaseMessageEvent} that is being cast or converted. + * @return a {@code MessageEvent} representation of the input. + */ + public static MessageEvent asMessageEvent(io.opencensus.trace.BaseMessageEvent event) { + checkNotNull(event); + if (event instanceof MessageEvent) { + return (MessageEvent) event; + } + io.opencensus.trace.NetworkEvent networkEvent = (io.opencensus.trace.NetworkEvent) event; + MessageEvent.Type type = + (networkEvent.getType() == io.opencensus.trace.NetworkEvent.Type.RECV) + ? MessageEvent.Type.RECEIVED + : MessageEvent.Type.SENT; + return MessageEvent.builder(type, networkEvent.getMessageId()) + .setUncompressedMessageSize(networkEvent.getUncompressedMessageSize()) + .setCompressedMessageSize(networkEvent.getCompressedMessageSize()) + .build(); + } + + /** + * Cast or convert a {@link io.opencensus.trace.BaseMessageEvent} to {@link + * io.opencensus.trace.NetworkEvent}. + * + * @param event the {@code BaseMessageEvent} that is being cast or converted. + * @return a {@code io.opencensus.trace.NetworkEvent} representation of the input. + */ + public static io.opencensus.trace.NetworkEvent asNetworkEvent( + io.opencensus.trace.BaseMessageEvent event) { + checkNotNull(event); + if (event instanceof io.opencensus.trace.NetworkEvent) { + return (io.opencensus.trace.NetworkEvent) event; + } + MessageEvent messageEvent = (MessageEvent) event; + io.opencensus.trace.NetworkEvent.Type type = + (messageEvent.getType() == MessageEvent.Type.RECEIVED) + ? io.opencensus.trace.NetworkEvent.Type.RECV + : io.opencensus.trace.NetworkEvent.Type.SENT; + return io.opencensus.trace.NetworkEvent.builder(type, messageEvent.getMessageId()) + .setUncompressedMessageSize(messageEvent.getUncompressedMessageSize()) + .setCompressedMessageSize(messageEvent.getCompressedMessageSize()) + .build(); + } + + private BaseMessageEventUtil() {} +} diff --git a/api/src/main/java/io/opencensus/trace/BaseMessageEvent.java b/api/src/main/java/io/opencensus/trace/BaseMessageEvent.java new file mode 100644 index 00000000..5ad961f6 --- /dev/null +++ b/api/src/main/java/io/opencensus/trace/BaseMessageEvent.java @@ -0,0 +1,37 @@ +/* + * 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.trace; + +/** + * Superclass for {@link MessageEvent} and {@link NetworkEvent} to resolve API backward + * compatibility issue. + * + * <p>{@code SpanData.create} can't be overloaded with parameter types that differ only in the type + * of the TimedEvent, because the signatures are the same after generic type erasure. {@code + * BaseMessageEvent} allows the same method to accept both {@code TimedEvents<NetworkEvent>} and + * {@code TimedEvents<MessageEvent>}. + * + * <p>This class should only be extended by {@code NetworkEvent} and {@code MessageEvent}. + * + * @deprecated This class is for internal use only. + * @since 0.12 + */ +@Deprecated +public abstract class BaseMessageEvent { + // package protected to avoid users to extend it. + BaseMessageEvent() {} +} diff --git a/api/src/main/java/io/opencensus/trace/BlankSpan.java b/api/src/main/java/io/opencensus/trace/BlankSpan.java index 0f11a034..641bad7e 100644 --- a/api/src/main/java/io/opencensus/trace/BlankSpan.java +++ b/api/src/main/java/io/opencensus/trace/BlankSpan.java @@ -58,8 +58,13 @@ public final class BlankSpan extends Span { /** No-op implementation of the {@link Span#addNetworkEvent(NetworkEvent)} method. */ @Override + @Deprecated public void addNetworkEvent(NetworkEvent networkEvent) {} + /** No-op implementation of the {@link Span#addMessageEvent(MessageEvent)} method. */ + @Override + public void addMessageEvent(MessageEvent messageEvent) {} + /** No-op implementation of the {@link Span#addLink(Link)} method. */ @Override public void addLink(Link link) {} diff --git a/api/src/main/java/io/opencensus/trace/MessageEvent.java b/api/src/main/java/io/opencensus/trace/MessageEvent.java new file mode 100644 index 00000000..49a4673c --- /dev/null +++ b/api/src/main/java/io/opencensus/trace/MessageEvent.java @@ -0,0 +1,154 @@ +/* + * 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.trace; + +import static com.google.common.base.Preconditions.checkNotNull; + +import com.google.auto.value.AutoValue; +import javax.annotation.concurrent.Immutable; + +/** + * A class that represents a generic messaging event. This class can represent messaging happened in + * any layer, especially higher application layer. Thus, it can be used when recording events in + * pipeline works, in-process bidirectional streams and batch processing. + * + * <p>It requires a {@link Type type} and a message id that serves to uniquely identify each + * message. It can optionally have information about the message size. + * + * @since 0.12 + */ +@Immutable +@AutoValue +// Suppress Checker Framework warning about missing @Nullable in generated equals method. +@AutoValue.CopyAnnotations +@SuppressWarnings({"nullness", "deprecation"}) +public abstract class MessageEvent extends BaseMessageEvent { + /** + * Available types for a {@code MessageEvent}. + * + * @since 0.12 + */ + public enum Type { + /** + * When the message was sent. + * + * @since 0.12 + */ + SENT, + /** + * When the message was received. + * + * @since 0.12 + */ + RECEIVED, + } + + /** + * Returns a new {@link Builder} with default values. + * + * @param type designates whether this is a send or receive message. + * @param messageId serves to uniquely identify each message. + * @return a new {@code Builder} with default values. + * @throws NullPointerException if {@code type} is {@code null}. + * @since 0.12 + */ + public static Builder builder(Type type, long messageId) { + return new AutoValue_MessageEvent.Builder() + .setType(checkNotNull(type, "type")) + .setMessageId(messageId) + // We need to set a value for the message size because the autovalue requires all + // primitives to be initialized. + .setUncompressedMessageSize(0) + .setCompressedMessageSize(0); + } + + /** + * Returns the type of the {@code MessageEvent}. + * + * @return the type of the {@code MessageEvent}. + * @since 0.12 + */ + public abstract Type getType(); + + /** + * Returns the message id argument that serves to uniquely identify each message. + * + * @return the message id of the {@code MessageEvent}. + * @since 0.12 + */ + public abstract long getMessageId(); + + /** + * Returns the uncompressed size in bytes of the {@code MessageEvent}. + * + * @return the uncompressed size in bytes of the {@code MessageEvent}. + * @since 0.12 + */ + public abstract long getUncompressedMessageSize(); + + /** + * Returns the compressed size in bytes of the {@code MessageEvent}. + * + * @return the compressed size in bytes of the {@code MessageEvent}. + * @since 0.12 + */ + public abstract long getCompressedMessageSize(); + + /** + * Builder class for {@link MessageEvent}. + * + * @since 0.12 + */ + @AutoValue.Builder + public abstract static class Builder { + // Package protected methods because these values are mandatory and set only in the + // MessageEvent#builder() function. + abstract Builder setType(Type type); + + abstract Builder setMessageId(long messageId); + + /** + * Sets the uncompressed message size. + * + * @param uncompressedMessageSize represents the uncompressed size in bytes of this message. + * @return this. + * @since 0.12 + */ + public abstract Builder setUncompressedMessageSize(long uncompressedMessageSize); + + /** + * Sets the compressed message size. + * + * @param compressedMessageSize represents the compressed size in bytes of this message. + * @return this. + * @since 0.12 + */ + public abstract Builder setCompressedMessageSize(long compressedMessageSize); + + /** + * Builds and returns a {@code MessageEvent} with the desired values. + * + * @return a {@code MessageEvent} with the desired values. + * @since 0.12 + */ + public abstract MessageEvent build(); + + Builder() {} + } + + MessageEvent() {} +} diff --git a/api/src/main/java/io/opencensus/trace/NetworkEvent.java b/api/src/main/java/io/opencensus/trace/NetworkEvent.java index a8dfdb70..1c8fe393 100644 --- a/api/src/main/java/io/opencensus/trace/NetworkEvent.java +++ b/api/src/main/java/io/opencensus/trace/NetworkEvent.java @@ -28,6 +28,7 @@ import javax.annotation.concurrent.Immutable; * serves to uniquely identify each network message. It can optionally can have information about * the kernel time and message size. * + * @deprecated Use {@link MessageEvent}. * @since 0.5 */ @Immutable @@ -35,7 +36,8 @@ import javax.annotation.concurrent.Immutable; // Suppress Checker Framework warning about missing @Nullable in generated equals method. @AutoValue.CopyAnnotations @SuppressWarnings("nullness") -public abstract class NetworkEvent { +@Deprecated +public abstract class NetworkEvent extends io.opencensus.trace.BaseMessageEvent { /** * Available types for a {@code NetworkEvent}. * @@ -131,9 +133,12 @@ public abstract class NetworkEvent { /** * Builder class for {@link NetworkEvent}. * + * @deprecated {@link NetworkEvent} is deprecated. Please use {@link MessageEvent} and its builder + * {@link MessageEvent.Builder}. * @since 0.5 */ @AutoValue.Builder + @Deprecated public abstract static class Builder { // Package protected methods because these values are mandatory and set only in the // NetworkEvent#builder() function. diff --git a/api/src/main/java/io/opencensus/trace/Span.java b/api/src/main/java/io/opencensus/trace/Span.java index 29673930..ae0e9b4b 100644 --- a/api/src/main/java/io/opencensus/trace/Span.java +++ b/api/src/main/java/io/opencensus/trace/Span.java @@ -19,6 +19,7 @@ package io.opencensus.trace; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; +import io.opencensus.internal.BaseMessageEventUtil; import java.util.Collections; import java.util.EnumSet; import java.util.Map; @@ -159,9 +160,30 @@ public abstract class Span { * higher level applications. * * @param networkEvent the network event to add. + * @deprecated Use {@link #addMessageEvent}. * @since 0.5 */ - public abstract void addNetworkEvent(NetworkEvent networkEvent); + @Deprecated + public void addNetworkEvent(NetworkEvent networkEvent) { + addMessageEvent(BaseMessageEventUtil.asMessageEvent(networkEvent)); + } + + /** + * Adds a MessageEvent to the {@code Span}. + * + * <p>This function can be used by higher level applications to record messaging event. + * + * <p>This method should always be overridden by users whose API versions are larger or equal to + * {@code 0.12}. + * + * @param messageEvent the message to add. + * @since 0.12 + */ + public void addMessageEvent(MessageEvent messageEvent) { + // Default implementation by invoking addNetworkEvent() so that any existing derived classes, + // including implementation and the mocked ones, do not need to override this method explicitly. + addNetworkEvent(BaseMessageEventUtil.asNetworkEvent(messageEvent)); + } /** * Adds a {@link Link} to the {@code Span}. diff --git a/api/src/main/java/io/opencensus/trace/config/TraceParams.java b/api/src/main/java/io/opencensus/trace/config/TraceParams.java index 17dbbb9d..6c2ee7ff 100644 --- a/api/src/main/java/io/opencensus/trace/config/TraceParams.java +++ b/api/src/main/java/io/opencensus/trace/config/TraceParams.java @@ -21,7 +21,7 @@ import static com.google.common.base.Preconditions.checkArgument; import com.google.auto.value.AutoValue; import io.opencensus.trace.Annotation; import io.opencensus.trace.Link; -import io.opencensus.trace.NetworkEvent; +import io.opencensus.trace.MessageEvent; import io.opencensus.trace.Sampler; import io.opencensus.trace.Span; import io.opencensus.trace.samplers.Samplers; @@ -43,7 +43,7 @@ public abstract class TraceParams { private static final Sampler DEFAULT_SAMPLER = Samplers.probabilitySampler(DEFAULT_PROBABILITY); private static final int DEFAULT_SPAN_MAX_NUM_ATTRIBUTES = 32; private static final int DEFAULT_SPAN_MAX_NUM_ANNOTATIONS = 32; - private static final int DEFAULT_SPAN_MAX_NUM_NETWORK_EVENTS = 128; + private static final int DEFAULT_SPAN_MAX_NUM_MESSAGE_EVENTS = 128; private static final int DEFAULT_SPAN_MAX_NUM_LINKS = 128; /** @@ -56,7 +56,7 @@ public abstract class TraceParams { .setSampler(DEFAULT_SAMPLER) .setMaxNumberOfAttributes(DEFAULT_SPAN_MAX_NUM_ATTRIBUTES) .setMaxNumberOfAnnotations(DEFAULT_SPAN_MAX_NUM_ANNOTATIONS) - .setMaxNumberOfNetworkEvents(DEFAULT_SPAN_MAX_NUM_NETWORK_EVENTS) + .setMaxNumberOfMessageEvents(DEFAULT_SPAN_MAX_NUM_MESSAGE_EVENTS) .setMaxNumberOfLinks(DEFAULT_SPAN_MAX_NUM_LINKS) .build(); @@ -86,12 +86,25 @@ public abstract class TraceParams { public abstract int getMaxNumberOfAnnotations(); /** - * Returns the global default max number of {@link NetworkEvent} events per {@link Span}. + * Returns the global default max number of {@link MessageEvent} events per {@link Span}. + * + * @return the global default max number of {@code MessageEvent} events per {@code Span}. + * @since 0.12 + */ + public abstract int getMaxNumberOfMessageEvents(); + + /** + * Returns the global default max number of {@link io.opencensus.trace.NetworkEvent} events per + * {@link Span}. * * @return the global default max number of {@code NetworkEvent} events per {@code Span}. + * @deprecated Use {@link getMaxNumberOfMessageEvents}. * @since 0.5 */ - public abstract int getMaxNumberOfNetworkEvents(); + @Deprecated + public int getMaxNumberOfNetworkEvents() { + return getMaxNumberOfMessageEvents(); + } /** * Returns the global default max number of {@link Link} entries per {@link Span}. @@ -152,14 +165,30 @@ public abstract class TraceParams { public abstract Builder setMaxNumberOfAnnotations(int maxNumberOfAnnotations); /** - * Sets the global default max number of {@link NetworkEvent} events per {@link Span}. + * Sets the global default max number of {@link MessageEvent} events per {@link Span}. * - * @param maxNumberOfNetworkEvents the global default max number of {@link NetworkEvent} events + * @param maxNumberOfMessageEvents the global default max number of {@link MessageEvent} events * per {@link Span}. It must be positive otherwise {@link #build()} will throw an exception. + * @since 0.12 * @return this. + */ + public abstract Builder setMaxNumberOfMessageEvents(int maxNumberOfMessageEvents); + + /** + * Sets the global default max number of {@link io.opencensus.trace.NetworkEvent} events per + * {@link Span}. + * + * @param maxNumberOfNetworkEvents the global default max number of {@link + * io.opencensus.trace.NetworkEvent} events per {@link Span}. It must be positive otherwise + * {@link #build()} will throw an exception. + * @return this. + * @deprecated Use {@link setMaxNumberOfMessageEvents}. * @since 0.5 */ - public abstract Builder setMaxNumberOfNetworkEvents(int maxNumberOfNetworkEvents); + @Deprecated + public Builder setMaxNumberOfNetworkEvents(int maxNumberOfNetworkEvents) { + return setMaxNumberOfMessageEvents(maxNumberOfNetworkEvents); + } /** * Sets the global default max number of {@link Link} entries per {@link Span}. @@ -185,7 +214,7 @@ public abstract class TraceParams { TraceParams traceParams = autoBuild(); checkArgument(traceParams.getMaxNumberOfAttributes() > 0, "maxNumberOfAttributes"); checkArgument(traceParams.getMaxNumberOfAnnotations() > 0, "maxNumberOfAnnotations"); - checkArgument(traceParams.getMaxNumberOfNetworkEvents() > 0, "maxNumberOfNetworkEvents"); + checkArgument(traceParams.getMaxNumberOfMessageEvents() > 0, "maxNumberOfMessageEvents"); checkArgument(traceParams.getMaxNumberOfLinks() > 0, "maxNumberOfLinks"); return traceParams; } diff --git a/api/src/main/java/io/opencensus/trace/export/SpanData.java b/api/src/main/java/io/opencensus/trace/export/SpanData.java index 546b65b6..120c231a 100644 --- a/api/src/main/java/io/opencensus/trace/export/SpanData.java +++ b/api/src/main/java/io/opencensus/trace/export/SpanData.java @@ -19,11 +19,13 @@ package io.opencensus.trace.export; import static com.google.common.base.Preconditions.checkNotNull; import com.google.auto.value.AutoValue; +import com.google.common.collect.Lists; import io.opencensus.common.Timestamp; +import io.opencensus.internal.BaseMessageEventUtil; import io.opencensus.trace.Annotation; import io.opencensus.trace.AttributeValue; import io.opencensus.trace.Link; -import io.opencensus.trace.NetworkEvent; +import io.opencensus.trace.MessageEvent; import io.opencensus.trace.Span; import io.opencensus.trace.SpanContext; import io.opencensus.trace.SpanId; @@ -64,7 +66,8 @@ public abstract class SpanData { * @param startTimestamp the start {@code Timestamp} of the {@code Span}. * @param attributes the attributes associated with the {@code Span}. * @param annotations the annotations associated with the {@code Span}. - * @param networkEvents the network events associated with the {@code Span}. + * @param messageOrNetworkEvents the message events (or network events for backward compatibility) + * associated with the {@code Span}. * @param links the links associated with the {@code Span}. * @param childSpanCount the number of child spans that were generated while the span was active. * @param status the {@code Status} of the {@code Span}. {@code null} if the {@code Span} is still @@ -74,6 +77,7 @@ public abstract class SpanData { * @return a new immutable {@code SpanData}. * @since 0.5 */ + @SuppressWarnings("deprecation") public static SpanData create( SpanContext context, @Nullable SpanId parentSpanId, @@ -82,11 +86,31 @@ public abstract class SpanData { Timestamp startTimestamp, Attributes attributes, TimedEvents<Annotation> annotations, - TimedEvents<NetworkEvent> networkEvents, + TimedEvents<? extends io.opencensus.trace.BaseMessageEvent> messageOrNetworkEvents, Links links, @Nullable Integer childSpanCount, @Nullable Status status, @Nullable Timestamp endTimestamp) { + if (messageOrNetworkEvents == null) { + throw new NullPointerException("Null messageOrNetworkEvents"); + } + List<TimedEvent<MessageEvent>> messageEventsList = Lists.newArrayList(); + for (TimedEvent<? extends io.opencensus.trace.BaseMessageEvent> timedEvent : + messageOrNetworkEvents.getEvents()) { + io.opencensus.trace.BaseMessageEvent event = timedEvent.getEvent(); + if (event instanceof MessageEvent) { + @SuppressWarnings("unchecked") + TimedEvent<MessageEvent> timedMessageEvent = (TimedEvent<MessageEvent>) timedEvent; + messageEventsList.add(timedMessageEvent); + } else { + messageEventsList.add( + TimedEvent.<MessageEvent>create( + timedEvent.getTimestamp(), BaseMessageEventUtil.asMessageEvent(event))); + } + } + TimedEvents<MessageEvent> messageEvents = + TimedEvents.<MessageEvent>create( + messageEventsList, messageOrNetworkEvents.getDroppedEventsCount()); return new AutoValue_SpanData( context, parentSpanId, @@ -95,7 +119,7 @@ public abstract class SpanData { startTimestamp, attributes, annotations, - networkEvents, + messageEvents, links, childSpanCount, status, @@ -167,9 +191,31 @@ public abstract class SpanData { * Returns network events recorded for this {@code Span}. * * @return network events recorded for this {@code Span}. + * @deprecated Use {@link #getMessageEvents}. * @since 0.5 */ - public abstract TimedEvents<NetworkEvent> getNetworkEvents(); + @Deprecated + @SuppressWarnings({"deprecation"}) + public TimedEvents<io.opencensus.trace.NetworkEvent> getNetworkEvents() { + TimedEvents<MessageEvent> timedEvents = getMessageEvents(); + List<TimedEvent<io.opencensus.trace.NetworkEvent>> networkEventsList = Lists.newArrayList(); + for (TimedEvent<MessageEvent> timedEvent : timedEvents.getEvents()) { + networkEventsList.add( + TimedEvent.<io.opencensus.trace.NetworkEvent>create( + timedEvent.getTimestamp(), + BaseMessageEventUtil.asNetworkEvent(timedEvent.getEvent()))); + } + return TimedEvents.<io.opencensus.trace.NetworkEvent>create( + networkEventsList, timedEvents.getDroppedEventsCount()); + } + + /** + * Returns message events recorded for this {@code Span}. + * + * @return message events recorded for this {@code Span}. + * @since 0.12 + */ + public abstract TimedEvents<MessageEvent> getMessageEvents(); /** * Returns links recorded for this {@code Span}. diff --git a/api/src/test/java/io/opencensus/internal/BaseMessageEventUtilTest.java b/api/src/test/java/io/opencensus/internal/BaseMessageEventUtilTest.java new file mode 100644 index 00000000..8de1b1c9 --- /dev/null +++ b/api/src/test/java/io/opencensus/internal/BaseMessageEventUtilTest.java @@ -0,0 +1,71 @@ +/* + * 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.internal; + +import static com.google.common.truth.Truth.assertThat; + +import io.opencensus.trace.MessageEvent; +import io.opencensus.trace.NetworkEvent; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** Unit tests for {@link BaseMessageEventUtil}. */ +@RunWith(JUnit4.class) +public class BaseMessageEventUtilTest { + private static final long SENT_EVENT_ID = 12345L; + private static final long RECV_EVENT_ID = 67890L; + private static final long UNCOMPRESSED_SIZE = 100; + private static final long COMPRESSED_SIZE = 99; + + private static final MessageEvent SENT_MESSAGE_EVENT = + MessageEvent.builder(MessageEvent.Type.SENT, SENT_EVENT_ID) + .setUncompressedMessageSize(UNCOMPRESSED_SIZE) + .setCompressedMessageSize(COMPRESSED_SIZE) + .build(); + private static final MessageEvent RECV_MESSAGE_EVENT = + MessageEvent.builder(MessageEvent.Type.RECEIVED, RECV_EVENT_ID) + .setUncompressedMessageSize(UNCOMPRESSED_SIZE) + .setCompressedMessageSize(COMPRESSED_SIZE) + .build(); + private static final NetworkEvent SENT_NETWORK_EVENT = + NetworkEvent.builder(NetworkEvent.Type.SENT, SENT_EVENT_ID) + .setUncompressedMessageSize(UNCOMPRESSED_SIZE) + .setCompressedMessageSize(COMPRESSED_SIZE) + .build(); + private static final NetworkEvent RECV_NETWORK_EVENT = + NetworkEvent.builder(NetworkEvent.Type.RECV, RECV_EVENT_ID) + .setUncompressedMessageSize(UNCOMPRESSED_SIZE) + .setCompressedMessageSize(COMPRESSED_SIZE) + .build(); + + @Test + public void networkEventToMessageEvent() { + assertThat(BaseMessageEventUtil.asMessageEvent(SENT_NETWORK_EVENT)) + .isEqualTo(SENT_MESSAGE_EVENT); + assertThat(BaseMessageEventUtil.asMessageEvent(RECV_NETWORK_EVENT)) + .isEqualTo(RECV_MESSAGE_EVENT); + } + + @Test + public void messageEventToNetworkEvent() { + assertThat(BaseMessageEventUtil.asNetworkEvent(SENT_MESSAGE_EVENT)) + .isEqualTo(SENT_NETWORK_EVENT); + assertThat(BaseMessageEventUtil.asNetworkEvent(RECV_MESSAGE_EVENT)) + .isEqualTo(RECV_NETWORK_EVENT); + } +} diff --git a/api/src/test/java/io/opencensus/trace/BlankSpanTest.java b/api/src/test/java/io/opencensus/trace/BlankSpanTest.java index b9760c2f..185a5acd 100644 --- a/api/src/test/java/io/opencensus/trace/BlankSpanTest.java +++ b/api/src/test/java/io/opencensus/trace/BlankSpanTest.java @@ -53,6 +53,7 @@ public class BlankSpanTest { BlankSpan.INSTANCE.addAnnotation("MyAnnotation", multipleAttributes); BlankSpan.INSTANCE.addAnnotation(Annotation.fromDescription("MyAnnotation")); BlankSpan.INSTANCE.addNetworkEvent(NetworkEvent.builder(NetworkEvent.Type.SENT, 1L).build()); + BlankSpan.INSTANCE.addMessageEvent(MessageEvent.builder(MessageEvent.Type.SENT, 1L).build()); BlankSpan.INSTANCE.addLink( Link.fromSpanContext(SpanContext.INVALID, Link.Type.CHILD_LINKED_SPAN)); BlankSpan.INSTANCE.setStatus(Status.OK); diff --git a/api/src/test/java/io/opencensus/trace/MessageEventTest.java b/api/src/test/java/io/opencensus/trace/MessageEventTest.java new file mode 100644 index 00000000..fde32fe6 --- /dev/null +++ b/api/src/test/java/io/opencensus/trace/MessageEventTest.java @@ -0,0 +1,84 @@ +/* + * 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.trace; + +import static com.google.common.truth.Truth.assertThat; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** Unit tests for {@link MessageEvent}. */ +@RunWith(JUnit4.class) +public class MessageEventTest { + @Test(expected = NullPointerException.class) + public void buildMessageEvent_NullType() { + MessageEvent.builder(null, 1L).build(); + } + + @Test + public void buildMessageEvent_WithRequiredFields() { + MessageEvent messageEvent = MessageEvent.builder(MessageEvent.Type.SENT, 1L).build(); + assertThat(messageEvent.getType()).isEqualTo(MessageEvent.Type.SENT); + assertThat(messageEvent.getMessageId()).isEqualTo(1L); + assertThat(messageEvent.getUncompressedMessageSize()).isEqualTo(0L); + } + + @Test + public void buildMessageEvent_WithUncompressedMessageSize() { + MessageEvent messageEvent = + MessageEvent.builder(MessageEvent.Type.SENT, 1L).setUncompressedMessageSize(123L).build(); + assertThat(messageEvent.getType()).isEqualTo(MessageEvent.Type.SENT); + assertThat(messageEvent.getMessageId()).isEqualTo(1L); + assertThat(messageEvent.getUncompressedMessageSize()).isEqualTo(123L); + } + + @Test + public void buildMessageEvent_WithCompressedMessageSize() { + MessageEvent messageEvent = + MessageEvent.builder(MessageEvent.Type.SENT, 1L).setCompressedMessageSize(123L).build(); + assertThat(messageEvent.getType()).isEqualTo(MessageEvent.Type.SENT); + assertThat(messageEvent.getMessageId()).isEqualTo(1L); + assertThat(messageEvent.getCompressedMessageSize()).isEqualTo(123L); + } + + @Test + public void buildMessageEvent_WithAllValues() { + MessageEvent messageEvent = + MessageEvent.builder(MessageEvent.Type.RECEIVED, 1L) + .setUncompressedMessageSize(123L) + .setCompressedMessageSize(63L) + .build(); + assertThat(messageEvent.getType()).isEqualTo(MessageEvent.Type.RECEIVED); + assertThat(messageEvent.getMessageId()).isEqualTo(1L); + assertThat(messageEvent.getUncompressedMessageSize()).isEqualTo(123L); + assertThat(messageEvent.getCompressedMessageSize()).isEqualTo(63L); + } + + @Test + public void messageEvent_ToString() { + MessageEvent messageEvent = + MessageEvent.builder(MessageEvent.Type.SENT, 1L) + .setUncompressedMessageSize(123L) + .setCompressedMessageSize(63L) + .build(); + assertThat(messageEvent.toString()).contains("type=SENT"); + assertThat(messageEvent.toString()).contains("messageId=1"); + assertThat(messageEvent.toString()).contains("compressedMessageSize=63"); + assertThat(messageEvent.toString()).contains("uncompressedMessageSize=123"); + } +} diff --git a/api/src/test/java/io/opencensus/trace/NoopSpan.java b/api/src/test/java/io/opencensus/trace/NoopSpan.java index 0217529d..7c8d9b7a 100644 --- a/api/src/test/java/io/opencensus/trace/NoopSpan.java +++ b/api/src/test/java/io/opencensus/trace/NoopSpan.java @@ -45,6 +45,9 @@ public class NoopSpan extends Span { public void addNetworkEvent(NetworkEvent networkEvent) {} @Override + public void addMessageEvent(MessageEvent messageEvent) {} + + @Override public void addLink(Link link) {} @Override diff --git a/api/src/test/java/io/opencensus/trace/SpanTest.java b/api/src/test/java/io/opencensus/trace/SpanTest.java index 327b9abe..f7546ca4 100644 --- a/api/src/test/java/io/opencensus/trace/SpanTest.java +++ b/api/src/test/java/io/opencensus/trace/SpanTest.java @@ -98,4 +98,22 @@ public class SpanTest { span.end(); verify(span).end(same(EndSpanOptions.DEFAULT)); } + + @Test + public void addMessageEventDefaultImplementation() { + Span mockSpan = Mockito.mock(Span.class); + MessageEvent messageEvent = + MessageEvent.builder(MessageEvent.Type.SENT, 123) + .setUncompressedMessageSize(456) + .setCompressedMessageSize(789) + .build(); + NetworkEvent networkEvent = + NetworkEvent.builder(NetworkEvent.Type.SENT, 123) + .setUncompressedMessageSize(456) + .setCompressedMessageSize(789) + .build(); + Mockito.doCallRealMethod().when(mockSpan).addMessageEvent(messageEvent); + mockSpan.addMessageEvent(messageEvent); + verify(mockSpan).addNetworkEvent(eq(networkEvent)); + } } diff --git a/api/src/test/java/io/opencensus/trace/config/TraceConfigTest.java b/api/src/test/java/io/opencensus/trace/config/TraceConfigTest.java index ee80cab4..d48e0894 100644 --- a/api/src/test/java/io/opencensus/trace/config/TraceConfigTest.java +++ b/api/src/test/java/io/opencensus/trace/config/TraceConfigTest.java @@ -42,6 +42,7 @@ public class TraceConfigTest { .setMaxNumberOfAttributes(8) .setMaxNumberOfAnnotations(9) .setMaxNumberOfNetworkEvents(10) + .setMaxNumberOfMessageEvents(10) .setMaxNumberOfLinks(11) .build(); traceConfig.updateActiveTraceParams(traceParams); diff --git a/api/src/test/java/io/opencensus/trace/config/TraceParamsTest.java b/api/src/test/java/io/opencensus/trace/config/TraceParamsTest.java index 7ede0a29..6c216174 100644 --- a/api/src/test/java/io/opencensus/trace/config/TraceParamsTest.java +++ b/api/src/test/java/io/opencensus/trace/config/TraceParamsTest.java @@ -32,6 +32,7 @@ public class TraceParamsTest { assertThat(TraceParams.DEFAULT.getMaxNumberOfAttributes()).isEqualTo(32); assertThat(TraceParams.DEFAULT.getMaxNumberOfAnnotations()).isEqualTo(32); assertThat(TraceParams.DEFAULT.getMaxNumberOfNetworkEvents()).isEqualTo(128); + assertThat(TraceParams.DEFAULT.getMaxNumberOfMessageEvents()).isEqualTo(128); assertThat(TraceParams.DEFAULT.getMaxNumberOfLinks()).isEqualTo(128); } @@ -56,6 +57,11 @@ public class TraceParamsTest { } @Test(expected = IllegalArgumentException.class) + public void updateTraceParams_NonPositiveMaxNumberOfMessageEvents() { + TraceParams.DEFAULT.toBuilder().setMaxNumberOfMessageEvents(0).build(); + } + + @Test(expected = IllegalArgumentException.class) public void updateTraceParams_NonPositiveMaxNumberOfLinks() { TraceParams.DEFAULT.toBuilder().setMaxNumberOfLinks(0).build(); } @@ -68,13 +74,24 @@ public class TraceParamsTest { .setSampler(Samplers.alwaysSample()) .setMaxNumberOfAttributes(8) .setMaxNumberOfAnnotations(9) - .setMaxNumberOfNetworkEvents(10) + .setMaxNumberOfMessageEvents(10) .setMaxNumberOfLinks(11) .build(); assertThat(traceParams.getSampler()).isEqualTo(Samplers.alwaysSample()); assertThat(traceParams.getMaxNumberOfAttributes()).isEqualTo(8); assertThat(traceParams.getMaxNumberOfAnnotations()).isEqualTo(9); + // test maxNumberOfNetworkEvent can be set via maxNumberOfMessageEvent assertThat(traceParams.getMaxNumberOfNetworkEvents()).isEqualTo(10); + assertThat(traceParams.getMaxNumberOfMessageEvents()).isEqualTo(10); assertThat(traceParams.getMaxNumberOfLinks()).isEqualTo(11); } + + @Test + public void updateTraceParams_maxNumberOfNetworkEvents() { + TraceParams traceParams = + TraceParams.DEFAULT.toBuilder().setMaxNumberOfNetworkEvents(10).build(); + assertThat(traceParams.getMaxNumberOfNetworkEvents()).isEqualTo(10); + // test maxNumberOfMessageEvent can be set via maxNumberOfNetworkEvent + assertThat(traceParams.getMaxNumberOfMessageEvents()).isEqualTo(10); + } } diff --git a/api/src/test/java/io/opencensus/trace/export/SpanDataTest.java b/api/src/test/java/io/opencensus/trace/export/SpanDataTest.java index 5c8097fa..399b35e0 100644 --- a/api/src/test/java/io/opencensus/trace/export/SpanDataTest.java +++ b/api/src/test/java/io/opencensus/trace/export/SpanDataTest.java @@ -24,6 +24,7 @@ import io.opencensus.trace.Annotation; import io.opencensus.trace.AttributeValue; import io.opencensus.trace.Link; import io.opencensus.trace.Link.Type; +import io.opencensus.trace.MessageEvent; import io.opencensus.trace.NetworkEvent; import io.opencensus.trace.SpanContext; import io.opencensus.trace.SpanId; @@ -60,6 +61,10 @@ public class SpanDataTest { NetworkEvent.builder(NetworkEvent.Type.RECV, 1).build(); private static final NetworkEvent sentNetworkEvent = NetworkEvent.builder(NetworkEvent.Type.SENT, 1).build(); + private static final MessageEvent recvMessageEvent = + MessageEvent.builder(MessageEvent.Type.RECEIVED, 1).build(); + private static final MessageEvent sentMessageEvent = + MessageEvent.builder(MessageEvent.Type.SENT, 1).build(); private static final Status status = Status.DEADLINE_EXCEEDED.withDescription("TooSlow"); private static final int CHILD_SPAN_COUNT = 13; private final Random random = new Random(1234); @@ -72,11 +77,14 @@ public class SpanDataTest { new ArrayList<TimedEvent<Annotation>>(); private final List<TimedEvent<NetworkEvent>> networkEventsList = new ArrayList<SpanData.TimedEvent<NetworkEvent>>(); + private final List<TimedEvent<MessageEvent>> messageEventsList = + new ArrayList<SpanData.TimedEvent<MessageEvent>>(); private final List<Link> linksList = new ArrayList<Link>(); private Attributes attributes; private TimedEvents<Annotation> annotations; private TimedEvents<NetworkEvent> networkEvents; + private TimedEvents<MessageEvent> messageEvents; private Links links; @Before @@ -90,6 +98,9 @@ public class SpanDataTest { networkEventsList.add(SpanData.TimedEvent.create(eventTimestamp1, recvNetworkEvent)); networkEventsList.add(SpanData.TimedEvent.create(eventTimestamp2, sentNetworkEvent)); networkEvents = TimedEvents.create(networkEventsList, 3); + messageEventsList.add(SpanData.TimedEvent.create(eventTimestamp1, recvMessageEvent)); + messageEventsList.add(SpanData.TimedEvent.create(eventTimestamp2, sentMessageEvent)); + messageEvents = TimedEvents.create(messageEventsList, 3); linksList.add(Link.fromSpanContext(spanContext, Type.CHILD_LINKED_SPAN)); links = Links.create(linksList, 0); } @@ -105,6 +116,37 @@ public class SpanDataTest { startTimestamp, attributes, annotations, + messageEvents, + links, + CHILD_SPAN_COUNT, + status, + endTimestamp); + assertThat(spanData.getContext()).isEqualTo(spanContext); + assertThat(spanData.getParentSpanId()).isEqualTo(parentSpanId); + assertThat(spanData.getHasRemoteParent()).isTrue(); + assertThat(spanData.getName()).isEqualTo(SPAN_NAME); + assertThat(spanData.getStartTimestamp()).isEqualTo(startTimestamp); + assertThat(spanData.getAttributes()).isEqualTo(attributes); + assertThat(spanData.getAnnotations()).isEqualTo(annotations); + assertThat(spanData.getNetworkEvents()).isEqualTo(networkEvents); + assertThat(spanData.getMessageEvents()).isEqualTo(messageEvents); + assertThat(spanData.getLinks()).isEqualTo(links); + assertThat(spanData.getChildSpanCount()).isEqualTo(CHILD_SPAN_COUNT); + assertThat(spanData.getStatus()).isEqualTo(status); + assertThat(spanData.getEndTimestamp()).isEqualTo(endTimestamp); + } + + @Test + public void spanData_Create_Compatibility() { + SpanData spanData = + SpanData.create( + spanContext, + parentSpanId, + true, + SPAN_NAME, + startTimestamp, + attributes, + annotations, networkEvents, links, CHILD_SPAN_COUNT, @@ -118,6 +160,7 @@ public class SpanDataTest { assertThat(spanData.getAttributes()).isEqualTo(attributes); assertThat(spanData.getAnnotations()).isEqualTo(annotations); assertThat(spanData.getNetworkEvents()).isEqualTo(networkEvents); + assertThat(spanData.getMessageEvents()).isEqualTo(messageEvents); assertThat(spanData.getLinks()).isEqualTo(links); assertThat(spanData.getChildSpanCount()).isEqualTo(CHILD_SPAN_COUNT); assertThat(spanData.getStatus()).isEqualTo(status); @@ -135,7 +178,7 @@ public class SpanDataTest { startTimestamp, attributes, annotations, - networkEvents, + messageEvents, links, null, null, @@ -148,6 +191,7 @@ public class SpanDataTest { assertThat(spanData.getAttributes()).isEqualTo(attributes); assertThat(spanData.getAnnotations()).isEqualTo(annotations); assertThat(spanData.getNetworkEvents()).isEqualTo(networkEvents); + assertThat(spanData.getMessageEvents()).isEqualTo(messageEvents); assertThat(spanData.getLinks()).isEqualTo(links); assertThat(spanData.getChildSpanCount()).isNull(); assertThat(spanData.getStatus()).isNull(); @@ -165,7 +209,7 @@ public class SpanDataTest { startTimestamp, Attributes.create(Collections.<String, AttributeValue>emptyMap(), 0), TimedEvents.create(Collections.<SpanData.TimedEvent<Annotation>>emptyList(), 0), - TimedEvents.create(Collections.<SpanData.TimedEvent<NetworkEvent>>emptyList(), 0), + TimedEvents.create(Collections.<SpanData.TimedEvent<MessageEvent>>emptyList(), 0), Links.create(Collections.<Link>emptyList(), 0), 0, status, @@ -178,6 +222,7 @@ public class SpanDataTest { assertThat(spanData.getAttributes().getAttributeMap().isEmpty()).isTrue(); assertThat(spanData.getAnnotations().getEvents().isEmpty()).isTrue(); assertThat(spanData.getNetworkEvents().getEvents().isEmpty()).isTrue(); + assertThat(spanData.getMessageEvents().getEvents().isEmpty()).isTrue(); assertThat(spanData.getLinks().getLinks().isEmpty()).isTrue(); assertThat(spanData.getChildSpanCount()).isEqualTo(0); assertThat(spanData.getStatus()).isEqualTo(status); @@ -195,7 +240,7 @@ public class SpanDataTest { startTimestamp, attributes, annotations, - networkEvents, + messageEvents, links, CHILD_SPAN_COUNT, status, @@ -209,7 +254,7 @@ public class SpanDataTest { startTimestamp, attributes, annotations, - networkEvents, + messageEvents, links, CHILD_SPAN_COUNT, status, @@ -223,7 +268,7 @@ public class SpanDataTest { startTimestamp, Attributes.create(Collections.<String, AttributeValue>emptyMap(), 0), TimedEvents.create(Collections.<SpanData.TimedEvent<Annotation>>emptyList(), 0), - TimedEvents.create(Collections.<SpanData.TimedEvent<NetworkEvent>>emptyList(), 0), + TimedEvents.create(Collections.<SpanData.TimedEvent<MessageEvent>>emptyList(), 0), Links.create(Collections.<Link>emptyList(), 0), 0, status, @@ -245,7 +290,7 @@ public class SpanDataTest { startTimestamp, attributes, annotations, - networkEvents, + messageEvents, links, CHILD_SPAN_COUNT, status, @@ -257,7 +302,7 @@ public class SpanDataTest { assertThat(spanDataString).contains(startTimestamp.toString()); assertThat(spanDataString).contains(attributes.toString()); assertThat(spanDataString).contains(annotations.toString()); - assertThat(spanDataString).contains(networkEvents.toString()); + assertThat(spanDataString).contains(messageEvents.toString()); assertThat(spanDataString).contains(links.toString()); assertThat(spanDataString).contains(status.toString()); assertThat(spanDataString).contains(endTimestamp.toString()); |