Skip to content

Commit 2aae68e

Browse files
authored
report uncompressed message size when it does not need compression (#11598)
1 parent 1ded8af commit 2aae68e

File tree

3 files changed

+21
-16
lines changed

3 files changed

+21
-16
lines changed

core/src/main/java/io/grpc/internal/MessageDeframer.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,8 @@ private void processBody() {
406406
// There is no reliable way to get the uncompressed size per message when it's compressed,
407407
// because the uncompressed bytes are provided through an InputStream whose total size is
408408
// unknown until all bytes are read, and we don't know when it happens.
409-
statsTraceCtx.inboundMessageRead(currentMessageSeqNo, inboundBodyWireSize, -1);
409+
statsTraceCtx.inboundMessageRead(currentMessageSeqNo, inboundBodyWireSize,
410+
(compressedFlag || fullStreamDecompressor != null) ? -1 : inboundBodyWireSize);
410411
inboundBodyWireSize = 0;
411412
InputStream stream = compressedFlag ? getCompressedBody() : getUncompressedBody();
412413
nextFrame.touch();

core/src/test/java/io/grpc/internal/MessageDeframerTest.java

+19-14
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ public void simplePayload() {
133133
assertEquals(Bytes.asList(new byte[]{3, 14}), bytes(producer.getValue().next()));
134134
verify(listener, atLeastOnce()).bytesRead(anyInt());
135135
verifyNoMoreInteractions(listener);
136-
checkStats(tracer, transportTracer.getStats(), fakeClock, 2, 2);
136+
checkStats(tracer, transportTracer.getStats(), fakeClock, useGzipInflatingBuffer, 2, 2);
137137
}
138138

139139
@Test
@@ -148,7 +148,7 @@ public void smallCombinedPayloads() {
148148
verify(listener, atLeastOnce()).bytesRead(anyInt());
149149
assertEquals(Bytes.asList(new byte[]{14, 15}), bytes(streams.get(1).next()));
150150
verifyNoMoreInteractions(listener);
151-
checkStats(tracer, transportTracer.getStats(), fakeClock, 1, 1, 2, 2);
151+
checkStats(tracer, transportTracer.getStats(), fakeClock, useGzipInflatingBuffer, 1, 1, 2, 2);
152152
}
153153

154154
@Test
@@ -162,7 +162,7 @@ public void endOfStreamWithPayloadShouldNotifyEndOfStream() {
162162
verify(listener).deframerClosed(false);
163163
verify(listener, atLeastOnce()).bytesRead(anyInt());
164164
verifyNoMoreInteractions(listener);
165-
checkStats(tracer, transportTracer.getStats(), fakeClock, 1, 1);
165+
checkStats(tracer, transportTracer.getStats(), fakeClock, useGzipInflatingBuffer, 1, 1);
166166
}
167167

168168
@Test
@@ -177,7 +177,7 @@ public void endOfStreamShouldNotifyEndOfStream() {
177177
}
178178
verify(listener).deframerClosed(false);
179179
verifyNoMoreInteractions(listener);
180-
checkStats(tracer, transportTracer.getStats(), fakeClock);
180+
checkStats(tracer, transportTracer.getStats(), fakeClock, false);
181181
}
182182

183183
@Test
@@ -189,7 +189,7 @@ public void endOfStreamWithPartialMessageShouldNotifyDeframerClosedWithPartialMe
189189
verify(listener, atLeastOnce()).bytesRead(anyInt());
190190
verify(listener).deframerClosed(true);
191191
verifyNoMoreInteractions(listener);
192-
checkStats(tracer, transportTracer.getStats(), fakeClock);
192+
checkStats(tracer, transportTracer.getStats(), fakeClock, false);
193193
}
194194

195195
@Test
@@ -206,7 +206,7 @@ public void endOfStreamWithInvalidGzipBlockShouldNotifyDeframerClosedWithPartial
206206
deframer.closeWhenComplete();
207207
verify(listener).deframerClosed(true);
208208
verifyNoMoreInteractions(listener);
209-
checkStats(tracer, transportTracer.getStats(), fakeClock);
209+
checkStats(tracer, transportTracer.getStats(), fakeClock, false);
210210
}
211211

212212
@Test
@@ -228,10 +228,11 @@ public void payloadSplitBetweenBuffers() {
228228
tracer,
229229
transportTracer.getStats(),
230230
fakeClock,
231+
true,
231232
7 /* msg size */ + 2 /* second buffer adds two bytes of overhead in deflate block */,
232233
7);
233234
} else {
234-
checkStats(tracer, transportTracer.getStats(), fakeClock, 7, 7);
235+
checkStats(tracer, transportTracer.getStats(), fakeClock, false, 7, 7);
235236
}
236237
}
237238

