diff options
6 files changed, 63 insertions, 14 deletions
diff --git a/Android.bp b/Android.bp index 6d301c992009..58f6119c2243 100644 --- a/Android.bp +++ b/Android.bp @@ -623,6 +623,7 @@ gensrcs { "&& $(location soong_zip) -jar -o $(out) -C $(genDir)/$(in) -D $(genDir)/$(in)", srcs: [ + ":ipconnectivity-proto-src", "core/proto/**/*.proto", "libs/incident/**/*.proto", ], @@ -737,6 +738,7 @@ java_library { java_library_host { name: "platformprotos", srcs: [ + ":ipconnectivity-proto-src", "cmds/am/proto/instrumentation_data.proto", "cmds/statsd/src/**/*.proto", "core/proto/**/*.proto", @@ -765,6 +767,7 @@ java_library { ], sdk_version: "9", srcs: [ + ":ipconnectivity-proto-src", "core/proto/**/*.proto", "libs/incident/proto/android/os/**/*.proto", ], @@ -779,6 +782,7 @@ java_library { }, srcs: [ + ":ipconnectivity-proto-src", "core/proto/**/*.proto", "libs/incident/proto/android/os/**/*.proto", ], @@ -809,6 +813,7 @@ cc_defaults { ], srcs: [ + ":ipconnectivity-proto-src", "core/proto/**/*.proto", ], } diff --git a/core/proto/android/os/incident.proto b/core/proto/android/os/incident.proto index da8c944ba278..d08cbed5909d 100644 --- a/core/proto/android/os/incident.proto +++ b/core/proto/android/os/incident.proto @@ -56,6 +56,7 @@ import "frameworks/base/core/proto/android/util/event_log_tags.proto"; import "frameworks/base/core/proto/android/util/log.proto"; import "frameworks/base/core/proto/android/privacy.proto"; import "frameworks/base/core/proto/android/section.proto"; +import "frameworks/base/proto/src/ipconnectivity.proto"; package android.os; @@ -480,6 +481,11 @@ message IncidentProto { (section).args = "cpuinfo --proto" ]; + optional .clearcut.connectivity.IpConnectivityLog ip_connectivity_metrics = 3049 [ + (section).type = SECTION_DUMPSYS, + (section).args = "connmetrics --proto" + ]; + // Reserved for OEMs. extensions 50000 to 100000; } diff --git a/proto/Android.bp b/proto/Android.bp index 7cf6ce740969..01a72eaa6bf8 100644 --- a/proto/Android.bp +++ b/proto/Android.bp @@ -32,3 +32,8 @@ filegroup { name: "system-messages-proto-src", srcs: ["src/system_messages.proto"], } + +filegroup { + name: "ipconnectivity-proto-src", + srcs: ["src/ipconnectivity.proto"], +} diff --git a/services/core/java/com/android/server/connectivity/DefaultNetworkMetrics.java b/services/core/java/com/android/server/connectivity/DefaultNetworkMetrics.java index 96a202fa2b10..299cb66faf0c 100644 --- a/services/core/java/com/android/server/connectivity/DefaultNetworkMetrics.java +++ b/services/core/java/com/android/server/connectivity/DefaultNetworkMetrics.java @@ -81,9 +81,12 @@ public class DefaultNetworkMetrics { printEvent(localTimeMs, pw, mCurrentDefaultNetwork); } - public synchronized void listEventsAsProto(PrintWriter pw) { + /** + * Convert events in the ring buffer to protos and add to the given list + */ + public synchronized void listEventsAsProto(List<IpConnectivityEvent> out) { for (DefaultNetworkEvent ev : mEventsLog.toArray()) { - pw.print(IpConnectivityEventBuilder.toProto(ev)); + out.add(IpConnectivityEventBuilder.toProto(ev)); } } diff --git a/services/core/java/com/android/server/connectivity/IpConnectivityMetrics.java b/services/core/java/com/android/server/connectivity/IpConnectivityMetrics.java index 33f6ed597204..1337a93476bc 100644 --- a/services/core/java/com/android/server/connectivity/IpConnectivityMetrics.java +++ b/services/core/java/com/android/server/connectivity/IpConnectivityMetrics.java @@ -41,7 +41,9 @@ import com.android.server.SystemService; import com.android.server.connectivity.metrics.nano.IpConnectivityLogClass.IpConnectivityEvent; import java.io.FileDescriptor; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.OutputStream; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; @@ -239,18 +241,37 @@ final public class IpConnectivityMetrics extends SystemService { mDefaultNetworkMetrics.listEvents(pw); } + private List<IpConnectivityEvent> listEventsAsProtos() { + final List<IpConnectivityEvent> events = IpConnectivityEventBuilder.toProto(getEvents()); + if (mNetdListener != null) { + mNetdListener.listAsProtos(events); + } + mDefaultNetworkMetrics.listEventsAsProto(events); + return events; + } + /* * Print the content of the rolling event buffer in text proto format. */ - private void cmdListAsProto(PrintWriter pw) { - final List<ConnectivityMetricsEvent> events = getEvents(); - for (IpConnectivityEvent ev : IpConnectivityEventBuilder.toProto(events)) { - pw.print(ev.toString()); + private void cmdListAsTextProto(PrintWriter pw) { + listEventsAsProtos().forEach(e -> pw.print(e.toString())); + } + + /* + * Write the content of the rolling event buffer in proto wire format to the given OutputStream. + */ + private void cmdListAsBinaryProto(OutputStream out) { + final int dropped; + synchronized (mLock) { + dropped = mDropped; } - if (mNetdListener != null) { - mNetdListener.listAsProtos(pw); + try { + byte[] data = IpConnectivityEventBuilder.serialize(dropped, listEventsAsProtos()); + out.write(data); + out.flush(); + } catch (IOException e) { + Log.e(TAG, "could not serialize events", e); } - mDefaultNetworkMetrics.listEventsAsProto(pw); } /* @@ -267,6 +288,9 @@ final public class IpConnectivityMetrics extends SystemService { static final String CMD_FLUSH = "flush"; // Dump the rolling buffer of metrics event in human readable proto text format. static final String CMD_PROTO = "proto"; + // Dump the rolling buffer of metrics event in proto wire format. See usage() of + // frameworks/native/cmds/dumpsys/dumpsys.cpp for details. + static final String CMD_PROTO_BIN = "--proto"; // Dump the rolling buffer of metrics event and pretty print events using a human readable // format. Also print network dns/connect statistics and default network event time series. static final String CMD_LIST = "list"; @@ -291,7 +315,10 @@ final public class IpConnectivityMetrics extends SystemService { cmdFlush(pw); return; case CMD_PROTO: - cmdListAsProto(pw); + cmdListAsTextProto(pw); + return; + case CMD_PROTO_BIN: + cmdListAsBinaryProto(new FileOutputStream(fd)); return; case CMD_LIST: default: diff --git a/services/core/java/com/android/server/connectivity/NetdEventListenerService.java b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java index dbc339b01c89..0d3105139b88 100644 --- a/services/core/java/com/android/server/connectivity/NetdEventListenerService.java +++ b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java @@ -366,15 +366,18 @@ public class NetdEventListenerService extends INetdEventListener.Stub { } } - public synchronized void listAsProtos(PrintWriter pw) { + /** + * Convert events in the buffer to protos and add to the given list + */ + public synchronized void listAsProtos(List<IpConnectivityEvent> out) { for (int i = 0; i < mNetworkMetrics.size(); i++) { - pw.print(IpConnectivityEventBuilder.toProto(mNetworkMetrics.valueAt(i).connectMetrics)); + out.add(IpConnectivityEventBuilder.toProto(mNetworkMetrics.valueAt(i).connectMetrics)); } for (int i = 0; i < mNetworkMetrics.size(); i++) { - pw.print(IpConnectivityEventBuilder.toProto(mNetworkMetrics.valueAt(i).dnsMetrics)); + out.add(IpConnectivityEventBuilder.toProto(mNetworkMetrics.valueAt(i).dnsMetrics)); } for (int i = 0; i < mWakeupStats.size(); i++) { - pw.print(IpConnectivityEventBuilder.toProto(mWakeupStats.valueAt(i))); + out.add(IpConnectivityEventBuilder.toProto(mWakeupStats.valueAt(i))); } } |