Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mila/client side metrics demo2 #1840

Draft
wants to merge 29 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
30a7011
enable 4 metrics from GAX
milaGGL Aug 14, 2024
ed85413
format
milaGGL Aug 16, 2024
57084c4
add default otel
milaGGL Aug 21, 2024
571c095
format
milaGGL Aug 21, 2024
f4b8416
move constants out
milaGGL Aug 22, 2024
da0fe82
format
milaGGL Aug 23, 2024
61432eb
add additional attributes
milaGGL Aug 26, 2024
b5bfe5c
Merge branch 'main' into mila/client-side-metrics-demo
milaGGL Aug 26, 2024
f0a029d
add attributes to gax metrics
milaGGL Aug 27, 2024
5456038
Update BuiltinMetricsConstants.java
milaGGL Sep 4, 2024
5efaba6
remove current metrics implementation
milaGGL Sep 9, 2024
c0b4cc1
add custom exporter, add latency recorder
milaGGL Sep 11, 2024
3979331
use 2 otel instances
milaGGL Sep 18, 2024
a9d08b5
set custom apiTracerFactory to gax
milaGGL Sep 20, 2024
029bd8c
Merge branch 'main' into mila/client-side-metrics-demo2
milaGGL Sep 23, 2024
50e05fb
fix opentelemtry dependency version conflict issue
milaGGL Sep 23, 2024
53cd48a
use enabled/disabled style
milaGGL Sep 24, 2024
7adb9d6
modify access modifiers
milaGGL Sep 24, 2024
690e4ee
format
milaGGL Sep 24, 2024
e6f8ba6
rename boolean
milaGGL Sep 26, 2024
c4ca4ae
Merge branch 'main' into mila/client-side-metrics-demo2
milaGGL Sep 27, 2024
887221d
chore: generate libraries at Fri Sep 27 19:25:02 UTC 2024
cloud-java-bot Sep 27, 2024
a2c715a
Update pom.xml
milaGGL Sep 27, 2024
ed78182
resolve comments from proto
milaGGL Oct 1, 2024
e0d46be
e2E latency for runTransaction
milaGGL Oct 3, 2024
a72a685
Merge branch 'main' into mila/client-side-metrics-demo2
milaGGL Oct 4, 2024
92c83c1
chore: generate libraries at Fri Oct 4 14:44:19 UTC 2024
cloud-java-bot Oct 4, 2024
c5137c1
remove noise
milaGGL Oct 4, 2024
63b5bd3
reformat code
milaGGL Oct 4, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ If you are using Maven with [BOM][libraries-bom], add this to your pom.xml file:
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>libraries-bom</artifactId>
<version>26.47.0</version>
<version>26.48.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
Expand All @@ -42,7 +42,7 @@ If you are using Maven without the BOM, add this to your dependencies:
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-firestore</artifactId>
<version>3.26.5</version>
<version>3.27.0</version>
</dependency>

