summaryrefslogtreecommitdiffstats
path: root/service/java/com/android
diff options
context:
space:
mode:
authorRoshan Pius <rpius@google.com>2019-01-31 10:17:20 -0800
committerRoshan Pius <rpius@google.com>2019-02-13 10:21:41 -0800
commit37b625721ae692eb455243c826f11ed9db860bb7 (patch)
tree193ed4b1adc59abc8f61f671ee992510f22eab7a /service/java/com/android
parent06889f85bba6c6d921e7dd8fc2e1eb8158d6fccc (diff)
downloadandroid_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')
-rw-r--r--service/java/com/android/server/wifi/WifiConfigStore.java19
-rw-r--r--service/java/com/android/server/wifi/WifiInjector.java2
-rw-r--r--service/java/com/android/server/wifi/WifiMetrics.java76
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);
+ }
+ }
}