diff --git a/core/java/android/net/metrics/ConnectStats.java b/core/java/android/net/metrics/ConnectStats.java index 3114ff81180d3..214edeeb53826 100644 --- a/core/java/android/net/metrics/ConnectStats.java +++ b/core/java/android/net/metrics/ConnectStats.java @@ -43,6 +43,8 @@ public class ConnectStats { private final int mMaxLatencyRecords; /** Total count of successful connects. */ private int mConnectCount = 0; + /** Total count of successful connects done in blocking mode. */ + private int mConnectBlockingCount = 0; /** Total count of successful connects with IPv6 socket address. */ private int mIpv6ConnectCount = 0; @@ -54,6 +56,7 @@ public class ConnectStats { public ConnectStatistics toProto() { ConnectStatistics stats = new ConnectStatistics(); stats.connectCount = mConnectCount; + stats.connectBlockingCount = mConnectBlockingCount; stats.ipv6AddrCount = mIpv6ConnectCount; stats.latenciesMs = mLatencies.toArray(); stats.errnosCounters = toPairArrays(mErrnos); @@ -62,16 +65,21 @@ public class ConnectStats { public void addEvent(int errno, int latencyMs, String ipAddr) { if (isSuccess(errno)) { - countConnect(ipAddr); + countConnect(errno, ipAddr); countLatency(errno, latencyMs); } else { countError(errno); } } - private void countConnect(String ipAddr) { + private void countConnect(int errno, String ipAddr) { mConnectCount++; - if (isIPv6(ipAddr)) mIpv6ConnectCount++; + if (!isNonBlocking(errno)) { + mConnectBlockingCount++; + } + if (isIPv6(ipAddr)) { + mIpv6ConnectCount++; + } } private void countLatency(int errno, int ms) { @@ -120,4 +128,18 @@ public class ConnectStats { } return pairs; } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder("ConnectStats(") + .append(String.format("%d success, ", mConnectCount)) + .append(String.format("%d blocking, ", mConnectBlockingCount)) + .append(String.format("%d IPv6 dst", mIpv6ConnectCount)); + for (int i = 0; i < mErrnos.size(); i++) { + String errno = OsConstants.errnoName(mErrnos.keyAt(i)); + int count = mErrnos.valueAt(i); + builder.append(String.format(", %s: %d", errno, count)); + } + return builder.append(")").toString(); + } } diff --git a/services/core/java/com/android/server/connectivity/IpConnectivityMetrics.java b/services/core/java/com/android/server/connectivity/IpConnectivityMetrics.java index 445f606013125..da56a07d2396e 100644 --- a/services/core/java/com/android/server/connectivity/IpConnectivityMetrics.java +++ b/services/core/java/com/android/server/connectivity/IpConnectivityMetrics.java @@ -201,12 +201,18 @@ final public class IpConnectivityMetrics extends SystemService { for (IpConnectivityEvent ev : IpConnectivityEventBuilder.toProto(events)) { pw.print(ev.toString()); } + if (mNetdListener != null) { + mNetdListener.listAsProtos(pw); + } return; } for (ConnectivityMetricsEvent ev : events) { pw.println(ev.toString()); } + if (mNetdListener != null) { + mNetdListener.list(pw); + } } private void cmdStats(FileDescriptor fd, PrintWriter pw, String[] args) { diff --git a/services/core/java/com/android/server/connectivity/NetdEventListenerService.java b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java index f555f0817bd9a..7b9c60ca6ef31 100644 --- a/services/core/java/com/android/server/connectivity/NetdEventListenerService.java +++ b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java @@ -204,10 +204,15 @@ public class NetdEventListenerService extends INetdEventListener.Stub { // TODO: migrate DnsEventBatch to IpConnectivityLogClass.DNSLatencies } - private IpConnectivityEvent flushConnectStats() { + private IpConnectivityEvent connectStatsProto() { + // TODO: add transport information IpConnectivityEvent ev = new IpConnectivityEvent(); ev.setConnectStatistics(mConnectStats.toProto()); - // TODO: add transport information + return ev; + } + + private IpConnectivityEvent flushConnectStats() { + IpConnectivityEvent ev = connectStatsProto(); mConnectStats = makeConnectStats(); return ev; } @@ -216,11 +221,19 @@ public class NetdEventListenerService extends INetdEventListener.Stub { IndentingPrintWriter pw = new IndentingPrintWriter(writer, " "); pw.println(TAG + ":"); pw.increaseIndent(); + list(pw); + pw.decreaseIndent(); + } + + public synchronized void list(PrintWriter pw) { for (DnsEventBatch batch : mEventBatches.values()) { pw.println(batch.toString()); } - // TODO: also dump ConnectStats - pw.decreaseIndent(); + pw.println(mConnectStats.toString()); + } + + public synchronized void listAsProtos(PrintWriter pw) { + pw.println(connectStatsProto().toString()); } private ConnectStats makeConnectStats() { diff --git a/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java b/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java index 637eaa33918dc..9e0f32137e89f 100644 --- a/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java +++ b/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java @@ -219,7 +219,7 @@ public class NetdEventListenerServiceTest extends TestCase { "time_ms: 0", "transports: 0", "connect_statistics <", - " connect_blocking_count: 0", + " connect_blocking_count: 7", " connect_count: 12", " errnos_counters <", " key: 1",