From 729454ec507a9a129e18d0744111e2777ed01071 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Wed, 1 Jul 2026 18:30:27 +0000 Subject: [PATCH 1/5] fix(datastore): Configure TraceExporter with Datastore credentials in E2E tests Configure `TraceExporter` and `TraceServiceClient` with default Datastore credentials in `ITE2ETracingTest`. This fixes authentication issues when running E2E tracing tests in environments where Application Default Credentials (ADC) might not be automatically picked up by the exporter or client. Similar to the fix implemented for Spanner in ef76d87b1efda6876fc5c819ed97ca144bc4b1e8. TAG=agy CONV=5d4f613d-13e3-4d5f-aa1f-5a913b05c507 --- .../cloud/datastore/it/ITE2ETracingTest.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/java-datastore/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITE2ETracingTest.java b/java-datastore/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITE2ETracingTest.java index 88a3302ce5f2..3e1b0e5bee05 100644 --- a/java-datastore/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITE2ETracingTest.java +++ b/java-datastore/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITE2ETracingTest.java @@ -37,8 +37,10 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import com.google.api.gax.core.FixedCredentialsProvider; import com.google.api.gax.rpc.DeadlineExceededException; import com.google.api.gax.rpc.NotFoundException; +import com.google.auth.Credentials; import com.google.cloud.datastore.AggregationQuery; import com.google.cloud.datastore.AggregationResult; import com.google.cloud.datastore.AggregationResults; @@ -58,6 +60,7 @@ import com.google.cloud.opentelemetry.trace.TraceConfiguration; import com.google.cloud.opentelemetry.trace.TraceExporter; import com.google.cloud.trace.v1.TraceServiceClient; +import com.google.cloud.trace.v1.TraceServiceSettings; import com.google.common.base.Preconditions; import com.google.devtools.cloudtrace.v1.Trace; import com.google.devtools.cloudtrace.v1.TraceSpan; @@ -280,10 +283,25 @@ private boolean dfsContainsCallStack(long spanId, List expectedCallStack @BeforeClass public static void setup() throws IOException { projectId = DatastoreOptions.getDefaultProjectId(); + + // Share the same credentials used by Datastore client with the TraceExporter and + // TraceServiceClient to ensure consistency and avoid auth issues in environments + // where default ADC resolution might fail for the exporter. + Credentials credentials = DatastoreOptions.getDefaultInstance().getCredentials(); + + TraceConfiguration.Builder traceConfigurationBuilder = TraceConfiguration.builder(); + if (credentials != null) { + traceConfigurationBuilder.setCredentials(credentials); + } traceExporter = TraceExporter.createWithConfiguration( - TraceConfiguration.builder().setProjectId(projectId).build()); - traceClient_v1 = TraceServiceClient.create(); + traceConfigurationBuilder.setProjectId(projectId).build()); + + TraceServiceSettings.Builder clientBuilder = TraceServiceSettings.newBuilder(); + if (credentials != null) { + clientBuilder.setCredentialsProvider(FixedCredentialsProvider.create(credentials)); + } + traceClient_v1 = TraceServiceClient.create(clientBuilder.build()); random = new Random(); } From c26d1f5b39e30259493b4dfeeb223e76e0adf27f Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Wed, 1 Jul 2026 18:33:22 +0000 Subject: [PATCH 2/5] refactor(datastore): Rename traceClient_v1 to traceClientV1 to use camelCase Follow-up to address review comment. TAG=agy CONV=5d4f613d-13e3-4d5f-aa1f-5a913b05c507 --- .../google/cloud/datastore/it/ITE2ETracingTest.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/java-datastore/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITE2ETracingTest.java b/java-datastore/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITE2ETracingTest.java index 3e1b0e5bee05..6b7526447c0f 100644 --- a/java-datastore/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITE2ETracingTest.java +++ b/java-datastore/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITE2ETracingTest.java @@ -249,12 +249,12 @@ private boolean dfsContainsCallStack(long spanId, List expectedCallStack private static TraceExporter traceExporter; // Required for reading back traces from Cloud Trace for validation - private static TraceServiceClient traceClient_v1; + private static TraceServiceClient traceClientV1; // Custom SpanContext for each test, required for TraceID injection private static SpanContext customSpanContext; - // Trace read back from Cloud Trace using traceClient_v1 for verification + // Trace read back from Cloud Trace using traceClientV1 for verification private static Trace retrievedTrace; private static String rootSpanName; @@ -301,7 +301,7 @@ public static void setup() throws IOException { if (credentials != null) { clientBuilder.setCredentialsProvider(FixedCredentialsProvider.create(credentials)); } - traceClient_v1 = TraceServiceClient.create(clientBuilder.build()); + traceClientV1 = TraceServiceClient.create(clientBuilder.build()); random = new Random(); } @@ -399,7 +399,7 @@ public void after() throws Exception { @AfterClass public static void teardown() throws Exception { - traceClient_v1.close(); + traceClientV1.close(); } // Generates a random hex string of length `numBytes` @@ -461,7 +461,7 @@ protected void fetchAndValidateTrace( // Fetch traces do { try { - retrievedTrace = traceClient_v1.getTrace(projectId, traceId); + retrievedTrace = traceClientV1.getTrace(projectId, traceId); assertEquals(traceId, retrievedTrace.getTraceId()); logger.info( @@ -548,7 +548,7 @@ public void traceContainerTest() throws Exception { int numRetries = GET_TRACE_RETRY_COUNT; do { try { - traceResp = traceClient_v1.getTrace(projectId, customSpanContext.getTraceId()); + traceResp = traceClientV1.getTrace(projectId, customSpanContext.getTraceId()); if (traceResp.getSpansCount() == expectedSpanCount) { logger.info("Success: Got " + expectedSpanCount + " spans."); break; From 6d7902c5eec3f786a0d86bd2708cc9560a521429 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Wed, 1 Jul 2026 18:35:33 +0000 Subject: [PATCH 3/5] refactor(datastore): Rename traceClientV1 to traceClient Simplify name to traceClient as there is only one trace client. TAG=agy CONV=5d4f613d-13e3-4d5f-aa1f-5a913b05c507 --- .../google/cloud/datastore/it/ITE2ETracingTest.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/java-datastore/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITE2ETracingTest.java b/java-datastore/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITE2ETracingTest.java index 6b7526447c0f..ef8e7f0d3139 100644 --- a/java-datastore/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITE2ETracingTest.java +++ b/java-datastore/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITE2ETracingTest.java @@ -249,12 +249,12 @@ private boolean dfsContainsCallStack(long spanId, List expectedCallStack private static TraceExporter traceExporter; // Required for reading back traces from Cloud Trace for validation - private static TraceServiceClient traceClientV1; + private static TraceServiceClient traceClient; // Custom SpanContext for each test, required for TraceID injection private static SpanContext customSpanContext; - // Trace read back from Cloud Trace using traceClientV1 for verification + // Trace read back from Cloud Trace using traceClient for verification private static Trace retrievedTrace; private static String rootSpanName; @@ -301,7 +301,7 @@ public static void setup() throws IOException { if (credentials != null) { clientBuilder.setCredentialsProvider(FixedCredentialsProvider.create(credentials)); } - traceClientV1 = TraceServiceClient.create(clientBuilder.build()); + traceClient = TraceServiceClient.create(clientBuilder.build()); random = new Random(); } @@ -399,7 +399,7 @@ public void after() throws Exception { @AfterClass public static void teardown() throws Exception { - traceClientV1.close(); + traceClient.close(); } // Generates a random hex string of length `numBytes` @@ -461,7 +461,7 @@ protected void fetchAndValidateTrace( // Fetch traces do { try { - retrievedTrace = traceClientV1.getTrace(projectId, traceId); + retrievedTrace = traceClient.getTrace(projectId, traceId); assertEquals(traceId, retrievedTrace.getTraceId()); logger.info( @@ -548,7 +548,7 @@ public void traceContainerTest() throws Exception { int numRetries = GET_TRACE_RETRY_COUNT; do { try { - traceResp = traceClientV1.getTrace(projectId, customSpanContext.getTraceId()); + traceResp = traceClient.getTrace(projectId, customSpanContext.getTraceId()); if (traceResp.getSpansCount() == expectedSpanCount) { logger.info("Success: Got " + expectedSpanCount + " spans."); break; From 478883c43d591149a9184656deacf4d2c2e0a77e Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Wed, 1 Jul 2026 18:41:07 +0000 Subject: [PATCH 4/5] refactor(datastore): Initialize TraceConfiguration.Builder with projectId directly Address code review suggestion: initialize the builder with the project ID directly instead of setting it during exporter creation. TAG=agy CONV=5d4f613d-13e3-4d5f-aa1f-5a913b05c507 --- .../com/google/cloud/datastore/it/ITE2ETracingTest.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/java-datastore/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITE2ETracingTest.java b/java-datastore/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITE2ETracingTest.java index ef8e7f0d3139..d24cb6f19b71 100644 --- a/java-datastore/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITE2ETracingTest.java +++ b/java-datastore/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITE2ETracingTest.java @@ -289,13 +289,12 @@ public static void setup() throws IOException { // where default ADC resolution might fail for the exporter. Credentials credentials = DatastoreOptions.getDefaultInstance().getCredentials(); - TraceConfiguration.Builder traceConfigurationBuilder = TraceConfiguration.builder(); + TraceConfiguration.Builder traceConfigurationBuilder = + TraceConfiguration.builder().setProjectId(projectId); if (credentials != null) { traceConfigurationBuilder.setCredentials(credentials); } - traceExporter = - TraceExporter.createWithConfiguration( - traceConfigurationBuilder.setProjectId(projectId).build()); + traceExporter = TraceExporter.createWithConfiguration(traceConfigurationBuilder.build()); TraceServiceSettings.Builder clientBuilder = TraceServiceSettings.newBuilder(); if (credentials != null) { From 3384395291d864667589b8b9399d1972baba7dbc Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Wed, 1 Jul 2026 19:33:25 +0000 Subject: [PATCH 5/5] test(datastore): fix transaction query tracing test Fixes a bug in ITE2ETracingTest.runInTransactionQueryTest where it was using datastore.run instead of transaction.run inside the TransactionCallable. This also updates the expected span name to Transaction.RunQuery since the query is now executed within the transaction context. TAG=agy CONV=5d4f613d-13e3-4d5f-aa1f-5a913b05c507 --- .../java/com/google/cloud/datastore/it/ITE2ETracingTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java-datastore/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITE2ETracingTest.java b/java-datastore/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITE2ETracingTest.java index d24cb6f19b71..63a80fe1913f 100644 --- a/java-datastore/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITE2ETracingTest.java +++ b/java-datastore/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITE2ETracingTest.java @@ -1007,7 +1007,7 @@ public void runInTransactionQueryTest() throws Exception { Query.newEntityQueryBuilder().setKind(KEY1.getKind()).setFilter(filter).build(); Datastore.TransactionCallable callable = transaction -> { - QueryResults queryResults = datastore.run(query); + QueryResults queryResults = transaction.run(query); assertTrue(queryResults.hasNext()); assertEquals(entity1, queryResults.next()); assertFalse(queryResults.hasNext()); @@ -1024,7 +1024,7 @@ public void runInTransactionQueryTest() throws Exception { /* numExpectedSpans= */ 4, Arrays.asList( Arrays.asList(SPAN_NAME_TRANSACTION_RUN, SPAN_NAME_BEGIN_TRANSACTION), - Arrays.asList(SPAN_NAME_TRANSACTION_RUN, SPAN_NAME_RUN_QUERY), + Arrays.asList(SPAN_NAME_TRANSACTION_RUN, SPAN_NAME_TRANSACTION_RUN_QUERY), Arrays.asList(SPAN_NAME_TRANSACTION_RUN, SPAN_NAME_TRANSACTION_COMMIT))); } }