diff --git a/google-cloud-firestore/clirr-ignored-differences.xml b/google-cloud-firestore/clirr-ignored-differences.xml
index 53cf47102..a1064b15c 100644
--- a/google-cloud-firestore/clirr-ignored-differences.xml
+++ b/google-cloud-firestore/clirr-ignored-differences.xml
@@ -314,6 +314,18 @@
com.google.cloud.firestore.Query getQuery()
+
+
+ 7002
+ com/google/cloud/firestore/FirestoreOpenTelemetryOptions
+ boolean isTracingEnabled()
+
+
+ 7002
+ com/google/cloud/firestore/FirestoreOpenTelemetryOptions$Builder
+ com.google.cloud.firestore.FirestoreOpenTelemetryOptions$Builder setTracingEnabled(boolean)
+
+
com/google/cloud/firestore/StreamableQuery
7009
diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/AggregateQuery.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/AggregateQuery.java
index c055b559e..89702e423 100644
--- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/AggregateQuery.java
+++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/AggregateQuery.java
@@ -384,14 +384,15 @@ public void onError(Throwable throwable) {
.currentSpan()
.addEvent(
METHOD_NAME_RUN_AGGREGATION_QUERY + ": Retryable Error",
- Collections.singletonMap("error.message", throwable.getMessage()));
+ Collections.singletonMap("error.message", throwable.toString()));
+
runQuery(responseDeliverer, attempt + 1);
} else {
getTraceUtil()
.currentSpan()
.addEvent(
METHOD_NAME_RUN_AGGREGATION_QUERY + ": Error",
- Collections.singletonMap("error.message", throwable.getMessage()));
+ Collections.singletonMap("error.message", throwable.toString()));
responseDeliverer.deliverError(throwable);
}
}
diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/FirestoreOpenTelemetryOptions.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/FirestoreOpenTelemetryOptions.java
index a88fa0b4e..6fe0c4375 100644
--- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/FirestoreOpenTelemetryOptions.java
+++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/FirestoreOpenTelemetryOptions.java
@@ -27,28 +27,15 @@
*/
@BetaApi
public class FirestoreOpenTelemetryOptions {
- private final boolean tracingEnabled;
private final boolean exportBuiltinMetricsToGoogleCloudMonitoring;
private final @Nullable OpenTelemetry openTelemetry;
FirestoreOpenTelemetryOptions(Builder builder) {
- this.tracingEnabled = builder.tracingEnabled;
this.exportBuiltinMetricsToGoogleCloudMonitoring =
builder.exportBuiltinMetricsToGoogleCloudMonitoring;
this.openTelemetry = builder.openTelemetry;
}
- /**
- * @deprecated This method will be removed in the next minor version update. Please use a no-op
- * TracerProvider or set the environment variable `FIRESTORE_ENABLE_TRACING=OFF` to disable
- * tracing. If the GlobalOpenTelemetry or the OpenTelemetry instance passed to Firestore
- * contain a valid TracerProvider, the Firestore client will generate spans by utilizing it.
- */
- @Deprecated
- public boolean isTracingEnabled() {
- return tracingEnabled;
- }
-
public boolean exportBuiltinMetricsToGoogleCloudMonitoring() {
return exportBuiltinMetricsToGoogleCloudMonitoring;
}
@@ -68,20 +55,16 @@ public static FirestoreOpenTelemetryOptions.Builder newBuilder() {
}
public static class Builder {
-
- private boolean tracingEnabled;
private boolean exportBuiltinMetricsToGoogleCloudMonitoring;
@Nullable private OpenTelemetry openTelemetry;
private Builder() {
- tracingEnabled = false;
// TODO(metrics): default this to true when feature is ready
exportBuiltinMetricsToGoogleCloudMonitoring = false;
openTelemetry = null;
}
private Builder(FirestoreOpenTelemetryOptions options) {
- this.tracingEnabled = options.tracingEnabled;
this.exportBuiltinMetricsToGoogleCloudMonitoring =
options.exportBuiltinMetricsToGoogleCloudMonitoring;
this.openTelemetry = options.openTelemetry;
@@ -92,23 +75,6 @@ public FirestoreOpenTelemetryOptions build() {
return new FirestoreOpenTelemetryOptions(this);
}
- /**
- * Sets whether tracing should be enabled.
- *
- * @param tracingEnabled Whether tracing should be enabled.
- * @deprecated This method will be removed in the next minor version update. Please use a no-op
- * TracerProvider or set the environment variable `FIRESTORE_ENABLE_TRACING=OFF` to disable
- * tracing. If the GlobalOpenTelemetry or the OpenTelemetry instance passed to Firestore
- * contains a valid TracerProvider, the Firestore client will generate spans by utilizing
- * it.
- */
- @Deprecated
- @Nonnull
- public FirestoreOpenTelemetryOptions.Builder setTracingEnabled(boolean tracingEnabled) {
- this.tracingEnabled = tracingEnabled;
- return this;
- }
-
// TODO(metrics): make this public when feature is ready.
/**
* Sets whether built-in metrics should be exported to Google Cloud Monitoring
diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/StreamableQuery.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/StreamableQuery.java
index 7564de726..a959f9a15 100644
--- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/StreamableQuery.java
+++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/StreamableQuery.java
@@ -378,7 +378,7 @@ public void onError(Throwable throwable) {
if (isRetryableWithCursor() && shouldRetry(cursor, throwable)) {
currentSpan.addEvent(
TelemetryConstants.METHOD_NAME_RUN_QUERY + ": Retryable Error",
- Collections.singletonMap("error.message", throwable.getMessage()));
+ Collections.singletonMap("error.message", throwable.toString()));
startAfter(cursor)
.internalStream(
@@ -391,7 +391,7 @@ public void onError(Throwable throwable) {
} else {
currentSpan.addEvent(
TelemetryConstants.METHOD_NAME_RUN_QUERY + ": Error",
- Collections.singletonMap("error.message", throwable.getMessage()));
+ Collections.singletonMap("error.message", throwable.toString()));
streamResponseObserver.onError(throwable);
}
}
diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/telemetry/DisabledTraceUtil.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/telemetry/DisabledTraceUtil.java
index 5115ac7b7..16428b8cf 100644
--- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/telemetry/DisabledTraceUtil.java
+++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/telemetry/DisabledTraceUtil.java
@@ -18,6 +18,7 @@
import com.google.api.core.ApiFunction;
import com.google.api.core.ApiFuture;
+import com.google.api.core.InternalApi;
import io.grpc.ManagedChannelBuilder;
import java.util.Map;
import javax.annotation.Nonnull;
@@ -27,6 +28,7 @@
* A no-op implementation of {@link MetricsUtil} that does not collect or export any metrics and has
* near-zero overhead.
*/
+@InternalApi
public class DisabledTraceUtil implements TraceUtil {
static class Span implements TraceUtil.Span {
diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/telemetry/EnabledTraceUtil.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/telemetry/EnabledTraceUtil.java
index 52bb7c5e0..b0eeeca21 100644
--- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/telemetry/EnabledTraceUtil.java
+++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/telemetry/EnabledTraceUtil.java
@@ -20,6 +20,7 @@
import com.google.api.core.ApiFuture;
import com.google.api.core.ApiFutureCallback;
import com.google.api.core.ApiFutures;
+import com.google.api.core.InternalApi;
import com.google.cloud.firestore.FirestoreOptions;
import com.google.common.base.Throwables;
import io.grpc.ManagedChannelBuilder;
@@ -31,6 +32,7 @@
import io.opentelemetry.api.trace.SpanKind;
import io.opentelemetry.api.trace.StatusCode;
import io.opentelemetry.api.trace.Tracer;
+import io.opentelemetry.api.trace.TracerProvider;
import io.opentelemetry.instrumentation.grpc.v1_6.GrpcTelemetry;
import java.util.Map;
import javax.annotation.Nonnull;
@@ -40,6 +42,7 @@
* A utility class that uses OpenTelemetry for trace collection. `FirestoreOpenTelemetryOptions` in
* `FirestoreOptions` can be used to configure its behavior.
*/
+@InternalApi
public class EnabledTraceUtil implements TraceUtil {
private final Tracer tracer;
private final OpenTelemetry openTelemetry;
@@ -48,8 +51,7 @@ public class EnabledTraceUtil implements TraceUtil {
EnabledTraceUtil(FirestoreOptions firestoreOptions) {
OpenTelemetry openTelemetry = firestoreOptions.getOpenTelemetryOptions().getOpenTelemetry();
- // If tracing is enabled, but an OpenTelemetry instance is not provided, fall back
- // to using GlobalOpenTelemetry.
+ // If an OpenTelemetry instance is not provided, fall back to using GlobalOpenTelemetry.
if (openTelemetry == null) {
openTelemetry = GlobalOpenTelemetry.get();
}
@@ -84,6 +86,11 @@ public ManagedChannelBuilder apply(ManagedChannelBuilder managedChannelBuilder)
@Override
@Nullable
public ApiFunction getChannelConfigurator() {
+ // Note: using `==` rather than `.equals` since OpenTelemetry has only 1 static instance of
+ // `TracerProvider.noop`.
+ if (openTelemetry.getTracerProvider() == TracerProvider.noop()) {
+ return null;
+ }
return new OpenTelemetryGrpcChannelConfigurator();
}
diff --git a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/telemetry/TraceUtil.java b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/telemetry/TraceUtil.java
index 9dea95f28..847eff58a 100644
--- a/google-cloud-firestore/src/main/java/com/google/cloud/firestore/telemetry/TraceUtil.java
+++ b/google-cloud-firestore/src/main/java/com/google/cloud/firestore/telemetry/TraceUtil.java
@@ -18,6 +18,7 @@
import com.google.api.core.ApiFunction;
import com.google.api.core.ApiFuture;
+import com.google.api.core.InternalApi;
import com.google.cloud.firestore.FirestoreOptions;
import io.grpc.ManagedChannelBuilder;
import java.util.Map;
@@ -50,8 +51,9 @@ public interface TraceUtil {
* TraceUtil.
* @return An instance of the TraceUtil class.
*/
+ @InternalApi
static TraceUtil getInstance(@Nonnull FirestoreOptions firestoreOptions) {
- boolean createEnabledInstance = firestoreOptions.getOpenTelemetryOptions().isTracingEnabled();
+ boolean createEnabledInstance = true;
// The environment variable can override options to enable/disable telemetry collection.
String enableTracingEnvVar = System.getenv(ENABLE_TRACING_ENV_VAR);
diff --git a/google-cloud-firestore/src/test/java/com/google/cloud/firestore/OpenTelemetryOptionsTest.java b/google-cloud-firestore/src/test/java/com/google/cloud/firestore/OpenTelemetryOptionsTest.java
index 267020761..009e2457b 100644
--- a/google-cloud-firestore/src/test/java/com/google/cloud/firestore/OpenTelemetryOptionsTest.java
+++ b/google-cloud-firestore/src/test/java/com/google/cloud/firestore/OpenTelemetryOptionsTest.java
@@ -18,11 +18,12 @@
import static com.google.common.truth.Truth.assertThat;
-import com.google.cloud.firestore.telemetry.DisabledTraceUtil;
import com.google.cloud.firestore.telemetry.EnabledTraceUtil;
import io.opentelemetry.api.GlobalOpenTelemetry;
-import io.opentelemetry.api.OpenTelemetry;
+import io.opentelemetry.api.trace.TracerProvider;
import io.opentelemetry.sdk.OpenTelemetrySdk;
+import io.opentelemetry.sdk.resources.Resource;
+import io.opentelemetry.sdk.trace.SdkTracerProvider;
import javax.annotation.Nullable;
import org.junit.After;
import org.junit.Before;
@@ -49,112 +50,67 @@ FirestoreOptions.Builder getBaseOptions() {
}
@Test
- public void defaultOptionsDisablesTelemetryCollection() {
+ public void defaultOptionsUsesEnabledTraceUtilWithNoopOpenTelemetry() {
FirestoreOptions firestoreOptions = getBaseOptions().build();
firestore = firestoreOptions.getService();
- assertThat(firestore.getOptions().getOpenTelemetryOptions().isTracingEnabled()).isFalse();
assertThat(firestore.getOptions().getOpenTelemetryOptions().getOpenTelemetry()).isNull();
assertThat(firestore.getOptions().getTraceUtil()).isNotNull();
- assertThat(firestore.getOptions().getTraceUtil() instanceof DisabledTraceUtil).isTrue();
- }
-
- @Test
- public void canEnableTelemetryCollectionWithoutOpenTelemetryInstance() {
- FirestoreOptions firestoreOptions =
- getBaseOptions()
- .setOpenTelemetryOptions(
- FirestoreOpenTelemetryOptions.newBuilder().setTracingEnabled(true).build())
- .build();
- firestore = firestoreOptions.getService();
- assertThat(firestore.getOptions().getOpenTelemetryOptions().isTracingEnabled()).isTrue();
- assertThat(firestore.getOptions().getOpenTelemetryOptions().getOpenTelemetry()).isNull();
- assertThat(firestore.getOptions().getTraceUtil()).isNotNull();
- assertThat(firestore.getOptions().getTraceUtil() instanceof EnabledTraceUtil).isTrue();
- }
-
- @Test
- public void canEnableTelemetryCollectionWithOpenTelemetryInstance() {
- OpenTelemetry openTelemetry = GlobalOpenTelemetry.get();
- FirestoreOptions firestoreOptions =
- getBaseOptions()
- .setOpenTelemetryOptions(
- FirestoreOpenTelemetryOptions.newBuilder()
- .setTracingEnabled(true)
- .setOpenTelemetry(openTelemetry)
- .build())
- .build();
- firestore = firestoreOptions.getService();
- assertThat(firestore.getOptions().getOpenTelemetryOptions().isTracingEnabled()).isTrue();
- assertThat(firestore.getOptions().getOpenTelemetryOptions().getOpenTelemetry())
- .isEqualTo(openTelemetry);
- assertThat(firestore.getOptions().getTraceUtil()).isNotNull();
assertThat(firestore.getOptions().getTraceUtil() instanceof EnabledTraceUtil).isTrue();
+ EnabledTraceUtil enabledTraceUtil = (EnabledTraceUtil) firestore.getOptions().getTraceUtil();
+ // Assert that a Noop tracer provider is used by default.
+ assertThat(enabledTraceUtil.getOpenTelemetry().getTracerProvider())
+ .isSameInstanceAs(TracerProvider.noop());
}
@Test
- public void canDisableTelemetryCollectionWhileOpenTelemetryInstanceIsNotNull() {
- OpenTelemetry openTelemetry = GlobalOpenTelemetry.get();
- FirestoreOptions firestoreOptions =
- getBaseOptions()
- .setOpenTelemetryOptions(
- FirestoreOpenTelemetryOptions.newBuilder()
- .setTracingEnabled(false)
- .setOpenTelemetry(openTelemetry)
- .build())
- .build();
- firestore = firestoreOptions.getService();
- assertThat(firestore.getOptions().getOpenTelemetryOptions().isTracingEnabled()).isFalse();
- assertThat(firestore.getOptions().getOpenTelemetryOptions().getOpenTelemetry())
- .isEqualTo(openTelemetry);
- assertThat(firestore.getOptions().getTraceUtil()).isNotNull();
- assertThat(firestore.getOptions().getTraceUtil() instanceof DisabledTraceUtil).isTrue();
- }
+ public void existenceOfGlobalOpenTelemetryEnablesTracingWithTheGlobalTracerProvider() {
+ // Make a custom TracerProvider.
+ Resource resource =
+ Resource.getDefault().merge(Resource.builder().put("service.name", "test").build());
+ SdkTracerProvider myTracerProvider = SdkTracerProvider.builder().setResource(resource).build();
- @Test
- public void existenceOfGlobalOpenTelemetryDoesNotEnableTracing() {
- // Register a global OpenTelemetry SDK.
- OpenTelemetrySdk.builder().buildAndRegisterGlobal();
+ // Register a GlobalOpenTelemetry with the custom tracer provider.
+ OpenTelemetrySdk.builder().setTracerProvider(myTracerProvider).buildAndRegisterGlobal();
- // Make sure Firestore does not use GlobalOpenTelemetry by default.
+ // Do NOT pass an OpenTelemetry instance to Firestore.
FirestoreOptions firestoreOptions = getBaseOptions().build();
firestore = firestoreOptions.getService();
- assertThat(firestore.getOptions().getOpenTelemetryOptions().isTracingEnabled()).isFalse();
+
+ // An OpenTelemetry instance has not been set in options.
assertThat(firestore.getOptions().getOpenTelemetryOptions().getOpenTelemetry()).isNull();
+
+ // Assert that tracing is enabled and is using the custom tracer provider from the
+ // GlobalOpenTelemetry.
assertThat(firestore.getOptions().getTraceUtil()).isNotNull();
- assertThat(firestore.getOptions().getTraceUtil() instanceof DisabledTraceUtil).isTrue();
+ assertThat(firestore.getOptions().getTraceUtil() instanceof EnabledTraceUtil).isTrue();
+ EnabledTraceUtil enabledTraceUtil = (EnabledTraceUtil) firestore.getOptions().getTraceUtil();
+ assertThat(enabledTraceUtil.getOpenTelemetry().getTracerProvider().equals(myTracerProvider));
}
@Test
public void canPassOpenTelemetrySdkInstanceToFirestore() {
- OpenTelemetrySdk myOpenTelemetrySdk = OpenTelemetrySdk.builder().build();
+ // Make a custom TracerProvider and make an OpenTelemetry instance with it.
+ Resource resource =
+ Resource.getDefault().merge(Resource.builder().put("service.name", "test").build());
+ SdkTracerProvider myTracerProvider = SdkTracerProvider.builder().setResource(resource).build();
+ OpenTelemetrySdk myOpenTelemetrySdk =
+ OpenTelemetrySdk.builder().setTracerProvider(myTracerProvider).build();
+
+ // Pass it to Firestore.
FirestoreOptions firestoreOptions =
getBaseOptions()
.setOpenTelemetryOptions(
FirestoreOpenTelemetryOptions.newBuilder()
- .setTracingEnabled(true)
.setOpenTelemetry(myOpenTelemetrySdk)
.build())
.build();
firestore = firestoreOptions.getService();
+ assertThat(firestore.getOptions().getOpenTelemetryOptions().getOpenTelemetry())
+ .isEqualTo(myOpenTelemetrySdk);
+ assertThat(firestore.getOptions().getTraceUtil() instanceof EnabledTraceUtil).isTrue();
EnabledTraceUtil enabledTraceUtil = (EnabledTraceUtil) firestore.getOptions().getTraceUtil();
assertThat(enabledTraceUtil).isNotNull();
assertThat(enabledTraceUtil.getOpenTelemetry()).isEqualTo(myOpenTelemetrySdk);
- }
-
- @Test
- public void usesGlobalOpenTelemetryIfOpenTelemetryNotProvidedInOptions() {
- // Register a global OpenTelemetry SDK.
- OpenTelemetrySdk.builder().buildAndRegisterGlobal();
-
- // Do _not_ pass it to FirestoreOptions.
- FirestoreOptions firestoreOptions =
- getBaseOptions()
- .setOpenTelemetryOptions(
- FirestoreOpenTelemetryOptions.newBuilder().setTracingEnabled(true).build())
- .build();
- firestore = firestoreOptions.getService();
- EnabledTraceUtil enabledTraceUtil = (EnabledTraceUtil) firestore.getOptions().getTraceUtil();
- assertThat(enabledTraceUtil).isNotNull();
- assertThat(enabledTraceUtil.getOpenTelemetry()).isEqualTo(GlobalOpenTelemetry.get());
+ assertThat(enabledTraceUtil.getOpenTelemetry().getTracerProvider().equals(myTracerProvider));
}
}
diff --git a/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITE2ETracingTest.java b/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITE2ETracingTest.java
index 105cfe03a..82dbe9914 100644
--- a/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITE2ETracingTest.java
+++ b/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITE2ETracingTest.java
@@ -319,20 +319,13 @@ public void before() throws Exception {
// Initialize the Firestore DB w/ the OTel SDK. Ideally we'd do this is the @BeforeAll method
// but because gRPC traces need to be deterministically force-flushed, firestore.shutdown()
// must be called in @After for each test.
- FirestoreOptions.Builder optionsBuilder;
- if (isUsingGlobalOpenTelemetrySDK()) {
- optionsBuilder =
- FirestoreOptions.newBuilder()
- .setOpenTelemetryOptions(
- FirestoreOpenTelemetryOptions.newBuilder().setTracingEnabled(true).build());
- } else {
+ FirestoreOptions.Builder optionsBuilder = FirestoreOptions.newBuilder();
+ if (!isUsingGlobalOpenTelemetrySDK()) {
optionsBuilder =
- FirestoreOptions.newBuilder()
- .setOpenTelemetryOptions(
- FirestoreOpenTelemetryOptions.newBuilder()
- .setOpenTelemetry(openTelemetrySdk)
- .setTracingEnabled(true)
- .build());
+ optionsBuilder.setOpenTelemetryOptions(
+ FirestoreOpenTelemetryOptions.newBuilder()
+ .setOpenTelemetry(openTelemetrySdk)
+ .build());
}
String namedDb = System.getProperty("FIRESTORE_NAMED_DATABASE");
diff --git a/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITTracingTest.java b/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITTracingTest.java
index 46fbc9f17..225ff0162 100644
--- a/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITTracingTest.java
+++ b/google-cloud-firestore/src/test/java/com/google/cloud/firestore/it/ITTracingTest.java
@@ -126,11 +126,11 @@ public void before() {
if (isUsingGlobalOpenTelemetrySDK()) {
GlobalOpenTelemetry.resetForTest();
openTelemetrySdk = openTelemetrySdkBuilder.buildAndRegisterGlobal();
- optionsBuilder.setOpenTelemetryOptions(otelOptionsBuilder.setTracingEnabled(true).build());
+ optionsBuilder.setOpenTelemetryOptions(otelOptionsBuilder.build());
} else {
openTelemetrySdk = openTelemetrySdkBuilder.build();
optionsBuilder.setOpenTelemetryOptions(
- otelOptionsBuilder.setTracingEnabled(true).setOpenTelemetry(openTelemetrySdk).build());
+ otelOptionsBuilder.setOpenTelemetry(openTelemetrySdk).build());
}
String namedDb = System.getProperty("FIRESTORE_NAMED_DATABASE");
diff --git a/google-cloud-firestore/src/test/java/com/google/cloud/firestore/telemetry/EnabledTraceUtilTest.java b/google-cloud-firestore/src/test/java/com/google/cloud/firestore/telemetry/EnabledTraceUtilTest.java
index f131c3018..22e835f19 100644
--- a/google-cloud-firestore/src/test/java/com/google/cloud/firestore/telemetry/EnabledTraceUtilTest.java
+++ b/google-cloud-firestore/src/test/java/com/google/cloud/firestore/telemetry/EnabledTraceUtilTest.java
@@ -20,6 +20,7 @@
import com.google.cloud.firestore.FirestoreOpenTelemetryOptions;
import com.google.cloud.firestore.FirestoreOptions;
import io.opentelemetry.api.GlobalOpenTelemetry;
+import io.opentelemetry.api.trace.TracerProvider;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import org.junit.Before;
import org.junit.Test;
@@ -31,19 +32,12 @@ public void setUp() {
GlobalOpenTelemetry.resetForTest();
}
- FirestoreOptions.Builder getBaseOptions() {
- return FirestoreOptions.newBuilder().setProjectId("test-project").setDatabaseId("(default)");
+ EnabledTraceUtil defaultEnabledTraceUtil() {
+ return new EnabledTraceUtil(FirestoreOptions.getDefaultInstance());
}
- FirestoreOptions getTracingEnabledOptions() {
- return getBaseOptions()
- .setOpenTelemetryOptions(
- FirestoreOpenTelemetryOptions.newBuilder().setTracingEnabled(true).build())
- .build();
- }
-
- EnabledTraceUtil newEnabledTraceUtil() {
- return new EnabledTraceUtil(getTracingEnabledOptions());
+ FirestoreOptions.Builder getBaseOptions() {
+ return FirestoreOptions.newBuilder().setProjectId("test-project").setDatabaseId("(default)");
}
@Test
@@ -53,39 +47,79 @@ public void usesOpenTelemetryFromOptions() {
getBaseOptions()
.setOpenTelemetryOptions(
FirestoreOpenTelemetryOptions.newBuilder()
- .setTracingEnabled(true)
.setOpenTelemetry(myOpenTelemetrySdk)
.build())
.build();
EnabledTraceUtil traceUtil = new EnabledTraceUtil(firestoreOptions);
- assertThat(traceUtil.getOpenTelemetry()).isEqualTo(myOpenTelemetrySdk);
+ assertThat(traceUtil.getOpenTelemetry()).isSameInstanceAs(myOpenTelemetrySdk);
}
@Test
public void usesGlobalOpenTelemetryIfOpenTelemetryInstanceNotProvided() {
OpenTelemetrySdk.builder().buildAndRegisterGlobal();
+ EnabledTraceUtil traceUtil = defaultEnabledTraceUtil();
+ assertThat(traceUtil.getOpenTelemetry()).isSameInstanceAs(GlobalOpenTelemetry.get());
+ }
+
+ @Test
+ public void usesOpenTelemetryFromOptionsEvenIfGlobalOpenTelemetryExists() {
+ // Register a GlobalOpenTelemetry.
+ OpenTelemetrySdk.builder().buildAndRegisterGlobal();
+
+ // Pass in a *different* OpenTelemetry instance to Firestore to use.
+ OpenTelemetrySdk myOpenTelemetrySdk = OpenTelemetrySdk.builder().build();
FirestoreOptions firestoreOptions =
getBaseOptions()
.setOpenTelemetryOptions(
- FirestoreOpenTelemetryOptions.newBuilder().setTracingEnabled(true).build())
+ FirestoreOpenTelemetryOptions.newBuilder()
+ .setOpenTelemetry(myOpenTelemetrySdk)
+ .build())
.build();
EnabledTraceUtil traceUtil = new EnabledTraceUtil(firestoreOptions);
- assertThat(traceUtil.getOpenTelemetry()).isEqualTo(GlobalOpenTelemetry.get());
+
+ // Assert Firestore uses the custom one, not the global one.
+ assertThat(traceUtil.getOpenTelemetry()).isSameInstanceAs(myOpenTelemetrySdk);
+ assertThat(traceUtil.getOpenTelemetry()).isNotSameInstanceAs(GlobalOpenTelemetry.get());
}
@Test
- public void enabledTraceUtilProvidesChannelConfigurator() {
- assertThat(newEnabledTraceUtil().getChannelConfigurator()).isNotNull();
+ public void defaultOptionsDoesNotRegisterGrpcChannelConfigurator() {
+ EnabledTraceUtil traceUtil = defaultEnabledTraceUtil();
+ assertThat(traceUtil.getOpenTelemetry().getTracerProvider())
+ .isSameInstanceAs(TracerProvider.noop());
+ assertThat(traceUtil.getChannelConfigurator()).isNull();
+ }
+
+ @Test
+ public void globalOpenTelemetryRegistersGrpcChannelConfigurator() {
+ OpenTelemetrySdk.builder().buildAndRegisterGlobal();
+ EnabledTraceUtil traceUtil = defaultEnabledTraceUtil();
+ assertThat(traceUtil.getChannelConfigurator()).isNotNull();
+ }
+
+ @Test
+ public void openTelemetryInstanceRegistersGrpcChannelConfigurator() {
+ OpenTelemetrySdk myOpenTelemetrySdk = OpenTelemetrySdk.builder().build();
+ FirestoreOptions firestoreOptions =
+ getBaseOptions()
+ .setOpenTelemetryOptions(
+ FirestoreOpenTelemetryOptions.newBuilder()
+ .setOpenTelemetry(myOpenTelemetrySdk)
+ .build())
+ .build();
+ EnabledTraceUtil traceUtil = new EnabledTraceUtil(firestoreOptions);
+ assertThat(traceUtil.getChannelConfigurator()).isNotNull();
}
@Test
public void usesEnabledContext() {
- assertThat(newEnabledTraceUtil().currentContext() instanceof EnabledTraceUtil.Context).isTrue();
+ assertThat(defaultEnabledTraceUtil().currentContext() instanceof EnabledTraceUtil.Context)
+ .isTrue();
}
@Test
public void usesEnabledSpan() {
- EnabledTraceUtil traceUtil = newEnabledTraceUtil();
+ EnabledTraceUtil traceUtil = defaultEnabledTraceUtil();
assertThat(traceUtil.currentSpan() instanceof EnabledTraceUtil.Span).isTrue();
assertThat(traceUtil.startSpan("foo") instanceof EnabledTraceUtil.Span).isTrue();
assertThat(
@@ -95,14 +129,14 @@ public void usesEnabledSpan() {
@Test
public void usesEnabledScope() {
- EnabledTraceUtil traceUtil = newEnabledTraceUtil();
+ EnabledTraceUtil traceUtil = defaultEnabledTraceUtil();
assertThat(traceUtil.currentContext().makeCurrent() instanceof EnabledTraceUtil.Scope).isTrue();
assertThat(traceUtil.currentSpan().makeCurrent() instanceof EnabledTraceUtil.Scope).isTrue();
}
@Test
public void durationString() {
- EnabledTraceUtil traceUtil = newEnabledTraceUtil();
+ EnabledTraceUtil traceUtil = defaultEnabledTraceUtil();
Duration duration = Duration.ofSeconds(2, 9);
assertThat(traceUtil.durationString(duration)).isEqualTo("2.000000009s");
diff --git a/google-cloud-firestore/src/test/java/com/google/cloud/firestore/telemetry/TraceUtilTest.java b/google-cloud-firestore/src/test/java/com/google/cloud/firestore/telemetry/TraceUtilTest.java
index 5bb3be668..e2c20b1df 100644
--- a/google-cloud-firestore/src/test/java/com/google/cloud/firestore/telemetry/TraceUtilTest.java
+++ b/google-cloud-firestore/src/test/java/com/google/cloud/firestore/telemetry/TraceUtilTest.java
@@ -17,45 +17,17 @@
import static com.google.common.truth.Truth.assertThat;
-import com.google.cloud.firestore.FirestoreOpenTelemetryOptions;
import com.google.cloud.firestore.FirestoreOptions;
+import io.opentelemetry.api.trace.TracerProvider;
import org.junit.Test;
public class TraceUtilTest {
@Test
- public void defaultOptionsUseDisabledTraceUtil() {
- TraceUtil traceUtil =
- TraceUtil.getInstance(
- FirestoreOptions.newBuilder()
- .setProjectId("test-project")
- .setDatabaseId("(default)")
- .build());
- assertThat(traceUtil instanceof DisabledTraceUtil).isTrue();
- }
-
- @Test
- public void tracingDisabledOptionsUseDisabledTraceUtil() {
- TraceUtil traceUtil =
- TraceUtil.getInstance(
- FirestoreOptions.newBuilder()
- .setProjectId("test-project")
- .setDatabaseId("(default)")
- .setOpenTelemetryOptions(
- FirestoreOpenTelemetryOptions.newBuilder().setTracingEnabled(false).build())
- .build());
- assertThat(traceUtil instanceof DisabledTraceUtil).isTrue();
- }
-
- @Test
- public void tracingEnabledOptionsUseEnabledTraceUtil() {
- TraceUtil traceUtil =
- TraceUtil.getInstance(
- FirestoreOptions.newBuilder()
- .setProjectId("test-project")
- .setDatabaseId("(default)")
- .setOpenTelemetryOptions(
- FirestoreOpenTelemetryOptions.newBuilder().setTracingEnabled(true).build())
- .build());
+ public void defaultOptionsUseNoopTracer() {
+ TraceUtil traceUtil = TraceUtil.getInstance(FirestoreOptions.getDefaultInstance());
assertThat(traceUtil instanceof EnabledTraceUtil).isTrue();
+ EnabledTraceUtil enabledTraceUtil = (EnabledTraceUtil) traceUtil;
+ assertThat(
+ enabledTraceUtil.getOpenTelemetry().getTracerProvider().equals(TracerProvider.noop()));
}
}