core,netty,okhttp,testing: separate local vs remote stream start times for channelz (#4194)

The channelz spec states that the two must be separate.
This commit is contained in:
zpencer 2018-03-08 16:57:12 -08:00 committed by GitHub
parent f0eb6d2102
commit 921b668ad5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 33 additions and 19 deletions

View File

@ -223,6 +223,7 @@ public abstract class AbstractServerStream extends AbstractStream
@Override @Override
public final void onStreamAllocated() { public final void onStreamAllocated() {
super.onStreamAllocated(); super.onStreamAllocated();
getTransportTracer().reportRemoteStreamStarted();
} }
@Override @Override

View File

@ -235,7 +235,6 @@ public abstract class AbstractStream implements Stream {
allocated = true; allocated = true;
} }
notifyIfReady(); notifyIfReady();
transportTracer.reportStreamStarted();
} }
/** /**

View File

@ -295,7 +295,8 @@ public final class Channelz {
@Immutable @Immutable
public static final class TransportStats { public static final class TransportStats {
public final long streamsStarted; public final long streamsStarted;
public final long lastStreamCreatedTimeNanos; public final long lastLocalStreamCreatedTimeNanos;
public final long lastRemoteStreamCreatedTimeNanos;
public final long streamsSucceeded; public final long streamsSucceeded;
public final long streamsFailed; public final long streamsFailed;
public final long messagesSent; public final long messagesSent;
@ -311,7 +312,8 @@ public final class Channelz {
*/ */
public TransportStats( public TransportStats(
long streamsStarted, long streamsStarted,
long lastStreamCreatedTimeNanos, long lastLocalStreamCreatedTimeNanos,
long lastRemoteStreamCreatedTimeNanos,
long streamsSucceeded, long streamsSucceeded,
long streamsFailed, long streamsFailed,
long messagesSent, long messagesSent,
@ -322,7 +324,8 @@ public final class Channelz {
long localFlowControlWindow, long localFlowControlWindow,
long remoteFlowControlWindow) { long remoteFlowControlWindow) {
this.streamsStarted = streamsStarted; this.streamsStarted = streamsStarted;
this.lastStreamCreatedTimeNanos = lastStreamCreatedTimeNanos; this.lastLocalStreamCreatedTimeNanos = lastLocalStreamCreatedTimeNanos;
this.lastRemoteStreamCreatedTimeNanos = lastRemoteStreamCreatedTimeNanos;
this.streamsSucceeded = streamsSucceeded; this.streamsSucceeded = streamsSucceeded;
this.streamsFailed = streamsFailed; this.streamsFailed = streamsFailed;
this.messagesSent = messagesSent; this.messagesSent = messagesSent;

View File

@ -36,7 +36,8 @@ public final class TransportTracer {
private final TimeProvider timeProvider; private final TimeProvider timeProvider;
private long streamsStarted; private long streamsStarted;
private long lastStreamCreatedTimeNanos; private long lastLocalStreamCreatedTimeNanos;
private long lastRemoteStreamCreatedTimeNanos;
private long streamsSucceeded; private long streamsSucceeded;
private long streamsFailed; private long streamsFailed;
private long keepAlivesSent; private long keepAlivesSent;
@ -66,7 +67,8 @@ public final class TransportTracer {
flowControlWindowReader == null ? -1 : flowControlWindowReader.read().remoteBytes; flowControlWindowReader == null ? -1 : flowControlWindowReader.read().remoteBytes;
return new TransportStats( return new TransportStats(
streamsStarted, streamsStarted,
lastStreamCreatedTimeNanos, lastLocalStreamCreatedTimeNanos,
lastRemoteStreamCreatedTimeNanos,
streamsSucceeded, streamsSucceeded,
streamsFailed, streamsFailed,
messagesSent, messagesSent,
@ -79,12 +81,19 @@ public final class TransportTracer {
} }
/** /**
* Called by the transport to report a stream has started. For clients, this happens when a header * Called by the client to report a stream has started.
* is sent. For servers, this happens when a header is received.
*/ */
public void reportStreamStarted() { public void reportLocalStreamStarted() {
streamsStarted++; streamsStarted++;
lastStreamCreatedTimeNanos = currentTimeNanos(); lastLocalStreamCreatedTimeNanos = currentTimeNanos();
}
/**
* Called by the server to report a stream has started.
*/
public void reportRemoteStreamStarted() {
streamsStarted++;
lastRemoteStreamCreatedTimeNanos = currentTimeNanos();
} }
/** /**

View File

@ -248,6 +248,7 @@ class NettyClientStream extends AbstractClientStream {
// Now that the stream has actually been initialized, call the listener's onReady callback if // Now that the stream has actually been initialized, call the listener's onReady callback if
// appropriate. // appropriate.
onStreamAllocated(); onStreamAllocated();
getTransportTracer().reportLocalStreamStarted();
} }
/** /**

View File

@ -242,6 +242,7 @@ class OkHttpClientStream extends AbstractClientStream {
@Override @Override
protected void onStreamAllocated() { protected void onStreamAllocated() {
super.onStreamAllocated(); super.onStreamAllocated();
getTransportTracer().reportLocalStreamStarted();
} }
@GuardedBy("lock") @GuardedBy("lock")

View File

@ -1409,10 +1409,10 @@ public abstract class AbstractTransportTest {
{ {
TransportStats serverBefore = getTransportStats(serverTransportListener.transport); TransportStats serverBefore = getTransportStats(serverTransportListener.transport);
assertEquals(0, serverBefore.streamsStarted); assertEquals(0, serverBefore.streamsStarted);
assertEquals(0, serverBefore.lastStreamCreatedTimeNanos); assertEquals(0, serverBefore.lastRemoteStreamCreatedTimeNanos);
TransportStats clientBefore = getTransportStats(client); TransportStats clientBefore = getTransportStats(client);
assertEquals(0, clientBefore.streamsStarted); assertEquals(0, clientBefore.streamsStarted);
assertEquals(0, clientBefore.lastStreamCreatedTimeNanos); assertEquals(0, clientBefore.lastRemoteStreamCreatedTimeNanos);
ClientStream clientStream = client.newStream(methodDescriptor, new Metadata(), callOptions); ClientStream clientStream = client.newStream(methodDescriptor, new Metadata(), callOptions);
ClientStreamListenerBase clientStreamListener = new ClientStreamListenerBase(); ClientStreamListenerBase clientStreamListener = new ClientStreamListenerBase();
@ -1422,14 +1422,14 @@ public abstract class AbstractTransportTest {
TransportStats serverAfter = getTransportStats(serverTransportListener.transport); TransportStats serverAfter = getTransportStats(serverTransportListener.transport);
assertEquals(1, serverAfter.streamsStarted); assertEquals(1, serverAfter.streamsStarted);
serverFirstTimestampNanos = serverAfter.lastStreamCreatedTimeNanos; serverFirstTimestampNanos = serverAfter.lastRemoteStreamCreatedTimeNanos;
assertEquals( assertEquals(
currentTimeMillis(), currentTimeMillis(),
TimeUnit.NANOSECONDS.toMillis(serverAfter.lastStreamCreatedTimeNanos)); TimeUnit.NANOSECONDS.toMillis(serverAfter.lastRemoteStreamCreatedTimeNanos));
TransportStats clientAfter = getTransportStats(client); TransportStats clientAfter = getTransportStats(client);
assertEquals(1, clientAfter.streamsStarted); assertEquals(1, clientAfter.streamsStarted);
clientFirstTimestampNanos = clientAfter.lastStreamCreatedTimeNanos; clientFirstTimestampNanos = clientAfter.lastLocalStreamCreatedTimeNanos;
assertEquals( assertEquals(
currentTimeMillis(), currentTimeMillis(),
TimeUnit.NANOSECONDS.toMillis(clientFirstTimestampNanos)); TimeUnit.NANOSECONDS.toMillis(clientFirstTimestampNanos));
@ -1458,18 +1458,18 @@ public abstract class AbstractTransportTest {
assertEquals(2, serverAfter.streamsStarted); assertEquals(2, serverAfter.streamsStarted);
assertEquals( assertEquals(
TimeUnit.MILLISECONDS.toNanos(elapsedMillis), TimeUnit.MILLISECONDS.toNanos(elapsedMillis),
serverAfter.lastStreamCreatedTimeNanos - serverFirstTimestampNanos); serverAfter.lastRemoteStreamCreatedTimeNanos - serverFirstTimestampNanos);
long serverSecondTimestamp = long serverSecondTimestamp =
TimeUnit.NANOSECONDS.toMillis(serverAfter.lastStreamCreatedTimeNanos); TimeUnit.NANOSECONDS.toMillis(serverAfter.lastRemoteStreamCreatedTimeNanos);
assertEquals(currentTimeMillis(), serverSecondTimestamp); assertEquals(currentTimeMillis(), serverSecondTimestamp);
TransportStats clientAfter = getTransportStats(client); TransportStats clientAfter = getTransportStats(client);
assertEquals(2, clientAfter.streamsStarted); assertEquals(2, clientAfter.streamsStarted);
assertEquals( assertEquals(
TimeUnit.MILLISECONDS.toNanos(elapsedMillis), TimeUnit.MILLISECONDS.toNanos(elapsedMillis),
clientAfter.lastStreamCreatedTimeNanos - clientFirstTimestampNanos); clientAfter.lastLocalStreamCreatedTimeNanos - clientFirstTimestampNanos);
long clientSecondTimestamp = long clientSecondTimestamp =
TimeUnit.NANOSECONDS.toMillis(clientAfter.lastStreamCreatedTimeNanos); TimeUnit.NANOSECONDS.toMillis(clientAfter.lastLocalStreamCreatedTimeNanos);
assertEquals(currentTimeMillis(), clientSecondTimestamp); assertEquals(currentTimeMillis(), clientSecondTimestamp);
ServerStream serverStream = serverStreamCreation.stream; ServerStream serverStream = serverStreamCreation.stream;