Add Log.wtf when keepalive metrics are unexpected.
To debug unexpected keepalive metrics values, print the built metrics in a Log.wtf before writing it to statsd. Bug: 297292877 Test: atest FrameworksNetTests Change-Id: I5fffc13721e50e28f24b0da12a961364f3f77e21
This commit is contained in:
@@ -74,6 +74,9 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||||||
public class KeepaliveStatsTracker {
|
public class KeepaliveStatsTracker {
|
||||||
private static final String TAG = KeepaliveStatsTracker.class.getSimpleName();
|
private static final String TAG = KeepaliveStatsTracker.class.getSimpleName();
|
||||||
private static final int INVALID_KEEPALIVE_ID = -1;
|
private static final int INVALID_KEEPALIVE_ID = -1;
|
||||||
|
// 1 hour acceptable deviation in metrics collection duration time.
|
||||||
|
private static final long MAX_EXPECTED_DURATION_MS =
|
||||||
|
AutomaticOnOffKeepaliveTracker.METRICS_COLLECTION_DURATION_MS + 1 * 60 * 60 * 1_000L;
|
||||||
|
|
||||||
@NonNull private final Handler mConnectivityServiceHandler;
|
@NonNull private final Handler mConnectivityServiceHandler;
|
||||||
@NonNull private final Dependencies mDependencies;
|
@NonNull private final Dependencies mDependencies;
|
||||||
@@ -710,6 +713,36 @@ public class KeepaliveStatsTracker {
|
|||||||
return mEnabled.get();
|
return mEnabled.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks the DailykeepaliveInfoReported for the following:
|
||||||
|
* 1. total active durations/lifetimes <= total registered durations/lifetimes.
|
||||||
|
* 2. Total time in Durations == total time in Carrier lifetime stats
|
||||||
|
* 3. The total elapsed real time spent is within expectations.
|
||||||
|
*/
|
||||||
|
@VisibleForTesting
|
||||||
|
public boolean allMetricsExpected(DailykeepaliveInfoReported dailyKeepaliveInfoReported) {
|
||||||
|
int totalRegistered = 0;
|
||||||
|
int totalActiveDurations = 0;
|
||||||
|
int totalTimeSpent = 0;
|
||||||
|
for (DurationForNumOfKeepalive durationForNumOfKeepalive: dailyKeepaliveInfoReported
|
||||||
|
.getDurationPerNumOfKeepalive().getDurationForNumOfKeepaliveList()) {
|
||||||
|
final int n = durationForNumOfKeepalive.getNumOfKeepalive();
|
||||||
|
totalRegistered += durationForNumOfKeepalive.getKeepaliveRegisteredDurationsMsec() * n;
|
||||||
|
totalActiveDurations += durationForNumOfKeepalive.getKeepaliveActiveDurationsMsec() * n;
|
||||||
|
totalTimeSpent += durationForNumOfKeepalive.getKeepaliveRegisteredDurationsMsec();
|
||||||
|
}
|
||||||
|
int totalLifetimes = 0;
|
||||||
|
int totalActiveLifetimes = 0;
|
||||||
|
for (KeepaliveLifetimeForCarrier keepaliveLifetimeForCarrier: dailyKeepaliveInfoReported
|
||||||
|
.getKeepaliveLifetimePerCarrier().getKeepaliveLifetimeForCarrierList()) {
|
||||||
|
totalLifetimes += keepaliveLifetimeForCarrier.getLifetimeMsec();
|
||||||
|
totalActiveLifetimes += keepaliveLifetimeForCarrier.getActiveLifetimeMsec();
|
||||||
|
}
|
||||||
|
return totalActiveDurations <= totalRegistered && totalActiveLifetimes <= totalLifetimes
|
||||||
|
&& totalLifetimes == totalRegistered && totalActiveLifetimes == totalActiveDurations
|
||||||
|
&& totalTimeSpent <= MAX_EXPECTED_DURATION_MS;
|
||||||
|
}
|
||||||
|
|
||||||
/** Writes the stored metrics to ConnectivityStatsLog and resets. */
|
/** Writes the stored metrics to ConnectivityStatsLog and resets. */
|
||||||
public void writeAndResetMetrics() {
|
public void writeAndResetMetrics() {
|
||||||
ensureRunningOnHandlerThread();
|
ensureRunningOnHandlerThread();
|
||||||
@@ -725,6 +758,9 @@ public class KeepaliveStatsTracker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
final DailykeepaliveInfoReported dailyKeepaliveInfoReported = buildAndResetMetrics();
|
final DailykeepaliveInfoReported dailyKeepaliveInfoReported = buildAndResetMetrics();
|
||||||
|
if (!allMetricsExpected(dailyKeepaliveInfoReported)) {
|
||||||
|
Log.wtf(TAG, "Unexpected metrics values: " + dailyKeepaliveInfoReported.toString());
|
||||||
|
}
|
||||||
mDependencies.writeStats(dailyKeepaliveInfoReported);
|
mDependencies.writeStats(dailyKeepaliveInfoReported);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ import static org.mockito.Mockito.doCallRealMethod;
|
|||||||
import static org.mockito.Mockito.doReturn;
|
import static org.mockito.Mockito.doReturn;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.never;
|
||||||
|
import static org.mockito.Mockito.times;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
|
|
||||||
import android.content.BroadcastReceiver;
|
import android.content.BroadcastReceiver;
|
||||||
@@ -1293,5 +1294,18 @@ public class KeepaliveStatsTrackerTest {
|
|||||||
expectRegisteredDurations,
|
expectRegisteredDurations,
|
||||||
expectActiveDurations,
|
expectActiveDurations,
|
||||||
new KeepaliveCarrierStats[0]);
|
new KeepaliveCarrierStats[0]);
|
||||||
|
|
||||||
|
assertTrue(mKeepaliveStatsTracker.allMetricsExpected(dailyKeepaliveInfoReported));
|
||||||
|
|
||||||
|
// Write time after 26 hours.
|
||||||
|
final int writeTime2 = 26 * 60 * 60 * 1000;
|
||||||
|
setElapsedRealtime(writeTime2);
|
||||||
|
|
||||||
|
visibleOnHandlerThread(mTestHandler, () -> mKeepaliveStatsTracker.writeAndResetMetrics());
|
||||||
|
verify(mDependencies, times(2)).writeStats(dailyKeepaliveInfoReportedCaptor.capture());
|
||||||
|
final DailykeepaliveInfoReported dailyKeepaliveInfoReported2 =
|
||||||
|
dailyKeepaliveInfoReportedCaptor.getValue();
|
||||||
|
|
||||||
|
assertFalse(mKeepaliveStatsTracker.allMetricsExpected(dailyKeepaliveInfoReported2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user