diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/BigtableGrpcStreamTracer.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/BigtableGrpcStreamTracer.java index 99a184b5e3..5267b9ef24 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/BigtableGrpcStreamTracer.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/BigtableGrpcStreamTracer.java @@ -36,6 +36,16 @@ public void outboundMessageSent(int seqNo, long optionalWireSize, long optionalU tracer.grpcMessageSent(); } + @Override + public void outboundHeaders() { + tracer.grpcHeadersSent(); + } + + @Override + public void inboundHeaders() { + tracer.grpcHeadersReceived(); + } + static class Factory extends ClientStreamTracer.Factory { private final BigtableTracer tracer; diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/BuiltinMetricsTracer.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/BuiltinMetricsTracer.java index 305ec53315..504f960195 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/BuiltinMetricsTracer.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/BuiltinMetricsTracer.java @@ -87,6 +87,7 @@ class BuiltinMetricsTracer extends BigtableTracer { private volatile Duration remainingDeadlineAtAttemptStart = Duration.ZERO; private volatile MetadataExtractorInterceptor.SidebandData sidebandData = new SidebandData(); + private volatile Optional faket4t7 = Optional.empty(); BuiltinMetricsTracer( MetricRegistry.RecorderRegistry recorder, ClientInfo clientInfo, MethodInfo methodInfo) { @@ -263,6 +264,16 @@ public void grpcMessageSent() { grpcMessageSentDelay.set(attemptTimer.elapsed(TimeUnit.NANOSECONDS)); } + @Override + public void grpcHeadersSent() { + faket4t7 = Optional.of(Stopwatch.createStarted()); + } + + @Override + public void grpcHeadersReceived() { + faket4t7.ifPresent(Stopwatch::stop); + } + @Override public void setTotalTimeoutDuration(java.time.Duration totalTimeoutDuration) { // This method is called by BigtableTracerStreamingCallable and @@ -386,7 +397,8 @@ private void recordAttemptCompletion(@Nullable Throwable throwable) { code, Comparators.max(remainingDeadlineAtAttemptStart, Duration.ZERO)); } - + // if we don't have t4t7 latency from gfe, we use dur between initial metadata sent and initial + // metadata recv if (sidebandData.getGfeTiming() != null) { recorder.serverLatency.record( clientInfo, @@ -395,6 +407,16 @@ private void recordAttemptCompletion(@Nullable Throwable throwable) { sidebandData.getClusterInfo(), code, sidebandData.getGfeTiming()); + } else { + faket4t7.ifPresent( + stopwatch -> + recorder.serverLatency.record( + clientInfo, + tableId, + methodInfo, + sidebandData.getClusterInfo(), + code, + stopwatch.elapsed())); } boolean seenServer = diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/CompositeTracer.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/CompositeTracer.java index d9362acb48..eb17ec939a 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/CompositeTracer.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/CompositeTracer.java @@ -241,6 +241,20 @@ public void grpcMessageSent() { } } + @Override + public void grpcHeadersSent() { + for (BigtableTracer tracer : bigtableTracers) { + tracer.grpcHeadersSent(); + } + } + + @Override + public void grpcHeadersReceived() { + for (BigtableTracer tracer : bigtableTracers) { + tracer.grpcHeadersReceived(); + } + } + @Override public void setTotalTimeoutDuration(java.time.Duration totalTimeoutDuration) { for (BigtableTracer tracer : bigtableTracers) { 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 df27fbd842..48468eb518 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 @@ -89,6 +89,16 @@ public void grpcMessageSent() { // noop } + /** Called when the header is sent on a grpc channel. */ + public void grpcHeadersSent() { + // noop + } + + /** Called when the header is received on a grpc channel. */ + public void grpcHeadersReceived() { + // noop + } + /** * Record the operation timeout from user settings for calculating remaining deadline. Currently, * it's called in BuiltinMetricsTracer on attempt start from {@link BigtableTracerUnaryCallable} diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/CompositeTracerTest.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/CompositeTracerTest.java index c77f3e1e50..dd68618856 100644 --- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/CompositeTracerTest.java +++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/CompositeTracerTest.java @@ -271,4 +271,18 @@ public void testGrpcMessageSent() { verify(child3, times(1)).grpcMessageSent(); verify(child4, times(1)).grpcMessageSent(); } + + @Test + public void testGrpcHeadersSent() { + compositeTracer.grpcHeadersSent(); + verify(child3, times(1)).grpcHeadersSent(); + verify(child4, times(1)).grpcHeadersSent(); + } + + @Test + public void testGrpcHeadersReceived() { + compositeTracer.grpcHeadersReceived(); + verify(child3, times(1)).grpcHeadersReceived(); + verify(child4, times(1)).grpcHeadersReceived(); + } }