Skip to content
This repository was archived by the owner on May 8, 2026. It is now read-only.

Commit bc4e1cf

Browse files
committed
feat(bigtable): backfill gfe latency with headersout-headersout latency
1 parent 77952d2 commit bc4e1cf

5 files changed

Lines changed: 74 additions & 0 deletions

File tree

google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/BigtableGrpcStreamTracer.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,16 @@ public void outboundMessageSent(int seqNo, long optionalWireSize, long optionalU
3636
tracer.grpcMessageSent();
3737
}
3838

39+
@Override
40+
public void outboundHeaders() {
41+
tracer.grpcHeadersSent();
42+
}
43+
44+
@Override
45+
public void inboundHeaders() {
46+
tracer.grpcHeadersReceived();
47+
}
48+
3949
static class Factory extends ClientStreamTracer.Factory {
4050

4151
private final BigtableTracer tracer;

google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/BuiltinMetricsTracer.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ class BuiltinMetricsTracer extends BigtableTracer {
8282
private final AtomicLong totalClientBlockingTime = new AtomicLong(0);
8383

8484
private final AtomicLong grpcMessageSentDelay = new AtomicLong(0);
85+
private final AtomicLong grpcHeadersSentNanos = new AtomicLong(0);
86+
private final AtomicLong grpcHeadersOutHeaderInLatency = new AtomicLong(0);
8587

8688
private Deadline operationDeadline = null;
8789
private volatile Duration remainingDeadlineAtAttemptStart = Duration.ZERO;
@@ -263,6 +265,18 @@ public void grpcMessageSent() {
263265
grpcMessageSentDelay.set(attemptTimer.elapsed(TimeUnit.NANOSECONDS));
264266
}
265267

268+
@Override
269+
public void grpcHeadersSent() {
270+
grpcHeadersSentNanos.set(attemptTimer.elapsed(TimeUnit.NANOSECONDS));
271+
}
272+
273+
@Override
274+
public void grpcHeadersReceived() {
275+
long receivedNanos = attemptTimer.elapsed(TimeUnit.NANOSECONDS);
276+
long sentNanos = grpcHeadersSentNanos.get();
277+
grpcHeadersOutHeaderInLatency.set(receivedNanos - sentNanos);
278+
}
279+
266280
@Override
267281
public void setTotalTimeoutDuration(java.time.Duration totalTimeoutDuration) {
268282
// This method is called by BigtableTracerStreamingCallable and
@@ -395,6 +409,18 @@ private void recordAttemptCompletion(@Nullable Throwable throwable) {
395409
sidebandData.getClusterInfo(),
396410
code,
397411
sidebandData.getGfeTiming());
412+
} else {
413+
// Fallback to header latency if GFE timing is not available
414+
long fallbackLatencyNanos = grpcHeadersOutHeaderInLatency.get();
415+
if (fallbackLatencyNanos > 0) {
416+
recorder.serverLatency.record(
417+
clientInfo,
418+
tableId,
419+
methodInfo,
420+
sidebandData.getClusterInfo(),
421+
code,
422+
Duration.ofNanos(fallbackLatencyNanos));
423+
}
398424
}
399425

400426
boolean seenServer =

google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/CompositeTracer.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,20 @@ public void grpcMessageSent() {
241241
}
242242
}
243243

244+
@Override
245+
public void grpcHeadersSent() {
246+
for (BigtableTracer tracer : bigtableTracers) {
247+
tracer.grpcHeadersSent();
248+
}
249+
}
250+
251+
@Override
252+
public void grpcHeadersReceived() {
253+
for (BigtableTracer tracer : bigtableTracers) {
254+
tracer.grpcHeadersReceived();
255+
}
256+
}
257+
244258
@Override
245259
public void setTotalTimeoutDuration(java.time.Duration totalTimeoutDuration) {
246260
for (BigtableTracer tracer : bigtableTracers) {

google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableTracer.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,16 @@ public void grpcMessageSent() {
8989
// noop
9090
}
9191

92+
/** Called when the header is sent on a grpc channel. */
93+
public void grpcHeadersSent() {
94+
// noop
95+
}
96+
97+
/** Called when the header is received on a grpc channel. */
98+
public void grpcHeadersReceived() {
99+
// noop
100+
}
101+
92102
/**
93103
* Record the operation timeout from user settings for calculating remaining deadline. Currently,
94104
* it's called in BuiltinMetricsTracer on attempt start from {@link BigtableTracerUnaryCallable}

google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/CompositeTracerTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,4 +271,18 @@ public void testGrpcMessageSent() {
271271
verify(child3, times(1)).grpcMessageSent();
272272
verify(child4, times(1)).grpcMessageSent();
273273
}
274+
275+
@Test
276+
public void testGrpcHeadersSent() {
277+
compositeTracer.grpcHeadersSent();
278+
verify(child3, times(1)).grpcHeadersSent();
279+
verify(child4, times(1)).grpcHeadersSent();
280+
}
281+
282+
@Test
283+
public void testGrpcHeadersReceived() {
284+
compositeTracer.grpcHeadersReceived();
285+
verify(child3, times(1)).grpcHeadersReceived();
286+
verify(child4, times(1)).grpcHeadersReceived();
287+
}
274288
}

0 commit comments

Comments
 (0)