diff options
author | Enrico Granata <egranata@google.com> | 2017-11-06 17:20:17 -0800 |
---|---|---|
committer | Enrico Granata <egranata@google.com> | 2017-11-09 19:12:28 +0000 |
commit | 7e0150d162aaca5db326360f924c093f50a0dc3a (patch) | |
tree | 50294506706a93889b6be39af389cf679d6624f0 /car-lib/src/android/car/storagemonitoring | |
parent | 0f72b74e45e22603b9f7697b9b4cb062e2cf4d21 (diff) | |
download | Car-7e0150d162aaca5db326360f924c093f50a0dc3a.tar.gz |
Implement CarStorageMonitoringManager::getIoStatsDeltas
This API gives access to the periodic snapshot deltas of I/O activity calculated by CarStorageMonitoringService
Bug: 32512551
Bug: 65846699
Test: bit CarServiceTest:com.android.car.CarStorageMonitoringTest
bit CarServiceUnitTest:com.android.car.storagemonitoring.CarStorageMonitoringTest
Change-Id: I833d4b4d0e63d6356b34584dbde3ba563e4aa899
Diffstat (limited to 'car-lib/src/android/car/storagemonitoring')
-rw-r--r-- | car-lib/src/android/car/storagemonitoring/CarStorageMonitoringManager.java | 22 | ||||
-rw-r--r-- | car-lib/src/android/car/storagemonitoring/ICarStorageMonitoring.aidl | 5 | ||||
-rw-r--r-- | car-lib/src/android/car/storagemonitoring/UidIoRecord.java (renamed from car-lib/src/android/car/storagemonitoring/UidIoStatsRecord.java) | 27 | ||||
-rw-r--r-- | car-lib/src/android/car/storagemonitoring/UidIoStats.java | 62 | ||||
-rw-r--r-- | car-lib/src/android/car/storagemonitoring/UidIoStatsDelta.aidl | 19 | ||||
-rw-r--r-- | car-lib/src/android/car/storagemonitoring/UidIoStatsDelta.java | 166 |
6 files changed, 266 insertions, 35 deletions
diff --git a/car-lib/src/android/car/storagemonitoring/CarStorageMonitoringManager.java b/car-lib/src/android/car/storagemonitoring/CarStorageMonitoringManager.java index 51d77d106c..cc32acc2ba 100644 --- a/car-lib/src/android/car/storagemonitoring/CarStorageMonitoringManager.java +++ b/car-lib/src/android/car/storagemonitoring/CarStorageMonitoringManager.java @@ -162,4 +162,26 @@ public final class CarStorageMonitoringManager implements CarManagerBase { return Collections.emptyList(); } + /** + * This method returns a list of the I/O stats deltas currently stored by the system. + * + * Periodically, the system gathers I/O activity metrics and computes and stores a delta from + * the previous cycle. The timing and the number of these stored samples are configurable + * by the OEM. + * + * The samples are returned in order from the oldest to the newest. + * + * If the information is not available, an empty list will be returned. + */ + @RequiresPermission(value=Car.PERMISSION_STORAGE_MONITORING) + public List<UidIoStatsDelta> getIoStatsDeltas() throws CarNotConnectedException { + try { + return mService.getIoStatsDeltas(); + } catch (IllegalStateException e) { + checkCarNotConnectedExceptionFromCarService(e); + } catch (RemoteException e) { + throw new CarNotConnectedException(); + } + return Collections.emptyList(); + } } diff --git a/car-lib/src/android/car/storagemonitoring/ICarStorageMonitoring.aidl b/car-lib/src/android/car/storagemonitoring/ICarStorageMonitoring.aidl index cedb3433f2..d8183d6628 100644 --- a/car-lib/src/android/car/storagemonitoring/ICarStorageMonitoring.aidl +++ b/car-lib/src/android/car/storagemonitoring/ICarStorageMonitoring.aidl @@ -17,6 +17,7 @@ package android.car.storagemonitoring; import android.car.storagemonitoring.UidIoStats; +import android.car.storagemonitoring.UidIoStatsDelta; import android.car.storagemonitoring.WearEstimate; import android.car.storagemonitoring.WearEstimateChange; @@ -47,4 +48,8 @@ interface ICarStorageMonitoring { */ List<UidIoStats> getAggregateIoStats() = 5; + /** + * Return the I/O stats deltas currently known to the service. + */ + List<UidIoStatsDelta> getIoStatsDeltas() = 6; } diff --git a/car-lib/src/android/car/storagemonitoring/UidIoStatsRecord.java b/car-lib/src/android/car/storagemonitoring/UidIoRecord.java index abd9ee04be..196c83ce05 100644 --- a/car-lib/src/android/car/storagemonitoring/UidIoStatsRecord.java +++ b/car-lib/src/android/car/storagemonitoring/UidIoRecord.java @@ -23,7 +23,7 @@ import android.annotation.SystemApi; * @hide */ @SystemApi -public final class UidIoStatsRecord { +public final class UidIoRecord { public final int uid; @@ -39,7 +39,7 @@ public final class UidIoStatsRecord { public final long background_write_bytes; public final long background_fsync; - public UidIoStatsRecord(int uid, + public UidIoRecord(int uid, long foreground_rchar, long foreground_wchar, long foreground_read_bytes, @@ -66,12 +66,12 @@ public final class UidIoStatsRecord { } /** @hide */ - public UidIoStatsRecord delta(UidIoStats other) { + public UidIoRecord delta(UidIoStats other) { if (uid != other.uid) { throw new IllegalArgumentException("cannot calculate delta between different user IDs"); } - return new UidIoStatsRecord(uid, + return new UidIoRecord(uid, foreground_rchar - other.foreground.bytesRead, foreground_wchar - other.foreground.bytesWritten, foreground_read_bytes - other.foreground.bytesReadFromStorage, @@ -83,4 +83,23 @@ public final class UidIoStatsRecord { background_write_bytes - other.background.bytesWrittenToStorage, background_fsync - other.background.fsyncCalls); } + + /** @hide */ + public UidIoRecord delta(UidIoRecord other) { + if (uid != other.uid) { + throw new IllegalArgumentException("cannot calculate delta between different user IDs"); + } + + return new UidIoRecord(uid, + foreground_rchar - other.foreground_rchar, + foreground_wchar - other.foreground_wchar, + foreground_read_bytes - other.foreground_read_bytes, + foreground_write_bytes - other.foreground_write_bytes, + foreground_fsync - other.foreground_fsync, + background_rchar - other.background_rchar, + background_wchar - other.background_wchar, + background_read_bytes - other.background_read_bytes, + background_write_bytes - other.background_write_bytes, + background_fsync - other.background_fsync); + } } diff --git a/car-lib/src/android/car/storagemonitoring/UidIoStats.java b/car-lib/src/android/car/storagemonitoring/UidIoStats.java index 3b8ae93379..13db298ef9 100644 --- a/car-lib/src/android/car/storagemonitoring/UidIoStats.java +++ b/car-lib/src/android/car/storagemonitoring/UidIoStats.java @@ -66,15 +66,15 @@ public final class UidIoStats implements Parcelable { /** * Statistics for apps running in foreground. */ - public final PerStateMetrics foreground; + public final UidIoStats.Metrics foreground; /** * Statistics for apps running in background. */ - public final PerStateMetrics background; + public final UidIoStats.Metrics background; public UidIoStats(int uid, - long runtimeMillis, PerStateMetrics foreground, PerStateMetrics background) { + long runtimeMillis, UidIoStats.Metrics foreground, UidIoStats.Metrics background) { this.uid = uid; this.runtimeMillis = runtimeMillis; this.foreground = Objects.requireNonNull(foreground); @@ -84,19 +84,19 @@ public final class UidIoStats implements Parcelable { public UidIoStats(Parcel in) { uid = in.readInt(); runtimeMillis = in.readLong(); - foreground = in.readParcelable(PerStateMetrics.class.getClassLoader()); - background = in.readParcelable(PerStateMetrics.class.getClassLoader()); + foreground = in.readParcelable(UidIoStats.Metrics.class.getClassLoader()); + background = in.readParcelable(UidIoStats.Metrics.class.getClassLoader()); } - public UidIoStats(UidIoStatsRecord record, long runtimeMillis) { + public UidIoStats(UidIoRecord record, long runtimeMillis) { uid = record.uid; this.runtimeMillis = runtimeMillis; - foreground = new PerStateMetrics(record.foreground_rchar, + foreground = new UidIoStats.Metrics(record.foreground_rchar, record.foreground_wchar, record.foreground_read_bytes, record.foreground_write_bytes, record.foreground_fsync); - background = new PerStateMetrics(record.background_rchar, + background = new UidIoStats.Metrics(record.background_rchar, record.background_wchar, record.background_read_bytes, record.background_write_bytes, @@ -128,8 +128,8 @@ public final class UidIoStats implements Parcelable { public UidIoStats(JSONObject in) throws JSONException { uid = in.getInt("uid"); runtimeMillis = in.getLong("runtimeMillis"); - foreground = new PerStateMetrics(in.getJSONObject("foreground")); - background = new PerStateMetrics(in.getJSONObject("background")); + foreground = new UidIoStats.Metrics(in.getJSONObject("foreground")); + background = new UidIoStats.Metrics(in.getJSONObject("background")); } /** @@ -181,7 +181,7 @@ public final class UidIoStats implements Parcelable { * It matches UID, and I/O activity values, but ignores runtime. * @hide */ - public boolean representsSameMetrics(UidIoStatsRecord record) { + public boolean representsSameMetrics(UidIoRecord record) { return record.uid == uid && record.foreground_rchar == foreground.bytesRead && record.foreground_wchar == foreground.bytesWritten && @@ -198,16 +198,16 @@ public final class UidIoStats implements Parcelable { /** * I/O activity metrics that pertain to either the foreground or the background state. */ - public static final class PerStateMetrics implements Parcelable { + public static final class Metrics implements Parcelable { - public static final Parcelable.Creator<PerStateMetrics> CREATOR = - new Parcelable.Creator<PerStateMetrics>() { - public PerStateMetrics createFromParcel(Parcel in) { - return new PerStateMetrics(in); + public static final Parcelable.Creator<UidIoStats.Metrics> CREATOR = + new Parcelable.Creator<UidIoStats.Metrics>() { + public UidIoStats.Metrics createFromParcel(Parcel in) { + return new UidIoStats.Metrics(in); } - public PerStateMetrics[] newArray(int size) { - return new PerStateMetrics[size]; + public UidIoStats.Metrics[] newArray(int size) { + return new UidIoStats.Metrics[size]; } }; @@ -240,7 +240,7 @@ public final class UidIoStats implements Parcelable { */ public final long fsyncCalls; - public PerStateMetrics(long bytesRead, long bytesWritten, long bytesReadFromStorage, + public Metrics(long bytesRead, long bytesWritten, long bytesReadFromStorage, long bytesWrittenToStorage, long fsyncCalls) { this.bytesRead = bytesRead; this.bytesWritten = bytesWritten; @@ -273,7 +273,7 @@ public final class UidIoStats implements Parcelable { jsonWriter.endObject(); } - public PerStateMetrics(Parcel in) { + public Metrics(Parcel in) { bytesRead = in.readLong(); bytesWritten = in.readLong(); bytesReadFromStorage = in.readLong(); @@ -281,7 +281,7 @@ public final class UidIoStats implements Parcelable { fsyncCalls = in.readLong(); } - public PerStateMetrics(JSONObject in) throws JSONException { + public Metrics(JSONObject in) throws JSONException { bytesRead = in.getLong("bytesRead"); bytesWritten = in.getLong("bytesWritten"); bytesReadFromStorage = in.getLong("bytesReadFromStorage"); @@ -298,8 +298,8 @@ public final class UidIoStats implements Parcelable { * * @hide */ - public PerStateMetrics delta(PerStateMetrics other) { - return new PerStateMetrics(bytesRead-other.bytesRead, + public Metrics delta(Metrics other) { + return new Metrics(bytesRead-other.bytesRead, bytesWritten-other.bytesWritten, bytesReadFromStorage-other.bytesReadFromStorage, bytesWrittenToStorage-other.bytesWrittenToStorage, @@ -308,14 +308,14 @@ public final class UidIoStats implements Parcelable { @Override public boolean equals(Object other) { - if (other instanceof PerStateMetrics) { - PerStateMetrics perStateMetrics = (PerStateMetrics)other; - - return (bytesRead == perStateMetrics.bytesRead) && - (bytesWritten == perStateMetrics.bytesWritten) && - (bytesReadFromStorage == perStateMetrics.bytesReadFromStorage) && - (bytesWrittenToStorage == perStateMetrics.bytesWrittenToStorage) && - (fsyncCalls == perStateMetrics.fsyncCalls); + if (other instanceof Metrics) { + Metrics metrics = (Metrics)other; + + return (bytesRead == metrics.bytesRead) && + (bytesWritten == metrics.bytesWritten) && + (bytesReadFromStorage == metrics.bytesReadFromStorage) && + (bytesWrittenToStorage == metrics.bytesWrittenToStorage) && + (fsyncCalls == metrics.fsyncCalls); } return false; } diff --git a/car-lib/src/android/car/storagemonitoring/UidIoStatsDelta.aidl b/car-lib/src/android/car/storagemonitoring/UidIoStatsDelta.aidl new file mode 100644 index 0000000000..7ffb6f585e --- /dev/null +++ b/car-lib/src/android/car/storagemonitoring/UidIoStatsDelta.aidl @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.car.storagemonitoring; + +parcelable UidIoStatsDelta; diff --git a/car-lib/src/android/car/storagemonitoring/UidIoStatsDelta.java b/car-lib/src/android/car/storagemonitoring/UidIoStatsDelta.java new file mode 100644 index 0000000000..ffcd85f79f --- /dev/null +++ b/car-lib/src/android/car/storagemonitoring/UidIoStatsDelta.java @@ -0,0 +1,166 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.car.storagemonitoring; + +import android.annotation.SystemApi; +import android.car.storagemonitoring.UidIoStats.Metrics; +import android.os.Parcel; +import android.os.Parcelable; +import java.util.List; +import java.util.Objects; +import java.util.StringJoiner; +import java.util.stream.Collectors; + +/** + * Delta of uid_io stats taken at a sample point. + * + * @hide + */ +@SystemApi +public class UidIoStatsDelta implements Parcelable { + public static final Creator<UidIoStatsDelta> CREATOR = new Creator<UidIoStatsDelta>() { + @Override + public UidIoStatsDelta createFromParcel(Parcel in) { + return new UidIoStatsDelta(in); + } + + @Override + public UidIoStatsDelta[] newArray(int size) { + return new UidIoStatsDelta[size]; + } + }; + + private final List<UidIoStats> mStats; + private final long mUptimeTimestamp; + + public UidIoStatsDelta(List<UidIoStats> stats, long timestamp) { + mStats = stats; + mUptimeTimestamp = timestamp; + } + + public UidIoStatsDelta(Parcel in) { + mStats = in.createTypedArrayList(UidIoStats.CREATOR); + mUptimeTimestamp = in.readLong(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeTypedList(mStats); + dest.writeLong(mUptimeTimestamp); + } + + @Override + public int describeContents() { + return 0; + } + + public long getTimestamp() { + return mUptimeTimestamp; + } + + public List<UidIoStats> getStats() { + return mStats; + } + + @Override + public int hashCode() { + return Objects.hash(mStats, mUptimeTimestamp); + } + + public UidIoStats getUserIdStats(int uid) { + for (UidIoStats stats : getStats()) { + if (stats.uid == uid) { + return stats; + } + } + + return null; + } + + public UidIoStats.Metrics getForegroundTotals() { + long bytesRead = 0; + long bytesWritten = 0; + long bytesReadFromStorage = 0; + long bytesWrittenToStorage = 0; + long fsyncCalls = 0; + + for (UidIoStats stats : getStats()) { + bytesRead += stats.foreground.bytesRead; + bytesWritten += stats.foreground.bytesWritten; + bytesReadFromStorage += stats.foreground.bytesReadFromStorage; + bytesWrittenToStorage += stats.foreground.bytesWrittenToStorage; + fsyncCalls += stats.foreground.fsyncCalls; + } + + return new Metrics(bytesRead, + bytesWritten, + bytesReadFromStorage, + bytesWrittenToStorage, + fsyncCalls); + } + + public UidIoStats.Metrics getBackgroundTotals() { + long bytesRead = 0; + long bytesWritten = 0; + long bytesReadFromStorage = 0; + long bytesWrittenToStorage = 0; + long fsyncCalls = 0; + + for (UidIoStats stats : getStats()) { + bytesRead += stats.background.bytesRead; + bytesWritten += stats.background.bytesWritten; + bytesReadFromStorage += stats.background.bytesReadFromStorage; + bytesWrittenToStorage += stats.background.bytesWrittenToStorage; + fsyncCalls += stats.background.fsyncCalls; + } + + return new Metrics(bytesRead, + bytesWritten, + bytesReadFromStorage, + bytesWrittenToStorage, + fsyncCalls); + } + + public UidIoStats.Metrics getTotals() { + UidIoStats.Metrics foreground = getForegroundTotals(); + UidIoStats.Metrics background = getBackgroundTotals(); + + return new UidIoStats.Metrics(foreground.bytesRead + background.bytesRead, + foreground.bytesWritten + background.bytesWritten, + foreground.bytesReadFromStorage + background.bytesReadFromStorage, + foreground.bytesWrittenToStorage + background.bytesWrittenToStorage, + foreground.fsyncCalls + background.fsyncCalls); + } + + @Override + public boolean equals(Object other) { + if (other instanceof UidIoStatsDelta) { + UidIoStatsDelta delta = (UidIoStatsDelta)other; + return delta.getTimestamp() == getTimestamp() && + delta.getStats().equals(getStats()); + } + return false; + } + + @Override + public String toString() { + StringJoiner stringJoiner = new StringJoiner(", "); + for (UidIoStats stats : getStats()) { + stringJoiner.add(stats.toString()); + } + return "timestamp = " + getTimestamp() + ", stats = " + stringJoiner.toString(); + } +} |