Skip to content

Commit e44653c

Browse files
authored
feat: RunQuery trace instrumentation (#1441)
* feat: RunQuery trace instrumentation
1 parent 727c398 commit e44653c

File tree

3 files changed

+61
-17
lines changed

3 files changed

+61
-17
lines changed

google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreImpl.java

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import com.google.datastore.v1.ExplainOptions;
3636
import com.google.datastore.v1.ReadOptions;
3737
import com.google.datastore.v1.ReserveIdsRequest;
38+
import com.google.datastore.v1.RunQueryResponse;
3839
import com.google.datastore.v1.TransactionOptions;
3940
import com.google.protobuf.ByteString;
4041
import io.opencensus.common.Scope;
@@ -240,20 +241,34 @@ public AggregationResults runAggregation(
240241

241242
com.google.datastore.v1.RunQueryResponse runQuery(
242243
final com.google.datastore.v1.RunQueryRequest requestPb) {
243-
Span span = traceUtil.startSpan(TraceUtil.SPAN_NAME_RUNQUERY);
244-
try (Scope scope = traceUtil.getTracer().withSpan(span)) {
245-
return RetryHelper.runWithRetries(
246-
() -> datastoreRpc.runQuery(requestPb),
247-
retrySettings,
248-
requestPb.getReadOptions().getTransaction().isEmpty()
249-
? EXCEPTION_HANDLER
250-
: TRANSACTION_OPERATION_EXCEPTION_HANDLER,
251-
getOptions().getClock());
244+
com.google.cloud.datastore.telemetry.TraceUtil.Span span =
245+
otelTraceUtil.startSpan(com.google.cloud.datastore.telemetry.TraceUtil.SPAN_NAME_RUN_QUERY);
246+
ReadOptions readOptions = requestPb.getReadOptions();
247+
span.setAttribute(
248+
"isTransactional", readOptions.hasTransaction() || readOptions.hasNewTransaction());
249+
span.setAttribute("readConsistency", readOptions.getReadConsistency().toString());
250+
251+
try (com.google.cloud.datastore.telemetry.TraceUtil.Scope ignored = span.makeCurrent()) {
252+
RunQueryResponse response =
253+
RetryHelper.runWithRetries(
254+
() -> datastoreRpc.runQuery(requestPb),
255+
retrySettings,
256+
requestPb.getReadOptions().getTransaction().isEmpty()
257+
? EXCEPTION_HANDLER
258+
: TRANSACTION_OPERATION_EXCEPTION_HANDLER,
259+
getOptions().getClock());
260+
span.addEvent(
261+
com.google.cloud.datastore.telemetry.TraceUtil.SPAN_NAME_RUN_QUERY + ": Completed",
262+
new ImmutableMap.Builder<String, Object>()
263+
.put("Received", response.getBatch().getEntityResultsCount())
264+
.put("More results", response.getBatch().getMoreResults().toString())
265+
.build());
266+
return response;
252267
} catch (RetryHelperException e) {
253-
span.setStatus(Status.UNKNOWN.withDescription(e.getMessage()));
268+
span.end(e);
254269
throw DatastoreException.translateAndThrow(e);
255270
} finally {
256-
span.end(TraceUtil.END_SPAN_OPTIONS);
271+
span.end();
257272
}
258273
}
259274

google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/TraceUtil.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,9 @@ public interface TraceUtil {
3131
static final String ATTRIBUTE_SERVICE_PREFIX = "gcp.datastore.";
3232
static final String ENABLE_TRACING_ENV_VAR = "DATASTORE_ENABLE_TRACING";
3333
static final String LIBRARY_NAME = "com.google.cloud.datastore";
34-
3534
static final String SPAN_NAME_LOOKUP = "Lookup";
36-
3735
static final String SPAN_NAME_COMMIT = "Commit";
36+
static final String SPAN_NAME_RUN_QUERY = "RunQuery";
3837

3938
/**
4039
* Creates and returns an instance of the TraceUtil class.

google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITE2ETracingTest.java

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import static com.google.cloud.datastore.telemetry.TraceUtil.SPAN_NAME_COMMIT;
2020
import static com.google.cloud.datastore.telemetry.TraceUtil.SPAN_NAME_LOOKUP;
21+
import static com.google.cloud.datastore.telemetry.TraceUtil.SPAN_NAME_RUN_QUERY;
2122
import static io.opentelemetry.semconv.resource.attributes.ResourceAttributes.SERVICE_NAME;
2223
import static org.junit.Assert.assertEquals;
2324
import static org.junit.Assert.assertFalse;
@@ -30,6 +31,9 @@
3031
import com.google.cloud.datastore.DatastoreOptions;
3132
import com.google.cloud.datastore.Entity;
3233
import com.google.cloud.datastore.Key;
34+
import com.google.cloud.datastore.Query;
35+
import com.google.cloud.datastore.QueryResults;
36+
import com.google.cloud.datastore.StructuredQuery.PropertyFilter;
3337
import com.google.cloud.datastore.testing.RemoteDatastoreHelper;
3438
import com.google.cloud.opentelemetry.trace.TraceConfiguration;
3539
import com.google.cloud.opentelemetry.trace.TraceExporter;
@@ -301,11 +305,11 @@ public void before() throws Exception {
301305
String projectId = options.getProjectId();
302306
String kind1 = "kind1";
303307
KEY1 =
304-
Key.newBuilder(projectId, kind1, "name1", options.getDatabaseId())
308+
Key.newBuilder(projectId, kind1, "key1", options.getDatabaseId())
305309
.setNamespace(options.getNamespace())
306310
.build();
307311
KEY2 =
308-
Key.newBuilder(projectId, kind1, "name2", options.getDatabaseId())
312+
Key.newBuilder(projectId, kind1, "key2", options.getDatabaseId())
309313
.setNamespace(options.getNamespace())
310314
.build();
311315

@@ -594,7 +598,6 @@ public void updateTraceTest() throws Exception {
594598
assertEquals(entityList, response);
595599

596600
Span rootSpan = getNewRootSpanWithContext();
597-
598601
try (Scope ignored = rootSpan.makeCurrent()) {
599602
Entity entity1_update =
600603
Entity.newBuilder(entity1).set("test_field", "new_test_value1").build();
@@ -625,7 +628,34 @@ public void deleteTraceTest() throws Exception {
625628
rootSpan.end();
626629
}
627630
waitForTracesToComplete();
628-
629631
fetchAndValidateTrace(customSpanContext.getTraceId(), SPAN_NAME_COMMIT);
630632
}
633+
634+
@Test
635+
public void runQueryTraceTest() throws Exception {
636+
Entity entity1 = Entity.newBuilder(KEY1).set("test_field", "test_value1").build();
637+
Entity entity2 = Entity.newBuilder(KEY2).set("test_field", "test_value2").build();
638+
List<Entity> entityList = new ArrayList<>();
639+
entityList.add(entity1);
640+
entityList.add(entity2);
641+
642+
List<Entity> response = datastore.add(entity1, entity2);
643+
assertEquals(entityList, response);
644+
645+
Span rootSpan = getNewRootSpanWithContext();
646+
try (Scope ignored = rootSpan.makeCurrent()) {
647+
PropertyFilter filter = PropertyFilter.eq("test_field", entity1.getValue("test_field"));
648+
Query<Entity> query =
649+
Query.newEntityQueryBuilder().setKind(KEY1.getKind()).setFilter(filter).build();
650+
QueryResults<Entity> queryResults = datastore.run(query);
651+
assertTrue(queryResults.hasNext());
652+
assertEquals(entity1, queryResults.next());
653+
assertFalse(queryResults.hasNext());
654+
} finally {
655+
rootSpan.end();
656+
}
657+
waitForTracesToComplete();
658+
659+
fetchAndValidateTrace(customSpanContext.getTraceId(), SPAN_NAME_RUN_QUERY);
660+
}
631661
}

0 commit comments

Comments
 (0)