@@ -248,7 +249,7 @@ public void frameHeaderSplitBetweenBuffers() {
248249
assertEquals(Bytes.asList(new byte[]{3}), bytes(producer.getValue().next()));
249250
verify(listener, atLeastOnce()).bytesRead(anyInt());
250251
verifyNoMoreInteractions(listener);
251-
checkStats(tracer, transportTracer.getStats(), fakeClock, 1, 1);
252+
checkStats(tracer, transportTracer.getStats(), fakeClock, useGzipInflatingBuffer, 1, 1);
252253
}
253254

254255
@Test
@@ -259,7 +260,7 @@ public void emptyPayload() {
259260
assertEquals(Bytes.asList(), bytes(producer.getValue().next()));
260261
verify(listener, atLeastOnce()).bytesRead(anyInt());
261262
verifyNoMoreInteractions(listener);
262-
checkStats(tracer, transportTracer.getStats(), fakeClock, 0, 0);
263+
checkStats(tracer, transportTracer.getStats(), fakeClock, useGzipInflatingBuffer, 0, 0);
263264
}
264265

265266
@Test
@@ -273,9 +274,10 @@ public void largerFrameSize() {
273274
verify(listener, atLeastOnce()).bytesRead(anyInt());
274275
verifyNoMoreInteractions(listener);
275276
if (useGzipInflatingBuffer) {
276-
checkStats(tracer, transportTracer.getStats(), fakeClock, 8 /* compressed size */, 1000);
277+
checkStats(tracer, transportTracer.getStats(), fakeClock,true,
278+
8 /* compressed size */, 1000);
277279
} else {
278-
checkStats(tracer, transportTracer.getStats(), fakeClock, 1000, 1000);
280+
checkStats(tracer, transportTracer.getStats(), fakeClock, false, 1000, 1000);
279281
}
280282
}
281283

@@ -292,7 +294,7 @@ public void endOfStreamCallbackShouldWaitForMessageDelivery() {
292294
verify(listener).deframerClosed(false);
293295
verify(listener, atLeastOnce()).bytesRead(anyInt());
294296
verifyNoMoreInteractions(listener);
295-
checkStats(tracer, transportTracer.getStats(), fakeClock, 1, 1);
297+
checkStats(tracer, transportTracer.getStats(), fakeClock, useGzipInflatingBuffer, 1, 1);
296298
}
297299

298300
@Test
@@ -308,6 +310,7 @@ public void compressed() {
308310
verify(listener).messagesAvailable(producer.capture());
309311
assertEquals(Bytes.asList(new byte[1000]), bytes(producer.getValue().next()));
310312
verify(listener, atLeastOnce()).bytesRead(anyInt());
313+
checkStats(tracer, transportTracer.getStats(), fakeClock, true, 29, 1000);
311314
verifyNoMoreInteractions(listener);
312315
}
313316

@@ -502,15 +505,17 @@ public void sizeEnforcingInputStream_markReset() throws IOException {
502505
* @param sizes in the format {wire0, uncompressed0, wire1, uncompressed1, ...}
503506
*/
504507
private static void checkStats(
505-
TestBaseStreamTracer tracer, TransportStats transportStats, FakeClock clock, long... sizes) {
508+
TestBaseStreamTracer tracer, TransportStats transportStats, FakeClock clock,
509+
boolean compressed, long... sizes) {
506510
assertEquals(0, sizes.length % 2);
507511
int count = sizes.length / 2;
508512
long expectedWireSize = 0;
509513
long expectedUncompressedSize = 0;
510514
for (int i = 0; i < count; i++) {
511515
assertEquals("inboundMessage(" + i + ")", tracer.nextInboundEvent());
512516
assertEquals(
513-
String.format(Locale.US, "inboundMessageRead(%d, %d, -1)", i, sizes[i * 2]),
517+
String.format(Locale.US, "inboundMessageRead(%d, %d, %d)", i, sizes[i * 2],
518+
compressed ? -1 : sizes[i * 2 + 1]),
514519
tracer.nextInboundEvent());
515520
expectedWireSize += sizes[i * 2];
516521
expectedUncompressedSize += sizes[i * 2 + 1];

opentelemetry/src/main/java/io/grpc/opentelemetry/OpenTelemetryTracingModule.java

-1
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,6 @@ public void outboundMessageSent(
217217
@Override
218218
public void inboundMessageRead(
219219
int seqNo, long optionalWireSize, long optionalUncompressedSize) {
220-
//TODO(yifeizhuang): needs support from message deframer.
221220
if (optionalWireSize != optionalUncompressedSize) {
222221
recordInboundCompressedMessage(span, seqNo, optionalWireSize);
223222
}

0 commit comments

Comments
 (0)