IpConn metrics: add dhcp transition times
This patch adds lifetime durations of DhcpClient states to
DhcpClientEvents.
To record the duration of a state, the event is now recorded when the
DhcpClient state machine exits that state.
In addition this patch removes event logging of StoppedState,
DhcpState and DhcpHaveLeaseState.
Change-Id: Ibd37b5e3070f35113b6b45942b1e1ff19c27a90b
diff --git a/api/system-current.txt b/api/system-current.txt
index 9d07e84..b0fb9f3 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -26063,6 +26063,7 @@
method public static void logStateEvent(java.lang.String, java.lang.String);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.net.metrics.DhcpClientEvent> CREATOR;
+ field public final int durationMs;
field public final java.lang.String ifName;
field public final java.lang.String msg;
}
diff --git a/core/java/android/net/metrics/DhcpClientEvent.java b/core/java/android/net/metrics/DhcpClientEvent.java
index 3fe68b4..169f571 100644
--- a/core/java/android/net/metrics/DhcpClientEvent.java
+++ b/core/java/android/net/metrics/DhcpClientEvent.java
@@ -21,36 +21,43 @@
import android.os.Parcelable;
/**
+ * An event recorded when a DhcpClient state machine transitions to a new state.
* {@hide}
*/
@SystemApi
public final class DhcpClientEvent implements Parcelable {
public final String ifName;
public final String msg;
+ public final int durationMs;
/** {@hide} */
- public DhcpClientEvent(String ifName, String msg) {
+ public DhcpClientEvent(String ifName, String msg, int durationMs) {
this.ifName = ifName;
this.msg = msg;
+ this.durationMs = durationMs;
}
private DhcpClientEvent(Parcel in) {
this.ifName = in.readString();
this.msg = in.readString();
+ this.durationMs = in.readInt();
}
+ @Override
public void writeToParcel(Parcel out, int flags) {
out.writeString(ifName);
out.writeString(msg);
+ out.writeInt(durationMs);
}
+ @Override
public int describeContents() {
return 0;
}
@Override
public String toString() {
- return String.format("DhcpClientEvent(%s, %s)", ifName, msg);
+ return String.format("DhcpClientEvent(%s, %s, %dms)", ifName, msg, durationMs);
}
public static final Parcelable.Creator<DhcpClientEvent> CREATOR
diff --git a/services/net/java/android/net/dhcp/DhcpClient.java b/services/net/java/android/net/dhcp/DhcpClient.java
index 5852626..83cfc01 100644
--- a/services/net/java/android/net/dhcp/DhcpClient.java
+++ b/services/net/java/android/net/dhcp/DhcpClient.java
@@ -492,10 +492,19 @@
}
abstract class LoggingState extends State {
+ private long mEnterTimeMs;
+
@Override
public void enter() {
if (STATE_DBG) Log.d(TAG, "Entering state " + getName());
- mMetricsLog.log(new DhcpClientEvent(mIfaceName, getName()));
+ mEnterTimeMs = SystemClock.elapsedRealtime();
+ // TODO: record time for Init -> Bound and Bound -> Renewing -> Bound
+ }
+
+ @Override
+ public void exit() {
+ long durationMs = SystemClock.elapsedRealtime() - mEnterTimeMs;
+ mMetricsLog.log(new DhcpClientEvent(mIfaceName, getName(), (int) durationMs));
}
private String messageName(int what) {
@@ -520,6 +529,13 @@
}
return NOT_HANDLED;
}
+
+ @Override
+ public String getName() {
+ // All DhcpClient's states are inner classes with a well defined name.
+ // Use getSimpleName() and avoid super's getName() creating new String instances.
+ return getClass().getSimpleName();
+ }
}
// Sends CMD_PRE_DHCP_ACTION to the controller, waits for the controller to respond with
@@ -546,10 +562,9 @@
}
}
- class StoppedState extends LoggingState {
+ class StoppedState extends State {
@Override
public boolean processMessage(Message message) {
- super.processMessage(message);
switch (message.what) {
case CMD_START_DHCP:
if (mRegisteredForPreDhcpNotification) {
@@ -578,10 +593,9 @@
}
}
- class DhcpState extends LoggingState {
+ class DhcpState extends State {
@Override
public void enter() {
- super.enter();
clearDhcpState();
if (initInterface() && initSockets()) {
mReceiveThread = new ReceiveThread();
@@ -679,7 +693,9 @@
}
}
+ @Override
public void exit() {
+ super.exit();
mKickAlarm.cancel();
mTimeoutAlarm.cancel();
}
@@ -784,15 +800,9 @@
}
}
- class DhcpHaveLeaseState extends LoggingState {
- @Override
- public void enter() {
- super.enter();
- }
-
+ class DhcpHaveLeaseState extends State {
@Override
public boolean processMessage(Message message) {
- super.processMessage(message);
switch (message.what) {
case CMD_EXPIRE_DHCP:
Log.d(TAG, "Lease expired!");