diff --git a/google-cloud-bigtable/pom.xml b/google-cloud-bigtable/pom.xml
index 30d61cdc6a..bd4c6f0b63 100644
--- a/google-cloud-bigtable/pom.xml
+++ b/google-cloud-bigtable/pom.xml
@@ -136,10 +136,6 @@
com.google.protobuf
protobuf-java-util
-
- com.google.code.gson
- gson
-
io.opencensus
opencensus-api
@@ -147,7 +143,6 @@
io.grpc
grpc-alts
- runtime
org.checkerframework
diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubSettings.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubSettings.java
index d1fe259ea1..6a9dcdfbec 100644
--- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubSettings.java
+++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubSettings.java
@@ -922,7 +922,8 @@ private Builder() {
.setReverseScans(true)
.setLastScannedRowResponses(true)
.setDirectAccessRequested(DIRECT_PATH_ENABLED)
- .setTrafficDirectorEnabled(DIRECT_PATH_ENABLED);
+ .setTrafficDirectorEnabled(DIRECT_PATH_ENABLED)
+ .setPeerInfo(true);
}
private Builder(EnhancedBigtableStubSettings settings) {
diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/MetadataExtractorInterceptor.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/MetadataExtractorInterceptor.java
new file mode 100644
index 0000000000..5b43f57527
--- /dev/null
+++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/MetadataExtractorInterceptor.java
@@ -0,0 +1,198 @@
+/*
+ * Copyright 2026 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
+ *
+ * https://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.bigtable.data.v2.stub;
+
+import com.google.api.core.InternalApi;
+import com.google.api.gax.grpc.GrpcCallContext;
+import com.google.bigtable.v2.PeerInfo;
+import com.google.bigtable.v2.ResponseParams;
+import com.google.common.base.Strings;
+import com.google.protobuf.InvalidProtocolBufferException;
+import io.grpc.Attributes;
+import io.grpc.CallOptions;
+import io.grpc.Channel;
+import io.grpc.ClientCall;
+import io.grpc.ClientInterceptor;
+import io.grpc.ClientInterceptors;
+import io.grpc.ForwardingClientCall;
+import io.grpc.ForwardingClientCallListener;
+import io.grpc.Metadata;
+import io.grpc.MethodDescriptor;
+import io.grpc.Status;
+import io.grpc.alts.AltsContextUtil;
+import java.util.Base64;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.annotation.Nullable;
+
+@InternalApi
+public class MetadataExtractorInterceptor implements ClientInterceptor {
+ private final SidebandData sidebandData = new SidebandData();
+
+ public GrpcCallContext injectInto(GrpcCallContext ctx) {
+ // TODO: migrate to using .withTransportChannel
+ // This will require a change on gax's side to expose the underlying ManagedChannel in
+ // GrpcTransportChannel (its currently package private).
+ return ctx.withChannel(ClientInterceptors.intercept(ctx.getChannel(), this))
+ .withCallOptions(ctx.getCallOptions().withOption(SidebandData.KEY, sidebandData));
+ }
+
+ @Override
+ public ClientCall interceptCall(
+ MethodDescriptor methodDescriptor, CallOptions callOptions, Channel channel) {
+ return new ForwardingClientCall.SimpleForwardingClientCall(
+ channel.newCall(methodDescriptor, callOptions)) {
+ @Override
+ public void start(Listener responseListener, Metadata headers) {
+ sidebandData.reset();
+
+ super.start(
+ new ForwardingClientCallListener.SimpleForwardingClientCallListener(
+ responseListener) {
+ @Override
+ public void onHeaders(Metadata headers) {
+ sidebandData.onResponseHeaders(headers, getAttributes());
+ super.onHeaders(headers);
+ }
+
+ @Override
+ public void onClose(Status status, Metadata trailers) {
+ sidebandData.onClose(status, trailers);
+ super.onClose(status, trailers);
+ }
+ },
+ headers);
+ }
+ };
+ }
+
+ public SidebandData getSidebandData() {
+ return sidebandData;
+ }
+
+ public static class SidebandData {
+ private static final CallOptions.Key KEY =
+ CallOptions.Key.create("bigtable-sideband");
+
+ private static final Metadata.Key SERVER_TIMING_HEADER_KEY =
+ Metadata.Key.of("server-timing", Metadata.ASCII_STRING_MARSHALLER);
+ private static final Pattern SERVER_TIMING_HEADER_PATTERN =
+ Pattern.compile(".*dur=(?\\d+)");
+ private static final Metadata.Key LOCATION_METADATA_KEY =
+ Metadata.Key.of("x-goog-ext-425905942-bin", Metadata.BINARY_BYTE_MARSHALLER);
+ private static final Metadata.Key PEER_INFO_KEY =
+ Metadata.Key.of("bigtable-peer-info", Metadata.ASCII_STRING_MARSHALLER);
+
+ @Nullable private volatile ResponseParams responseParams;
+ @Nullable private volatile PeerInfo peerInfo;
+ @Nullable private volatile Long gfeTiming;
+
+ @Nullable
+ public ResponseParams getResponseParams() {
+ return responseParams;
+ }
+
+ @Nullable
+ public PeerInfo getPeerInfo() {
+ return peerInfo;
+ }
+
+ @Nullable
+ public Long getGfeTiming() {
+ return gfeTiming;
+ }
+
+ private void reset() {
+ responseParams = null;
+ peerInfo = null;
+ gfeTiming = null;
+ }
+
+ void onResponseHeaders(Metadata md, Attributes attributes) {
+ responseParams = extractResponseParams(md);
+ gfeTiming = extractGfeLatency(md);
+ peerInfo = extractPeerInfo(md, gfeTiming, attributes);
+ }
+
+ void onClose(Status status, Metadata trailers) {
+ if (responseParams == null) {
+ responseParams = extractResponseParams(trailers);
+ }
+ }
+
+ @Nullable
+ private static Long extractGfeLatency(Metadata metadata) {
+ String serverTiming = metadata.get(SERVER_TIMING_HEADER_KEY);
+ if (serverTiming == null) {
+ return null;
+ }
+ Matcher matcher = SERVER_TIMING_HEADER_PATTERN.matcher(serverTiming);
+ // this should always be true
+ if (matcher.find()) {
+ return Long.parseLong(matcher.group("dur"));
+ }
+ return null;
+ }
+
+ @Nullable
+ private static PeerInfo extractPeerInfo(
+ Metadata metadata, Long gfeTiming, Attributes attributes) {
+ String encodedStr = metadata.get(PEER_INFO_KEY);
+ if (Strings.isNullOrEmpty(encodedStr)) {
+ return null;
+ }
+
+ try {
+ byte[] decoded = Base64.getUrlDecoder().decode(encodedStr);
+ PeerInfo peerInfo = PeerInfo.parseFrom(decoded);
+ PeerInfo.TransportType effectiveTransport = peerInfo.getTransportType();
+
+ // TODO: remove this once transport_type is being sent by the server
+ // This is a temporary workaround to detect directpath until its available from the server
+ if (effectiveTransport == PeerInfo.TransportType.TRANSPORT_TYPE_UNKNOWN) {
+ boolean isAlts = AltsContextUtil.check(attributes);
+ if (isAlts) {
+ effectiveTransport = PeerInfo.TransportType.TRANSPORT_TYPE_DIRECT_ACCESS;
+ } else if (gfeTiming != null) {
+ effectiveTransport = PeerInfo.TransportType.TRANSPORT_TYPE_CLOUD_PATH;
+ }
+ }
+ if (effectiveTransport != PeerInfo.TransportType.TRANSPORT_TYPE_UNKNOWN) {
+ peerInfo = peerInfo.toBuilder().setTransportType(effectiveTransport).build();
+ }
+ return peerInfo;
+ } catch (Exception e) {
+ throw new IllegalArgumentException(
+ "Failed to parse "
+ + PEER_INFO_KEY.name()
+ + " from the response header value: "
+ + encodedStr);
+ }
+ }
+
+ @Nullable
+ private static ResponseParams extractResponseParams(Metadata metadata) {
+ byte[] responseParams = metadata.get(LOCATION_METADATA_KEY);
+ if (responseParams != null) {
+ try {
+ return ResponseParams.parseFrom(responseParams);
+ } catch (InvalidProtocolBufferException e) {
+ }
+ }
+ return null;
+ }
+ }
+}
diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableGrpcStreamTracer.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableGrpcStreamTracer.java
index a364adbc46..9b220c1de3 100644
--- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableGrpcStreamTracer.java
+++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableGrpcStreamTracer.java
@@ -15,10 +15,8 @@
*/
package com.google.cloud.bigtable.data.v2.stub.metrics;
-import com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsTracer.TransportAttrs;
import io.grpc.ClientStreamTracer;
import io.grpc.Metadata;
-import io.grpc.Status;
/**
* Records the time a request is enqueued in a grpc channel queue. This a bridge between gRPC stream
@@ -26,16 +24,9 @@
* asking gRPC to start an RPC and gRPC actually serializing that RPC.
*/
class BigtableGrpcStreamTracer extends ClientStreamTracer {
- private static final String GRPC_LB_LOCALITY_KEY = "grpc.lb.locality";
- private static final String GRPC_LB_BACKEND_SERVICE_KEY = "grpc.lb.backend_service";
-
- private final StreamInfo info;
private final BigtableTracer tracer;
- private volatile String backendService = null;
- private volatile String locality = null;
- public BigtableGrpcStreamTracer(StreamInfo info, BigtableTracer tracer) {
- this.info = info;
+ public BigtableGrpcStreamTracer(BigtableTracer tracer) {
this.tracer = tracer;
}
@@ -44,26 +35,6 @@ public void outboundMessageSent(int seqNo, long optionalWireSize, long optionalU
tracer.grpcMessageSent();
}
- @Override
- public void addOptionalLabel(String key, String value) {
- switch (key) {
- case GRPC_LB_LOCALITY_KEY:
- this.locality = value;
- break;
- case GRPC_LB_BACKEND_SERVICE_KEY:
- this.backendService = value;
- break;
- }
-
- super.addOptionalLabel(key, value);
- }
-
- @Override
- public void streamClosed(Status status) {
- tracer.setTransportAttrs(TransportAttrs.create(locality, backendService));
- super.streamClosed(status);
- }
-
static class Factory extends ClientStreamTracer.Factory {
private final BigtableTracer tracer;
@@ -75,7 +46,7 @@ static class Factory extends ClientStreamTracer.Factory {
@Override
public ClientStreamTracer newClientStreamTracer(
ClientStreamTracer.StreamInfo info, Metadata headers) {
- return new BigtableGrpcStreamTracer(info, tracer);
+ return new BigtableGrpcStreamTracer(tracer);
}
}
}
diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableTracer.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableTracer.java
index 898d743cd9..a1a53b6089 100644
--- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableTracer.java
+++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableTracer.java
@@ -20,6 +20,7 @@
import com.google.api.gax.rpc.ApiCallContext;
import com.google.api.gax.tracing.ApiTracer;
import com.google.api.gax.tracing.BaseApiTracer;
+import com.google.cloud.bigtable.data.v2.stub.MetadataExtractorInterceptor;
import java.time.Duration;
import javax.annotation.Nullable;
@@ -70,36 +71,12 @@ public int getAttempt() {
return attempt;
}
- /**
- * Record the latency between Google's network receives the RPC and reads back the first byte of
- * the response from server-timing header. If server-timing header is missing, increment the
- * missing header count.
- */
- public void recordGfeMetadata(@Nullable Long latency, @Nullable Throwable throwable) {
- // noop
- }
-
/** Adds an annotation of the total throttled time of a batch. */
public void batchRequestThrottled(long throttledTimeMs) {
// noop
}
- /**
- * Set the Bigtable zone and cluster so metrics can be tagged with location information. This will
- * be called in BuiltinMetricsTracer.
- */
- public void setLocations(String zone, String cluster) {
- // noop
- }
-
- /** Set the underlying transport used to process the attempt */
- public void setTransportAttrs(BuiltinMetricsTracer.TransportAttrs attrs) {}
-
- @Deprecated
- /**
- * @deprecated {@link #grpcMessageSent()} is called instead.
- */
- public void grpcChannelQueuedLatencies(long queuedTimeMs) {
+ public void setSidebandData(MetadataExtractorInterceptor.SidebandData sidebandData) {
// noop
}
diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableTracerStreamingCallable.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableTracerStreamingCallable.java
index 13b832b8b1..3cdcdc374e 100644
--- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableTracerStreamingCallable.java
+++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableTracerStreamingCallable.java
@@ -16,11 +16,12 @@
package com.google.cloud.bigtable.data.v2.stub.metrics;
import com.google.api.core.InternalApi;
-import com.google.api.gax.grpc.GrpcResponseMetadata;
+import com.google.api.gax.grpc.GrpcCallContext;
import com.google.api.gax.rpc.ApiCallContext;
import com.google.api.gax.rpc.ResponseObserver;
import com.google.api.gax.rpc.ServerStreamingCallable;
import com.google.api.gax.rpc.StreamController;
+import com.google.cloud.bigtable.data.v2.stub.MetadataExtractorInterceptor;
import com.google.cloud.bigtable.data.v2.stub.SafeResponseObserver;
import com.google.common.base.Preconditions;
import com.google.common.base.Stopwatch;
@@ -28,19 +29,8 @@
import javax.annotation.Nonnull;
/**
- * This callable will
- * -Inject a {@link GrpcResponseMetadata} to access the headers returned by gRPC methods upon
- * completion. The {@link BigtableTracer} will process metrics that were injected in the
- * header/trailer and publish them to OpenCensus. If {@link GrpcResponseMetadata#getMetadata()}
- * returned null, it probably means that the request has never reached GFE, and it'll increment
- * the gfe_header_missing_counter in this case.
- * -This class will also access trailers from {@link GrpcResponseMetadata} to record zone and
- * cluster ids.
- * -Call {@link BigtableTracer#onRequest(int)} to record the request events in a stream.
- * -This class will also inject a {@link BigtableGrpcStreamTracer} that'll record the time an
- * RPC spent in a grpc channel queue.
- * This class is considered an internal implementation detail and not meant to be used by
- * applications.
+ * This class is considered an internal implementation detail and not meant to be used by
+ * applications.
*/
@InternalApi
public class BigtableTracerStreamingCallable
@@ -56,40 +46,41 @@ public BigtableTracerStreamingCallable(
@Override
public void call(
RequestT request, ResponseObserver responseObserver, ApiCallContext context) {
- final GrpcResponseMetadata responseMetadata = new GrpcResponseMetadata();
+ GrpcCallContext grpcCtx = (GrpcCallContext) context;
+
+ MetadataExtractorInterceptor metadataExtractor = new MetadataExtractorInterceptor();
+ grpcCtx = metadataExtractor.injectInto(grpcCtx);
+
// tracer should always be an instance of bigtable tracer
if (context.getTracer() instanceof BigtableTracer) {
BigtableTracer tracer = (BigtableTracer) context.getTracer();
+ tracer.setSidebandData(metadataExtractor.getSidebandData());
+ grpcCtx =
+ grpcCtx.withCallOptions(
+ grpcCtx
+ .getCallOptions()
+ .withStreamTracerFactory(new BigtableGrpcStreamTracer.Factory(tracer)));
+
BigtableTracerResponseObserver innerObserver =
- new BigtableTracerResponseObserver<>(responseObserver, tracer, responseMetadata);
+ new BigtableTracerResponseObserver<>(responseObserver, tracer);
if (context.getRetrySettings() != null) {
tracer.setTotalTimeoutDuration(context.getRetrySettings().getTotalTimeoutDuration());
}
- innerCallable.call(
- request,
- innerObserver,
- Util.injectBigtableStreamTracer(
- context, responseMetadata, (BigtableTracer) context.getTracer()));
+ innerCallable.call(request, innerObserver, grpcCtx);
} else {
- innerCallable.call(request, responseObserver, context);
+ innerCallable.call(request, responseObserver, grpcCtx);
}
}
private class BigtableTracerResponseObserver extends SafeResponseObserver {
-
private final BigtableTracer tracer;
private final ResponseObserver outerObserver;
- private final GrpcResponseMetadata responseMetadata;
- BigtableTracerResponseObserver(
- ResponseObserver observer,
- BigtableTracer tracer,
- GrpcResponseMetadata metadata) {
+ BigtableTracerResponseObserver(ResponseObserver observer, BigtableTracer tracer) {
super(observer);
this.tracer = tracer;
this.outerObserver = observer;
- this.responseMetadata = metadata;
}
@Override
@@ -107,13 +98,11 @@ protected void onResponseImpl(ResponseT response) {
@Override
protected void onErrorImpl(Throwable t) {
- Util.recordMetricsFromMetadata(responseMetadata, tracer, t);
outerObserver.onError(t);
}
@Override
protected void onCompleteImpl() {
- Util.recordMetricsFromMetadata(responseMetadata, tracer, null);
outerObserver.onComplete();
}
}
diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableTracerUnaryCallable.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableTracerUnaryCallable.java
index 37ba74bfdb..363a69af3d 100644
--- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableTracerUnaryCallable.java
+++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableTracerUnaryCallable.java
@@ -16,29 +16,17 @@
package com.google.cloud.bigtable.data.v2.stub.metrics;
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.api.gax.grpc.GrpcResponseMetadata;
+import com.google.api.gax.grpc.GrpcCallContext;
import com.google.api.gax.rpc.ApiCallContext;
import com.google.api.gax.rpc.UnaryCallable;
+import com.google.cloud.bigtable.data.v2.stub.MetadataExtractorInterceptor;
import com.google.common.base.Preconditions;
-import com.google.common.util.concurrent.MoreExecutors;
import javax.annotation.Nonnull;
/**
- * This callable will:
- * - Inject a {@link GrpcResponseMetadata} to access the headers returned by gRPC methods upon
- * completion. The {@link BigtableTracer} will process metrics that were injected in the
- * header/trailer and publish them to OpenCensus. If {@link GrpcResponseMetadata#getMetadata()}
- * returned null, it probably means that the request has never reached GFE, and it'll increment
- * the gfe_header_missing_counter in this case.
- * -This class will also access trailers from {@link GrpcResponseMetadata} to record zone and
- * cluster ids.
- * -This class will also inject a {@link BigtableGrpcStreamTracer} that'll record the time an
- * RPC spent in a grpc channel queue.
- * This class is considered an internal implementation detail and not meant to be used by
- * applications.
+ * This class is considered an internal implementation detail and not meant to be used by
+ * applications.
*/
@InternalApi
public class BigtableTracerUnaryCallable
@@ -52,46 +40,24 @@ public BigtableTracerUnaryCallable(@Nonnull UnaryCallable i
@Override
public ApiFuture futureCall(RequestT request, ApiCallContext context) {
+ MetadataExtractorInterceptor interceptor = new MetadataExtractorInterceptor();
+ GrpcCallContext grpcCtx = interceptor.injectInto((GrpcCallContext) context);
+
// tracer should always be an instance of BigtableTracer
if (context.getTracer() instanceof BigtableTracer) {
BigtableTracer tracer = (BigtableTracer) context.getTracer();
- final GrpcResponseMetadata responseMetadata = new GrpcResponseMetadata();
- BigtableTracerUnaryCallback callback =
- new BigtableTracerUnaryCallback(
- (BigtableTracer) context.getTracer(), responseMetadata);
+ tracer.setSidebandData(interceptor.getSidebandData());
+
+ grpcCtx =
+ grpcCtx.withCallOptions(
+ grpcCtx
+ .getCallOptions()
+ .withStreamTracerFactory(new BigtableGrpcStreamTracer.Factory(tracer)));
+
if (context.getRetrySettings() != null) {
tracer.setTotalTimeoutDuration(context.getRetrySettings().getTotalTimeoutDuration());
}
- ApiFuture future =
- innerCallable.futureCall(
- request,
- Util.injectBigtableStreamTracer(
- context, responseMetadata, (BigtableTracer) context.getTracer()));
- ApiFutures.addCallback(future, callback, MoreExecutors.directExecutor());
- return future;
- } else {
- return innerCallable.futureCall(request, context);
- }
- }
-
- private class BigtableTracerUnaryCallback implements ApiFutureCallback {
-
- private final BigtableTracer tracer;
- private final GrpcResponseMetadata responseMetadata;
-
- BigtableTracerUnaryCallback(BigtableTracer tracer, GrpcResponseMetadata responseMetadata) {
- this.tracer = tracer;
- this.responseMetadata = responseMetadata;
- }
-
- @Override
- public void onFailure(Throwable throwable) {
- Util.recordMetricsFromMetadata(responseMetadata, tracer, throwable);
- }
-
- @Override
- public void onSuccess(ResponseT response) {
- Util.recordMetricsFromMetadata(responseMetadata, tracer, null);
}
+ return innerCallable.futureCall(request, grpcCtx);
}
}
diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsTracer.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsTracer.java
index e6ebad367a..546ea41c9f 100644
--- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsTracer.java
+++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsTracer.java
@@ -34,27 +34,23 @@
import com.google.api.core.ObsoleteApi;
import com.google.api.gax.retrying.ServerStreamingAttemptException;
import com.google.api.gax.tracing.SpanName;
-import com.google.auto.value.AutoValue;
+import com.google.bigtable.v2.PeerInfo;
import com.google.cloud.bigtable.Version;
+import com.google.cloud.bigtable.data.v2.stub.MetadataExtractorInterceptor;
import com.google.common.base.Stopwatch;
-import com.google.common.base.Strings;
import com.google.common.math.IntMath;
-import com.google.gson.Gson;
-import com.google.gson.reflect.TypeToken;
import io.grpc.Deadline;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.metrics.DoubleGauge;
import io.opentelemetry.api.metrics.DoubleHistogram;
import io.opentelemetry.api.metrics.LongCounter;
import java.time.Duration;
-import java.util.Map;
+import java.util.Optional;
import java.util.concurrent.CancellationException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
-import java.util.logging.Level;
-import java.util.logging.Logger;
import javax.annotation.Nullable;
/**
@@ -62,24 +58,6 @@
* bigtable.googleapis.com/client namespace
*/
class BuiltinMetricsTracer extends BigtableTracer {
- @AutoValue
- abstract static class TransportAttrs {
- @Nullable
- abstract String getLocality();
-
- @Nullable
- abstract String getBackendService();
-
- static TransportAttrs create(@Nullable String locality, @Nullable String backendService) {
- return new AutoValue_BuiltinMetricsTracer_TransportAttrs(locality, backendService);
- }
- }
-
- private static final Logger logger = Logger.getLogger(BuiltinMetricsTracer.class.getName());
- private static final Gson GSON = new Gson();
- private static final TypeToken