diff options
author | Roshan Pius <rpius@google.com> | 2019-01-31 10:17:20 -0800 |
---|---|---|
committer | Roshan Pius <rpius@google.com> | 2019-02-13 10:21:41 -0800 |
commit | 37b625721ae692eb455243c826f11ed9db860bb7 (patch) | |
tree | 193ed4b1adc59abc8f61f671ee992510f22eab7a /service/java/com/android/server | |
parent | 06889f85bba6c6d921e7dd8fc2e1eb8158d6fccc (diff) | |
download | android_frameworks_opt_net_wifi-37b625721ae692eb455243c826f11ed9db860bb7.tar.gz android_frameworks_opt_net_wifi-37b625721ae692eb455243c826f11ed9db860bb7.tar.bz2 android_frameworks_opt_net_wifi-37b625721ae692eb455243c826f11ed9db860bb7.zip |
WifiMetrics: Add wifi config store IO duration metrics
Bug: 123693626
Test: adb shell dumpsys wifi wifiMetricsProto
Test: ./frameworks/opt/net/wifi/tests/wifitests/runtests.sh
Change-Id: Iaf26f55aad462bc68f015208412308e0645993f0
Diffstat (limited to 'service/java/com/android/server')
3 files changed, 94 insertions, 3 deletions
diff --git a/service/java/com/android/server/wifi/WifiConfigStore.java b/service/java/com/android/server/wifi/WifiConfigStore.java index d7335534e..d23923905 100644 --- a/service/java/com/android/server/wifi/WifiConfigStore.java +++ b/service/java/com/android/server/wifi/WifiConfigStore.java @@ -16,6 +16,8 @@ package com.android.server.wifi; +import static java.lang.Math.toIntExact; + import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; @@ -158,6 +160,7 @@ public class WifiConfigStore { * Clock instance to retrieve timestamps for alarms. */ private final Clock mClock; + private final WifiMetrics mWifiMetrics; /** * Shared config store file instance. There is 1 shared store file: * {@link #STORE_FILE_NAME_SHARED_GENERAL}. @@ -202,15 +205,17 @@ public class WifiConfigStore { * @param context context to use for retrieving the alarm manager. * @param looper looper instance to post alarm timeouts to. * @param clock clock instance to retrieve timestamps for alarms. + * @param wifiMetrics Metrics instance. * @param sharedStore StoreFile instance pointing to the shared store file. This should * be retrieved using {@link #createSharedFile()} method. */ - public WifiConfigStore(Context context, Looper looper, Clock clock, + public WifiConfigStore(Context context, Looper looper, Clock clock, WifiMetrics wifiMetrics, StoreFile sharedStore) { mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); mEventHandler = new Handler(looper); mClock = clock; + mWifiMetrics = wifiMetrics; mStoreDataList = new ArrayList<>(); // Initialize the store files. @@ -447,7 +452,11 @@ public class WifiConfigStore { } } long writeTime = mClock.getElapsedSinceBootMillis() - writeStartTime; - + try { + mWifiMetrics.noteWifiConfigStoreWriteDuration(toIntExact(writeTime)); + } catch (ArithmeticException e) { + // Silently ignore on any overflow errors. + } Log.d(TAG, "Writing to stores completed in " + writeTime + " ms."); } @@ -475,6 +484,11 @@ public class WifiConfigStore { } } long readTime = mClock.getElapsedSinceBootMillis() - readStartTime; + try { + mWifiMetrics.noteWifiConfigStoreReadDuration(toIntExact(readTime)); + } catch (ArithmeticException e) { + // Silently ignore on any overflow errors. + } Log.d(TAG, "Reading from all stores completed in " + readTime + " ms."); } @@ -504,6 +518,7 @@ public class WifiConfigStore { deserializeData(userDataBytes, userStoreFile); } long readTime = mClock.getElapsedSinceBootMillis() - readStartTime; + mWifiMetrics.noteWifiConfigStoreReadDuration(toIntExact(readTime)); Log.d(TAG, "Reading from user stores completed in " + readTime + " ms."); } diff --git a/service/java/com/android/server/wifi/WifiInjector.java b/service/java/com/android/server/wifi/WifiInjector.java index 3045731d5..c03c46aad 100644 --- a/service/java/com/android/server/wifi/WifiInjector.java +++ b/service/java/com/android/server/wifi/WifiInjector.java @@ -226,7 +226,7 @@ public class WifiInjector { // New config store mWifiKeyStore = new WifiKeyStore(mKeyStore); mWifiConfigStore = new WifiConfigStore( - mContext, clientModeImplLooper, mClock, + mContext, clientModeImplLooper, mClock, mWifiMetrics, WifiConfigStore.createSharedFile()); // Config Manager mWifiConfigManager = new WifiConfigManager(mContext, mClock, diff --git a/service/java/com/android/server/wifi/WifiMetrics.java b/service/java/com/android/server/wifi/WifiMetrics.java index fe34b0ee6..86b933c35 100644 --- a/service/java/com/android/server/wifi/WifiMetrics.java +++ b/service/java/com/android/server/wifi/WifiMetrics.java @@ -16,6 +16,8 @@ package com.android.server.wifi; +import static java.lang.StrictMath.toIntExact; + import android.content.Context; import android.hardware.wifi.supplicant.V1_0.ISupplicantStaIfaceCallback; import android.net.NetworkAgent; @@ -67,6 +69,7 @@ import com.android.server.wifi.p2p.WifiP2pMetrics; import com.android.server.wifi.rtt.RttMetrics; import com.android.server.wifi.util.ExternalCallbackTracker; import com.android.server.wifi.util.InformationElementUtil; +import com.android.server.wifi.util.MetricsUtils; import com.android.server.wifi.util.ScanResultUtil; import org.json.JSONArray; @@ -145,6 +148,15 @@ public class WifiMetrics { public static final int MAX_WIFI_USABILITY_STATS_PER_TYPE_TO_UPLOAD = 2; public static final int NUM_WIFI_USABILITY_STATS_ENTRIES_PER_WIFI_GOOD = 100; public static final int MIN_WIFI_GOOD_USABILITY_STATS_PERIOD_MS = 1000 * 3600; // 1 hour + // Histogram for WifiConfigStore IO duration times. Indicates the following 5 buckets (in ms): + // < 50 + // [50, 100) + // [100, 150) + // [150, 200) + // [200, 300) + // >= 300 + private static final int[] WIFI_CONFIG_STORE_IO_DURATION_BUCKET_RANGES_MS = + {50, 100, 150, 200, 300}; private Clock mClock; private boolean mScreenOn; @@ -302,6 +314,12 @@ public class WifiMetrics { /** DPP */ private final DppMetrics mDppMetrics; + /** WifiConfigStore read duration histogram. */ + private SparseIntArray mWifiConfigStoreReadDurationHistogram = new SparseIntArray(); + + /** WifiConfigStore write duration histogram. */ + private SparseIntArray mWifiConfigStoreWriteDurationHistogram = new SparseIntArray(); + class RouterFingerPrint { private WifiMetricsProto.RouterFingerPrint mRouterFingerPrintProto; RouterFingerPrint() { @@ -2522,6 +2540,11 @@ public class WifiMetrics { mWifiP2pMetrics.dump(pw); pw.println("mDppMetrics:"); mDppMetrics.dump(pw); + + pw.println("mWifiConfigStoreReadDurationHistogram:" + + mWifiConfigStoreReadDurationHistogram.toString()); + pw.println("mWifiConfigStoreWriteDurationHistogram:" + + mWifiConfigStoreWriteDurationHistogram.toString()); } } } @@ -2989,6 +3012,12 @@ public class WifiMetrics { .toArray(new DeviceMobilityStatePnoScanStats[0]); mWifiLogProto.wifiP2PStats = mWifiP2pMetrics.consolidateProto(); mWifiLogProto.wifiDppLog = mDppMetrics.consolidateProto(); + mWifiLogProto.wifiConfigStoreIo = new WifiMetricsProto.WifiConfigStoreIO(); + mWifiLogProto.wifiConfigStoreIo.readDurations = + makeWifiConfigStoreIODurationBucketArray(mWifiConfigStoreReadDurationHistogram); + mWifiLogProto.wifiConfigStoreIo.writeDurations = + makeWifiConfigStoreIODurationBucketArray( + mWifiConfigStoreWriteDurationHistogram); } } @@ -3020,6 +3049,27 @@ public class WifiMetrics { return array; } + private WifiMetricsProto.WifiConfigStoreIO.DurationBucket[] + makeWifiConfigStoreIODurationBucketArray(SparseIntArray sia) { + MetricsUtils.GenericBucket[] genericBuckets = + MetricsUtils.linearHistogramToGenericBuckets(sia, + WIFI_CONFIG_STORE_IO_DURATION_BUCKET_RANGES_MS); + WifiMetricsProto.WifiConfigStoreIO.DurationBucket[] array = + new WifiMetricsProto.WifiConfigStoreIO.DurationBucket[genericBuckets.length]; + try { + for (int i = 0; i < genericBuckets.length; i++) { + array[i] = new WifiMetricsProto.WifiConfigStoreIO.DurationBucket(); + array[i].rangeStartMs = toIntExact(genericBuckets[i].start); + array[i].rangeEndMs = toIntExact(genericBuckets[i].end); + array[i].count = genericBuckets[i].count; + } + } catch (ArithmeticException e) { + // Return empty array on any overflow errors. + array = new WifiMetricsProto.WifiConfigStoreIO.DurationBucket[0]; + } + return array; + } + /** * Clear all WifiMetrics, except for currentConnectionEvent and Open Network Notification * feature enabled state, blacklist size. @@ -3094,6 +3144,8 @@ public class WifiMetrics { android.net.wifi.WifiUsabilityStatsEntry.PROBE_STATUS_NO_PROBE; mProbeElapsedTimeMsSinceLastUpdate = -1; mProbeMcsRateSinceLastUpdate = -1; + mWifiConfigStoreReadDurationHistogram.clear(); + mWifiConfigStoreWriteDurationHistogram.clear(); } } @@ -4174,4 +4226,28 @@ public class WifiMetrics { } // TODO(b/112029045): aggregate metrics } + + /** + * Update wifi config store read duration. + * + * @param timeMs Time it took to complete the operation, in milliseconds + */ + public void noteWifiConfigStoreReadDuration(int timeMs) { + synchronized (mLock) { + MetricsUtils.addValueToLinearHistogram(timeMs, mWifiConfigStoreReadDurationHistogram, + WIFI_CONFIG_STORE_IO_DURATION_BUCKET_RANGES_MS); + } + } + + /** + * Update wifi config store write duration. + * + * @param timeMs Time it took to complete the operation, in milliseconds + */ + public void noteWifiConfigStoreWriteDuration(int timeMs) { + synchronized (mLock) { + MetricsUtils.addValueToLinearHistogram(timeMs, mWifiConfigStoreWriteDurationHistogram, + WIFI_CONFIG_STORE_IO_DURATION_BUCKET_RANGES_MS); + } + } } |