aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBogdan Drutu <bdrutu@google.com>2017-05-02 15:30:38 -0700
committerGitHub <noreply@github.com>2017-05-02 15:30:38 -0700
commit3cc56451e22f6d7db3fe98a3b3532f49d59c812a (patch)
treeefd14baf918a744403ca1aa02da2c92de82c16e3
parent62ccd0bce9c88957461eb0a44a6c14bea45f0bf9 (diff)
parent0c94ad5295e140477c2f6a82ebb96ee19ec637c4 (diff)
downloadplatform_external_opencensus-java-3cc56451e22f6d7db3fe98a3b3532f49d59c812a.tar.gz
platform_external_opencensus-java-3cc56451e22f6d7db3fe98a3b3532f49d59c812a.tar.bz2
platform_external_opencensus-java-3cc56451e22f6d7db3fe98a3b3532f49d59c812a.zip
Merge pull request #271 from bogdandrutu/traceexport
Add a TraceExporter class that allows exporting Span data to different trace services.
-rw-r--r--core/src/main/java/com/google/instrumentation/trace/SpanData.java (renamed from core_impl/src/main/java/com/google/instrumentation/trace/SpanData.java)17
-rw-r--r--core/src/main/java/com/google/instrumentation/trace/TraceComponent.java13
-rw-r--r--core/src/main/java/com/google/instrumentation/trace/TraceExporter.java92
-rw-r--r--core/src/main/java/com/google/instrumentation/trace/Tracing.java9
-rw-r--r--core/src/test/java/com/google/instrumentation/trace/SpanDataTest.java (renamed from core_impl/src/test/java/com/google/instrumentation/trace/SpanDataTest.java)0
-rw-r--r--core/src/test/java/com/google/instrumentation/trace/TraceComponentTest.java6
-rw-r--r--core/src/test/java/com/google/instrumentation/trace/TracingTest.java5
-rw-r--r--core_impl/src/main/java/com/google/instrumentation/trace/TraceComponentImplBase.java6
-rw-r--r--core_impl_android/src/test/java/com/google/instrumentation/trace/TraceComponentImplTest.java8
-rw-r--r--core_impl_java_7/src/test/java/com/google/instrumentation/trace/TraceComponentImplTest.java8
-rw-r--r--core_impl_java_8/src/test/java/com/google/instrumentation/trace/TraceComponentImplTest.java8
11 files changed, 168 insertions, 4 deletions
diff --git a/core_impl/src/main/java/com/google/instrumentation/trace/SpanData.java b/core/src/main/java/com/google/instrumentation/trace/SpanData.java
index ce1a7a84..579b0373 100644
--- a/core_impl/src/main/java/com/google/instrumentation/trace/SpanData.java
+++ b/core/src/main/java/com/google/instrumentation/trace/SpanData.java
@@ -147,7 +147,11 @@ public abstract class SpanData {
SpanData() {}
- /** A timed event representation. It can be a timed {@link Annotation} or {@link NetworkEvent}. */
+ /**
+ * A timed event representation.
+ *
+ * @param <T> the type of value that is timed.
+ */
@Immutable
@AutoValue
public abstract static class TimedEvent<T> {
@@ -180,6 +184,11 @@ public abstract class SpanData {
TimedEvent() {}
}
+ /**
+ * A list of timed events and the number of dropped events representation.
+ *
+ * @param <T> the type of value that is timed.
+ */
@Immutable
@AutoValue
public abstract static class TimedEvents<T> {
@@ -215,6 +224,9 @@ public abstract class SpanData {
TimedEvents() {}
}
+ /**
+ * A set of attributes and the number of dropped attributes representation.
+ */
@Immutable
@AutoValue
public abstract static class Attributes {
@@ -252,6 +264,9 @@ public abstract class SpanData {
Attributes() {}
}
+ /**
+ * A list of links and the number of dropped links representation.
+ */
@Immutable
@AutoValue
public abstract static class Links {
diff --git a/core/src/main/java/com/google/instrumentation/trace/TraceComponent.java b/core/src/main/java/com/google/instrumentation/trace/TraceComponent.java
index b00b6cf6..2d7de903 100644
--- a/core/src/main/java/com/google/instrumentation/trace/TraceComponent.java
+++ b/core/src/main/java/com/google/instrumentation/trace/TraceComponent.java
@@ -48,6 +48,14 @@ public abstract class TraceComponent {
*/
public abstract Clock getClock();
+ /**
+ * Returns the {@link TraceExporter} with the provided implementation. If no implementation is
+ * provided then no-op implementations will be used.
+ *
+ * @return the {@link TraceExporter} implementation.
+ */
+ public abstract TraceExporter getTraceExporter();
+
// Disallow external overrides until we define the final API.
TraceComponent() {}
@@ -76,6 +84,11 @@ public abstract class TraceComponent {
return ZeroTimeClock.getInstance();
}
+ @Override
+ public TraceExporter getTraceExporter() {
+ return TraceExporter.getNoopTraceExporter();
+ }
+
private NoopTraceComponent() {}
}
}
diff --git a/core/src/main/java/com/google/instrumentation/trace/TraceExporter.java b/core/src/main/java/com/google/instrumentation/trace/TraceExporter.java
new file mode 100644
index 00000000..d9aa074f
--- /dev/null
+++ b/core/src/main/java/com/google/instrumentation/trace/TraceExporter.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2017, Google Inc.
+ * 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 com.google.instrumentation.trace;
+
+import javax.annotation.Nullable;
+import javax.annotation.concurrent.ThreadSafe;
+
+/**
+ * The main exporting API for the trace library.
+ *
+ * <p>Implementation MUST ensure that all functions are thread safe.
+ */
+@ThreadSafe
+public abstract class TraceExporter {
+ private static final NoopTraceExporter noopTraceExporter = new NoopTraceExporter();
+
+ /**
+ * Registers a new service handler that is used by the library to export trace data.
+ *
+ * <p>Example of usage:
+ *
+ * <pre>{@code
+ * public static void main(String[] args) {
+ * Tracing.getTraceExporter().registerServiceHandler(
+ * "com.google.stackdriver", new StackdriverServiceHandler());
+ * // ...
+ * }
+ * }</pre>
+ *
+ * @param name the name of the service handler. Must be unique for each service.
+ * @param serviceHandler the service handler that is called for each ended sampled span.
+ */
+ public abstract void registerServiceHandler(String name, ServiceHandler serviceHandler);
+
+ /**
+ * Unregisters the service handler with the provided name.
+ *
+ * @param name the name of the service handler that will be unregistered.
+ */
+ public abstract void unregisterServiceHandler(String name);
+
+ /**
+ * An abstract class that allows different tracing services to export recorded data for sampled
+ * spans in their own format.
+ *
+ * <p>To export data this MUST be register to to the TraceExporter using {@link
+ * #registerServiceHandler(String, ServiceHandler)}.
+ */
+ public abstract static class ServiceHandler {
+
+ /**
+ * It is called every time after a sampled (see {@link TraceOptions#isSampled()}) {@link Span}
+ * is ended.
+ *
+ * <p>This may be called from a different thread than the one that called {@link Span#end()}.
+ *
+ * <p>Implementation SHOULD not block the calling thread. It should execute the export on a
+ * different thread if possible.
+ *
+ * @param spanData the immutable representation of all data collected by the {@code Span}.
+ */
+ public abstract void export(SpanData spanData);
+ }
+
+ /**
+ * Returns the no-op implementation of the {@code TraceExporter}.
+ *
+ * @return the no-op implementation of the {@code TraceExporter}.
+ */
+ static TraceExporter getNoopTraceExporter() {
+ return noopTraceExporter;
+ }
+
+ private static final class NoopTraceExporter extends TraceExporter {
+ @Override
+ public void registerServiceHandler(String name, @Nullable ServiceHandler serviceHandler) {}
+
+ @Override
+ public void unregisterServiceHandler(String name) {}
+ }
+}
diff --git a/core/src/main/java/com/google/instrumentation/trace/Tracing.java b/core/src/main/java/com/google/instrumentation/trace/Tracing.java
index f5b0d7fc..aa11824f 100644
--- a/core/src/main/java/com/google/instrumentation/trace/Tracing.java
+++ b/core/src/main/java/com/google/instrumentation/trace/Tracing.java
@@ -52,6 +52,15 @@ public final class Tracing {
return traceComponent.getClock();
}
+ /**
+ * Returns the global {@link TraceExporter}.
+ *
+ * @return the global {@code TraceExporter}.
+ */
+ public static TraceExporter getTraceExporter() {
+ return traceComponent.getTraceExporter();
+ }
+
// Any provider that may be used for TraceComponent can be added here.
@VisibleForTesting
static TraceComponent loadTraceComponent(ClassLoader classLoader) {
diff --git a/core_impl/src/test/java/com/google/instrumentation/trace/SpanDataTest.java b/core/src/test/java/com/google/instrumentation/trace/SpanDataTest.java
index 9b2e6d7a..9b2e6d7a 100644
--- a/core_impl/src/test/java/com/google/instrumentation/trace/SpanDataTest.java
+++ b/core/src/test/java/com/google/instrumentation/trace/SpanDataTest.java
diff --git a/core/src/test/java/com/google/instrumentation/trace/TraceComponentTest.java b/core/src/test/java/com/google/instrumentation/trace/TraceComponentTest.java
index d7510d4b..9cae9211 100644
--- a/core/src/test/java/com/google/instrumentation/trace/TraceComponentTest.java
+++ b/core/src/test/java/com/google/instrumentation/trace/TraceComponentTest.java
@@ -38,4 +38,10 @@ public class TraceComponentTest {
public void defaultClock() {
assertThat(TraceComponent.getNoopTraceComponent().getClock()).isInstanceOf(ZeroTimeClock.class);
}
+
+ @Test
+ public void defaultTraceExporter() {
+ assertThat(TraceComponent.getNoopTraceComponent().getTraceExporter())
+ .isSameAs(TraceExporter.getNoopTraceExporter());
+ }
}
diff --git a/core/src/test/java/com/google/instrumentation/trace/TracingTest.java b/core/src/test/java/com/google/instrumentation/trace/TracingTest.java
index 83f881d4..24006ecf 100644
--- a/core/src/test/java/com/google/instrumentation/trace/TracingTest.java
+++ b/core/src/test/java/com/google/instrumentation/trace/TracingTest.java
@@ -65,4 +65,9 @@ public class TracingTest {
assertThat(Tracing.getBinaryPropagationHandler())
.isSameAs(BinaryPropagationHandler.getNoopBinaryPropagationHandler());
}
+
+ @Test
+ public void defaultTraceExporter() {
+ assertThat(Tracing.getTraceExporter()).isSameAs(TraceExporter.getNoopTraceExporter());
+ }
}
diff --git a/core_impl/src/main/java/com/google/instrumentation/trace/TraceComponentImplBase.java b/core_impl/src/main/java/com/google/instrumentation/trace/TraceComponentImplBase.java
index 6f72d417..ae326652 100644
--- a/core_impl/src/main/java/com/google/instrumentation/trace/TraceComponentImplBase.java
+++ b/core_impl/src/main/java/com/google/instrumentation/trace/TraceComponentImplBase.java
@@ -21,6 +21,7 @@ public class TraceComponentImplBase extends TraceComponent {
private static final BinaryPropagationHandler binaryPropagationHandler =
BinaryPropagationHandlerImpl.INSTANCE;
private final Clock clock;
+ private final TraceExporter traceExporter = TraceExporter.getNoopTraceExporter();
TraceComponentImplBase(Clock clock) {
this.clock = clock;
@@ -40,4 +41,9 @@ public class TraceComponentImplBase extends TraceComponent {
public final Clock getClock() {
return clock;
}
+
+ @Override
+ public TraceExporter getTraceExporter() {
+ return traceExporter;
+ }
}
diff --git a/core_impl_android/src/test/java/com/google/instrumentation/trace/TraceComponentImplTest.java b/core_impl_android/src/test/java/com/google/instrumentation/trace/TraceComponentImplTest.java
index 814d10a0..26f7c8b1 100644
--- a/core_impl_android/src/test/java/com/google/instrumentation/trace/TraceComponentImplTest.java
+++ b/core_impl_android/src/test/java/com/google/instrumentation/trace/TraceComponentImplTest.java
@@ -32,11 +32,17 @@ public class TraceComponentImplTest {
@Test
public void implementationOfBinaryPropagationHandler() {
assertThat(Tracing.getBinaryPropagationHandler())
- .isSameAs(BinaryPropagationHandlerImpl.INSTANCE);
+ .isInstanceOf(BinaryPropagationHandlerImpl.class);
}
@Test
public void implementationOfClock() {
assertThat(Tracing.getClock()).isInstanceOf(MillisClock.class);
}
+
+ @Test
+ public void implementationOfTraceExporter() {
+ // TODO(bdrutu): Change this when TraceExporterImpl is available.
+ assertThat(Tracing.getTraceExporter()).isSameAs(TraceExporter.getNoopTraceExporter());
+ }
}
diff --git a/core_impl_java_7/src/test/java/com/google/instrumentation/trace/TraceComponentImplTest.java b/core_impl_java_7/src/test/java/com/google/instrumentation/trace/TraceComponentImplTest.java
index 814d10a0..26f7c8b1 100644
--- a/core_impl_java_7/src/test/java/com/google/instrumentation/trace/TraceComponentImplTest.java
+++ b/core_impl_java_7/src/test/java/com/google/instrumentation/trace/TraceComponentImplTest.java
@@ -32,11 +32,17 @@ public class TraceComponentImplTest {
@Test
public void implementationOfBinaryPropagationHandler() {
assertThat(Tracing.getBinaryPropagationHandler())
- .isSameAs(BinaryPropagationHandlerImpl.INSTANCE);
+ .isInstanceOf(BinaryPropagationHandlerImpl.class);
}
@Test
public void implementationOfClock() {
assertThat(Tracing.getClock()).isInstanceOf(MillisClock.class);
}
+
+ @Test
+ public void implementationOfTraceExporter() {
+ // TODO(bdrutu): Change this when TraceExporterImpl is available.
+ assertThat(Tracing.getTraceExporter()).isSameAs(TraceExporter.getNoopTraceExporter());
+ }
}
diff --git a/core_impl_java_8/src/test/java/com/google/instrumentation/trace/TraceComponentImplTest.java b/core_impl_java_8/src/test/java/com/google/instrumentation/trace/TraceComponentImplTest.java
index 0e426e1a..7a20e31a 100644
--- a/core_impl_java_8/src/test/java/com/google/instrumentation/trace/TraceComponentImplTest.java
+++ b/core_impl_java_8/src/test/java/com/google/instrumentation/trace/TraceComponentImplTest.java
@@ -32,11 +32,17 @@ public class TraceComponentImplTest {
@Test
public void implementationOfBinaryPropagationHandler() {
assertThat(Tracing.getBinaryPropagationHandler())
- .isSameAs(BinaryPropagationHandlerImpl.INSTANCE);
+ .isInstanceOf(BinaryPropagationHandlerImpl.class);
}
@Test
public void implementationOfClock() {
assertThat(Tracing.getClock()).isInstanceOf(InstantClock.class);
}
+
+ @Test
+ public void implementationOfTraceExporter() {
+ // TODO(bdrutu): Change this when TraceExporterImpl is available.
+ assertThat(Tracing.getTraceExporter()).isSameAs(TraceExporter.getNoopTraceExporter());
+ }
}