```
Expand Down
15 changes: 9 additions & 6 deletions google-cloud-firestore/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,15 @@
<groupId>io.opentelemetry.instrumentation</groupId>
<artifactId>opentelemetry-grpc-1.6</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk</artifactId>
</dependency>
<dependency>
<groupId>com.google.cloud.opentelemetry</groupId>
<artifactId>exporter-metrics</artifactId>
<version>0.31.0</version>
</dependency>
<!-- END OpenTelemetry -->

<!-- Test dependencies -->
Expand Down Expand Up @@ -181,12 +190,6 @@
<scope>test</scope>
</dependency>
<!-- OpenTelemetry -->
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk</artifactId>
<version>${opentelemetry.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk-testing</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@

package com.google.cloud.firestore;

import static com.google.cloud.firestore.telemetry.TelemetryConstants.METHOD_NAME_RUN_AGGREGATION_QUERY;
import static com.google.cloud.firestore.telemetry.TraceUtil.ATTRIBUTE_KEY_ATTEMPT;
import static com.google.cloud.firestore.telemetry.TraceUtil.SPAN_NAME_RUN_AGGREGATION_QUERY;

import com.google.api.core.ApiFuture;
import com.google.api.core.InternalExtensionOnly;
Expand All @@ -27,6 +27,9 @@
import com.google.api.gax.rpc.StatusCode;
import com.google.api.gax.rpc.StreamController;
import com.google.cloud.Timestamp;
import com.google.cloud.firestore.telemetry.MetricsUtil;
import com.google.cloud.firestore.telemetry.MetricsUtil.MetricsContext;
import com.google.cloud.firestore.telemetry.TelemetryConstants;
import com.google.cloud.firestore.telemetry.TraceUtil;
import com.google.cloud.firestore.telemetry.TraceUtil.Scope;
import com.google.cloud.firestore.v1.FirestoreSettings;
Expand Down Expand Up @@ -70,6 +73,11 @@ private TraceUtil getTraceUtil() {
return query.getFirestore().getOptions().getTraceUtil();
}

@Nonnull
private MetricsUtil getMetricsUtil() {
return query.getFirestore().getOptions().getMetricsUtil();
}

/** Returns the query whose aggregations will be calculated by this object. */
@Nonnull
public Query getQuery() {
Expand All @@ -96,7 +104,14 @@ public ApiFuture<AggregateQuerySnapshot> get() {
*/
@Nonnull
public ApiFuture<ExplainResults<AggregateQuerySnapshot>> explain(ExplainOptions options) {
TraceUtil.Span span = getTraceUtil().startSpan(TraceUtil.SPAN_NAME_AGGREGATION_QUERY_GET);
TraceUtil.Span span =
getTraceUtil().startSpan(TelemetryConstants.METHOD_NAME_AGGREGATION_QUERY_GET);

MetricsContext metricsContext =
getMetricsUtil()
.createMetricsContext(
TelemetryConstants.METHOD_NAME_RUN_QUERY_EXPLAIN_AGGREGATION_QUERY);

try (Scope ignored = span.makeCurrent()) {
AggregateQueryExplainResponseDeliverer responseDeliverer =
new AggregateQueryExplainResponseDeliverer(
Expand All @@ -106,10 +121,14 @@ public ApiFuture<ExplainResults<AggregateQuerySnapshot>> explain(ExplainOptions
/* explainOptions= */ options);
runQuery(responseDeliverer, /* attempt */ 0);
ApiFuture<ExplainResults<AggregateQuerySnapshot>> result = responseDeliverer.getFuture();

span.endAtFuture(result);
metricsContext.recordEndToEndLatencyAtFuture(result);

return result;
} catch (Exception error) {
span.end(error);
metricsContext.recordEndToEndLatency(error);
throw error;
}
}
Expand All @@ -121,8 +140,16 @@ ApiFuture<AggregateQuerySnapshot> get(
getTraceUtil()
.startSpan(
transactionId == null
? TraceUtil.SPAN_NAME_AGGREGATION_QUERY_GET
: TraceUtil.SPAN_NAME_TRANSACTION_GET_AGGREGATION_QUERY);
? TelemetryConstants.METHOD_NAME_AGGREGATION_QUERY_GET
: TelemetryConstants.METHOD_NAME_TRANSACTION_GET_AGGREGATION_QUERY);

MetricsContext metricsContext =
getMetricsUtil()
.createMetricsContext(
transactionId == null
? TelemetryConstants.METHOD_NAME_AGGREGATION_QUERY_GET
: TelemetryConstants.METHOD_NAME_TRANSACTION_GET_AGGREGATION_QUERY);

try (Scope ignored = span.makeCurrent()) {
AggregateQueryResponseDeliverer responseDeliverer =
new AggregateQueryResponseDeliverer(
Expand All @@ -132,9 +159,11 @@ ApiFuture<AggregateQuerySnapshot> get(
runQuery(responseDeliverer, /* attempt= */ 0);
ApiFuture<AggregateQuerySnapshot> result = responseDeliverer.getFuture();
span.endAtFuture(result);
metricsContext.recordEndToEndLatencyAtFuture(result);
return result;
} catch (Exception error) {
span.end(error);
metricsContext.recordEndToEndLatency(error);
throw error;
}
}
Expand Down Expand Up @@ -302,15 +331,15 @@ private boolean isExplainQuery() {
public void onStart(StreamController streamController) {
getTraceUtil()
.currentSpan()
.addEvent(SPAN_NAME_RUN_AGGREGATION_QUERY + " Stream started.", getAttemptAttributes());
.addEvent(METHOD_NAME_RUN_AGGREGATION_QUERY + " Stream started.", getAttemptAttributes());
}

@Override
public void onResponse(RunAggregationQueryResponse response) {
getTraceUtil()
.currentSpan()
.addEvent(
SPAN_NAME_RUN_AGGREGATION_QUERY + " Response Received.", getAttemptAttributes());
METHOD_NAME_RUN_AGGREGATION_QUERY + " Response Received.", getAttemptAttributes());
if (response.hasReadTime()) {
readTime = Timestamp.fromProto(response.getReadTime());
}
Expand Down Expand Up @@ -339,15 +368,15 @@ public void onError(Throwable throwable) {
getTraceUtil()
.currentSpan()
.addEvent(
SPAN_NAME_RUN_AGGREGATION_QUERY + ": Retryable Error",
METHOD_NAME_RUN_AGGREGATION_QUERY + ": Retryable Error",
Collections.singletonMap("error.message", throwable.getMessage()));

runQuery(responseDeliverer, attempt + 1);
} else {
getTraceUtil()
.currentSpan()
.addEvent(
SPAN_NAME_RUN_AGGREGATION_QUERY + ": Error",
METHOD_NAME_RUN_AGGREGATION_QUERY + ": Error",
Collections.singletonMap("error.message", throwable.getMessage()));
responseDeliverer.deliverError(throwable);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
import com.google.api.core.SettableApiFuture;
import com.google.api.gax.rpc.ApiException;
import com.google.api.gax.rpc.StatusCode.Code;
import com.google.cloud.firestore.telemetry.MetricsUtil.MetricsContext;
import com.google.cloud.firestore.telemetry.TelemetryConstants;
import com.google.cloud.firestore.telemetry.TraceUtil;
import com.google.cloud.firestore.telemetry.TraceUtil.Context;
import com.google.cloud.firestore.telemetry.TraceUtil.Scope;
Expand Down Expand Up @@ -912,8 +914,15 @@ private void sendBatchLocked(final BulkCommitBatch batch, final boolean flush) {
firestore
.getOptions()
.getTraceUtil()
.startSpan(TraceUtil.SPAN_NAME_BULK_WRITER_COMMIT, traceContext)
.startSpan(TelemetryConstants.METHOD_NAME_BULK_WRITER_COMMIT, traceContext)
.setAttribute(ATTRIBUTE_KEY_DOC_COUNT, batch.getMutationsSize());

MetricsContext metricsContext =
firestore
.getOptions()
.getMetricsUtil()
.createMetricsContext(TelemetryConstants.METHOD_NAME_BULK_WRITER_COMMIT);

try (Scope ignored = span.makeCurrent()) {
ApiFuture<Void> result = batch.bulkCommit();
result.addListener(
Expand All @@ -926,8 +935,11 @@ private void sendBatchLocked(final BulkCommitBatch batch, final boolean flush) {
},
bulkWriterExecutor);
span.endAtFuture(result);
metricsContext.recordEndToEndLatencyAtFuture(result);

} catch (Exception error) {
span.end(error);
metricsContext.recordEndToEndLatency(error);
throw error;
}
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
import com.google.api.gax.rpc.ApiException;
import com.google.api.gax.rpc.ApiExceptions;
import com.google.api.gax.rpc.ApiStreamObserver;
import com.google.cloud.firestore.telemetry.MetricsUtil.MetricsContext;
import com.google.cloud.firestore.telemetry.TelemetryConstants;
import com.google.cloud.firestore.telemetry.TraceUtil;
import com.google.cloud.firestore.telemetry.TraceUtil.Scope;
import com.google.cloud.firestore.v1.FirestoreClient.PartitionQueryPagedResponse;
Expand Down Expand Up @@ -109,7 +111,15 @@ public ApiFuture<List<QueryPartition>> getPartitions(long desiredPartitionCount)
.getFirestore()
.getOptions()
.getTraceUtil()
.startSpan(TraceUtil.SPAN_NAME_PARTITION_QUERY);
.startSpan(TelemetryConstants.METHOD_NAME_PARTITION_QUERY);

MetricsContext metricsContext =
rpcContext
.getFirestore()
.getOptions()
.getMetricsUtil()
.createMetricsContext(TelemetryConstants.METHOD_NAME_PARTITION_QUERY);

try (Scope ignored = span.makeCurrent()) {
ApiFuture<List<QueryPartition>> result =
ApiFutures.transform(
Expand All @@ -127,12 +137,18 @@ public ApiFuture<List<QueryPartition>> getPartitions(long desiredPartitionCount)
},
MoreExecutors.directExecutor());
span.endAtFuture(result);
metricsContext.recordEndToEndLatencyAtFuture(result);

return result;
} catch (ApiException exception) {
span.end(exception);
metricsContext.recordEndToEndLatency(exception);

throw FirestoreException.forApiException(exception);
} catch (Throwable throwable) {
span.end(throwable);
metricsContext.recordEndToEndLatency(throwable);

throw throwable;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
import com.google.api.gax.rpc.UnaryCallable;
import com.google.cloud.firestore.encoding.CustomClassMapper;
import com.google.cloud.firestore.spi.v1.FirestoreRpc;
import com.google.cloud.firestore.telemetry.MetricsUtil.MetricsContext;
import com.google.cloud.firestore.telemetry.TelemetryConstants;
import com.google.cloud.firestore.telemetry.TraceUtil;
import com.google.cloud.firestore.telemetry.TraceUtil.Scope;
import com.google.cloud.firestore.v1.FirestoreClient.ListDocumentsPagedResponse;
Expand Down Expand Up @@ -134,7 +136,15 @@ public Iterable<DocumentReference> listDocuments() {
.getFirestore()
.getOptions()
.getTraceUtil()
.startSpan(TraceUtil.SPAN_NAME_COL_REF_LIST_DOCUMENTS);
.startSpan(TelemetryConstants.METHOD_NAME_COL_REF_LIST_DOCUMENTS);

MetricsContext metricsContext =
rpcContext
.getFirestore()
.getOptions()
.getMetricsUtil()
.createMetricsContext(TelemetryConstants.METHOD_NAME_COL_REF_LIST_DOCUMENTS);

try (Scope ignored = span.makeCurrent()) {
ListDocumentsRequest.Builder request = ListDocumentsRequest.newBuilder();
request.setParent(options.getParentPath().toString());
Expand Down Expand Up @@ -174,12 +184,18 @@ public void remove() {
}
};
span.end();
metricsContext.recordEndToEndLatency();

return result;
} catch (ApiException exception) {
span.end(exception);
metricsContext.recordEndToEndLatency(exception);

throw FirestoreException.forApiException(exception);
} catch (Throwable throwable) {
span.end(throwable);
metricsContext.recordEndToEndLatency(throwable);

throw throwable;
}
}
Expand All @@ -200,17 +216,28 @@ public ApiFuture<DocumentReference> add(@Nonnull final Map<String, Object> field
.getFirestore()
.getOptions()
.getTraceUtil()
.startSpan(TraceUtil.SPAN_NAME_COL_REF_ADD);
.startSpan(TelemetryConstants.METHOD_NAME_COL_REF_ADD);

MetricsContext metricsContext =
rpcContext
.getFirestore()
.getOptions()
.getMetricsUtil()
.createMetricsContext(TelemetryConstants.METHOD_NAME_COL_REF_ADD);

try (Scope ignored = span.makeCurrent()) {
final DocumentReference documentReference = document();
ApiFuture<WriteResult> createFuture = documentReference.create(fields);
ApiFuture<DocumentReference> result =
ApiFutures.transform(
createFuture, writeResult -> documentReference, MoreExecutors.directExecutor());
span.endAtFuture(result);
metricsContext.recordEndToEndLatencyAtFuture(result);

return result;
} catch (Exception error) {
span.end(error);
metricsContext.recordEndToEndLatency(error);
throw error;
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* Copyright 2024 Google LLC
*
* 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.cloud.firestore;

import com.google.api.gax.tracing.ApiTracer;
import com.google.api.gax.tracing.ApiTracerFactory;
import com.google.api.gax.tracing.BaseApiTracerFactory;
import com.google.api.gax.tracing.SpanName;
import com.google.common.collect.ImmutableList;
import java.util.ArrayList;
import java.util.List;

class CompositeApiTracerFactory extends BaseApiTracerFactory {

private final List<ApiTracerFactory> apiTracerFactories;

public CompositeApiTracerFactory(List<ApiTracerFactory> apiTracerFactories) {
this.apiTracerFactories = ImmutableList.copyOf(apiTracerFactories);
}

@Override
public ApiTracer newTracer(ApiTracer parent, SpanName spanName, OperationType operationType) {
List<ApiTracer> children = new ArrayList<>(apiTracerFactories.size());

for (ApiTracerFactory factory : apiTracerFactories) {
children.add(factory.newTracer(parent, spanName, operationType));
}
return new CompositeTracer(children);
}
}
Loading
Loading