Skip to content

Commit

Permalink
Add UMA stats for the content of Android /data directory
Browse files Browse the repository at this point in the history
To prepare for the virtio-blk /data migration
(go/arc:virtio-blk-migration) and the "Play files" fixup
(go/arc-r-play-files-permission-fixup), this CL adds UMA stats about the
number of files and the size of directories in some subdirectories of
Android /data. See http://b/240229355#comment3 for the full list of what
to be measured.

Bug: b:240229355, b:239934067
Test: Check the results in chrome://histograms.

Change-Id: I15011176bf99ca2f6788ab09e09fd60d2f880728
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3802296
Reviewed-by: Yusuke Sato <yusukes@chromium.org>
Commit-Queue: Momoko Hattori <momohatt@chromium.org>
Reviewed-by: Muhammad Hasan Khan <mhasank@chromium.org>
Reviewed-by: Risan <risan@chromium.org>
Reviewed-by: Dominick Ng <dominickn@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1034988}
  • Loading branch information
momohatt authored and Chromium LUCI CQ committed Aug 15, 2022
1 parent 0637a07 commit 843efff
Show file tree
Hide file tree
Showing 4 changed files with 261 additions and 2 deletions.
102 changes: 102 additions & 0 deletions ash/components/arc/metrics/arc_metrics_service.cc
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,10 @@ constexpr int kUmaFixupDirectoriesCountMin = 0;
constexpr int kUmaFixupDirectoriesCountMax = 5000000;
constexpr int kUmaFixupAppsCountMin = 0;
constexpr int kUmaFixupAppsCountMax = 10000;
constexpr int kUmaDataFilesCountMin = 1;
constexpr int kUmaDataFilesCountMax = 5000000;
constexpr int kUmaDataSizeInKiloBytesMin = 1;
constexpr int kUmaDataSizeInKiloBytesMax = INT_MAX - 1;

constexpr base::TimeDelta kRequestProcessListPeriod = base::Minutes(5);
constexpr char kArcProcessNamePrefix[] = "org.chromium.arc.";
Expand Down Expand Up @@ -112,6 +116,22 @@ const char* DnsQueryToString(mojom::ArcDnsQuery query) {
return "";
}

std::string AndroidDataSubdirectoryToString(
mojom::AndroidDataSubdirectory subdirectory) {
switch (subdirectory) {
case mojom::AndroidDataSubdirectory::kUserInstalledAppDir:
return "UserInstalledAppDir";
case mojom::AndroidDataSubdirectory::kInternalDataDir:
return "InternalDataDir";
case mojom::AndroidDataSubdirectory::kExternalDataRootUserDir:
return "ExternalDataRootUserDir";
case mojom::AndroidDataSubdirectory::kDEStorageRootUserDir:
return "DEStorageRootUserDir";
}
NOTREACHED();
return "";
}

struct LoadAverageHistogram {
const char* name;
base::TimeDelta duration;
Expand Down Expand Up @@ -730,6 +750,88 @@ void ArcMetricsService::ReportWaylandLateTimingDuration(
base::UmaHistogramLongTimes("Arc.Wayland.LateTiming.Duration", duration);
}

void ArcMetricsService::ReportNonAndroidPlayFilesCount(
uint32_t number_of_directories,
uint32_t number_of_non_directories) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
base::UmaHistogramCustomCounts(
"Arc.PlayFilesCount.Files",
number_of_directories + number_of_non_directories, kUmaDataFilesCountMin,
kUmaDataFilesCountMax, kUmaNumBuckets);
base::UmaHistogramCustomCounts("Arc.PlayFilesCount.Directories",
number_of_directories, kUmaDataFilesCountMin,
kUmaDataFilesCountMax, kUmaNumBuckets);
base::UmaHistogramCustomCounts(
"Arc.PlayFilesCount.NonDirectories", number_of_non_directories,
kUmaDataFilesCountMin, kUmaDataFilesCountMax, kUmaNumBuckets);
}

void ArcMetricsService::ReportPerAppFileStatsOfAndroidDataDirs(
uint32_t number_of_directories,
uint32_t number_of_non_directories,
uint32_t size_in_kilobytes) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
base::UmaHistogramCustomCounts(
"Arc.AndroidData.PerApp.Files",
number_of_directories + number_of_non_directories, kUmaDataFilesCountMin,
kUmaDataFilesCountMax, kUmaNumBuckets);
base::UmaHistogramCustomCounts("Arc.AndroidData.PerApp.Directories",
number_of_directories, kUmaDataFilesCountMin,
kUmaDataFilesCountMax, kUmaNumBuckets);
base::UmaHistogramCustomCounts(
"Arc.AndroidData.PerApp.NonDirectories", number_of_non_directories,
kUmaDataFilesCountMin, kUmaDataFilesCountMax, kUmaNumBuckets);
base::UmaHistogramCustomCounts("Arc.AndroidData.PerApp.Size",
size_in_kilobytes, kUmaDataSizeInKiloBytesMin,
kUmaDataSizeInKiloBytesMax, kUmaNumBuckets);
}

void ArcMetricsService::ReportTotalFileStatsOfAndroidDataDirs(
uint32_t number_of_directories,
uint32_t number_of_non_directories,
uint32_t size_in_kilobytes,
base::TimeDelta duration) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
base::UmaHistogramCustomCounts(
"Arc.AndroidData.Total.All.Files",
number_of_directories + number_of_non_directories, kUmaDataFilesCountMin,
kUmaDataFilesCountMax, kUmaNumBuckets);
base::UmaHistogramCustomCounts("Arc.AndroidData.Total.All.Directories",
number_of_directories, kUmaDataFilesCountMin,
kUmaDataFilesCountMax, kUmaNumBuckets);
base::UmaHistogramCustomCounts(
"Arc.AndroidData.Total.All.NonDirectories", number_of_non_directories,
kUmaDataFilesCountMin, kUmaDataFilesCountMax, kUmaNumBuckets);
base::UmaHistogramCustomCounts("Arc.AndroidData.Total.All.Size",
size_in_kilobytes, kUmaDataSizeInKiloBytesMin,
kUmaDataSizeInKiloBytesMax, kUmaNumBuckets);
base::UmaHistogramLongTimes("Arc.AndroidData.TraversalDuration", duration);
}

void ArcMetricsService::ReportTotalFileStatsOfAndroidDataSubdir(
mojom::AndroidDataSubdirectory target,
uint32_t number_of_directories,
uint32_t number_of_non_directories,
uint32_t size_in_kilobytes) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
const std::string targetName = AndroidDataSubdirectoryToString(target);
base::UmaHistogramCustomCounts(
"Arc.AndroidData.Total." + targetName + ".Files",
number_of_directories + number_of_non_directories, kUmaDataFilesCountMin,
kUmaDataFilesCountMax, kUmaNumBuckets);
base::UmaHistogramCustomCounts(
"Arc.AndroidData.Total." + targetName + ".Directories",
number_of_directories, kUmaDataFilesCountMin, kUmaDataFilesCountMax,
kUmaNumBuckets);
base::UmaHistogramCustomCounts(
"Arc.AndroidData.Total." + targetName + ".NonDirectories",
number_of_non_directories, kUmaDataFilesCountMin, kUmaDataFilesCountMax,
kUmaNumBuckets);
base::UmaHistogramCustomCounts(
"Arc.AndroidData.Total." + targetName + ".Size", size_in_kilobytes,
kUmaDataSizeInKiloBytesMin, kUmaDataSizeInKiloBytesMax, kUmaNumBuckets);
}

void ArcMetricsService::OnWindowActivated(
wm::ActivationChangeObserver::ActivationReason reason,
aura::Window* gained_active,
Expand Down
16 changes: 16 additions & 0 deletions ash/components/arc/metrics/arc_metrics_service.h
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,22 @@ class ArcMetricsService : public KeyedService,
void ReportMemoryPressure(const std::vector<uint8_t>& psiFile) override;
void ReportProvisioningPreSignIn() override;
void ReportWaylandLateTimingDuration(base::TimeDelta duration) override;
void ReportNonAndroidPlayFilesCount(
uint32_t number_of_directories,
uint32_t number_of_non_directories) override;
void ReportPerAppFileStatsOfAndroidDataDirs(
uint32_t number_of_directories,
uint32_t number_of_non_directories,
uint32_t size_in_kilobytes) override;
void ReportTotalFileStatsOfAndroidDataDirs(uint32_t number_of_directories,
uint32_t number_of_non_directories,
uint32_t size_in_kilobytes,
base::TimeDelta duration) override;
void ReportTotalFileStatsOfAndroidDataSubdir(
mojom::AndroidDataSubdirectory target,
uint32_t number_of_directories,
uint32_t number_of_non_directories,
uint32_t size_in_kilobytes) override;

// wm::ActivationChangeObserver overrides.
// Records to UMA when a user has interacted with an ARC app window.
Expand Down
49 changes: 47 additions & 2 deletions ash/components/arc/mojom/metrics.mojom
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Next MinVersion: 25
// Next MinVersion: 26

module arc.mojom;

Expand Down Expand Up @@ -331,7 +331,23 @@ enum MainAccountHashMigrationStatus {
// tools/metrics/histograms/enums.xml.
};

// Next method ID: 26
// The list of subdirectories of Android /data that are covered in the
// statistics on the directory size and the number of files contained.
enum AndroidDataSubdirectory {
// /data/app
kUserInstalledAppDir = 0,

// /data/data
kInternalDataDir = 1,

// /data/media/0
kExternalDataRootUserDir = 2,

// /data/user_de/0
kDEStorageRootUserDir = 3,
};

// Next method ID: 30
interface MetricsHost {
// Reports boot progress events from ARC instance.
ReportBootProgress@0(array<BootProgressEvent> events,
Expand Down Expand Up @@ -436,6 +452,35 @@ interface MetricsHost {
// Reports the duration of late timing events for Wayland.
[MinVersion=23] ReportWaylandLateTimingDuration@25(
mojo_base.mojom.TimeDelta duration);

// Reports the number of directories and non-directory files under the
// "Play files" folder in ChromeOS Files app except for the "Android" folder.
[MinVersion=25] ReportNonAndroidPlayFilesCount@26(
uint32 number_of_directories, uint32 number_of_non_directories);

// For each package, reports the number of directories and non-directory files
// and the total size of files contained in one of its package-specific
// directories, which can be found in /data/app, /data/data,
// /data/media/0/Android/{data,obb} or /data/user_de/0.
[MinVersion=25] ReportPerAppFileStatsOfAndroidDataDirs@27(
uint32 number_of_directories, uint32 number_of_non_directories,
uint32 size_in_kilobytes);

// Reports the number of directories and non-directory files and the total
// size of the files in /data/app, /data/data, /data/media/0 and
// /data/user_de/0 combined. Also reports the duration of the file system
// traversal to get the data in milliseconds.
[MinVersion=25] ReportTotalFileStatsOfAndroidDataDirs@28(
uint32 number_of_directories, uint32 number_of_non_directories,
uint32 size_in_kilobytes, mojo_base.mojom.TimeDelta duration);

// Reports the number of directories and non-directory files and the total
// size of the files in one of the selected subdirectories of /data
// (/data/app, /data/data, /data/media/0 and /data/user_de/0), which is
// specified in the first argument.
[MinVersion=25] ReportTotalFileStatsOfAndroidDataSubdir@29(
AndroidDataSubdirectory target, uint32 number_of_directories,
uint32 number_of_non_directories, uint32 size_in_kilobytes);
};

// Deprecated method IDs: 0
Expand Down
96 changes: 96 additions & 0 deletions tools/metrics/histograms/metadata/arc/histograms.xml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,18 @@ chromium-metrics-reviews@google.com.

<histograms>

<variants name="AndroidDataSizeMeasurementTargetDirectories">
<variant name="All"
summary="Android directories /data/app, /data/data, /data/media/0 and
/data/user_de/0 combined"/>
<variant name="DEStorageRootUserDir"
summary="Android /data/user_de/0 directory"/>
<variant name="ExternalDataRootUserDir"
summary="Android /data/media/0 directory"/>
<variant name="InternalDataDir" summary="Android /data/data directory"/>
<variant name="UserInstalledAppDir" summary="Android /data/app directory"/>
</variants>

<variants name="ArcAccessibilityFeatures">
<variant name="DockedMagnifier"/>
<variant name="FullscreenMagnifier"/>
Expand Down Expand Up @@ -92,6 +104,13 @@ chromium-metrics-reviews@google.com.
<variant name=".Unmanaged" summary="User with optional Play Store feature"/>
</variants>

<variants name="FileTypeByDirectoryOrNot">
<variant name="Directories" summary="directories"/>
<variant name="Files"
summary="files (all file system entries including directories)"/>
<variant name="NonDirectories" summary="non-directory files"/>
</variants>

<variants name="SuccessFailure">
<variant name=".Failure" summary="Operation failed"/>
<variant name=".Success" summary="Operation succeeded"/>
Expand Down Expand Up @@ -216,6 +235,70 @@ chromium-metrics-reviews@google.com.
<summary>The time elapsed for booting up the ARC instance.</summary>
</histogram>

<histogram name="Arc.AndroidData.PerApp.Size" units="KB"
expires_after="2023-07-01">
<owner>momohatt@google.com</owner>
<owner>arc-storage@google.com</owner>
<summary>
The total size of data an application has in Android /data directory. This
is defined as the per-application sum of the size of application-specific
directories in /data/app, /data/data, /data/media/0/Android/(data|obb) and
/data/user_de/0. The data is collected once per device, on the first ARC
boot after the device upgrades to a ChromeOS version with this metric.
</summary>
</histogram>

<histogram name="Arc.AndroidData.PerApp.{FileTypeByDirectoryOrNot}"
units="count" expires_after="2023-07-01">
<owner>momohatt@google.com</owner>
<owner>arc-storage@google.com</owner>
<summary>
The total number of {FileTypeByDirectoryOrNot} an application has in Android
/data directory. This is defined as the per-application sum of the numbers
in application-specific directories under /data/app, /data/data,
/data/media/0/Android/(data|obb) and /data/user_de/0. The data is collected
once per device, on the first ARC boot after the device upgrades to a
ChromeOS version with this metric.
</summary>
<token key="FileTypeByDirectoryOrNot" variants="FileTypeByDirectoryOrNot"/>
</histogram>

<histogram name="Arc.AndroidData.Total.{Target}.Size" units="KB"
expires_after="2023-07-01">
<owner>momohatt@google.com</owner>
<owner>arc-storage@google.com</owner>
<summary>
The size of {Target}. The data is collected once per device, on the first
ARC boot after the device upgrades to a ChromeOS version with this metric.
</summary>
<token key="Target" variants="AndroidDataSizeMeasurementTargetDirectories"/>
</histogram>

<histogram name="Arc.AndroidData.Total.{Target}.{FileTypeByDirectoryOrNot}"
units="count" expires_after="2023-07-01">
<owner>momohatt@google.com</owner>
<owner>arc-storage@google.com</owner>
<summary>
The number of {FileTypeByDirectoryOrNot} in {Target}. The data is collected
once per device, on the first ARC boot after the device upgrades to a
ChromeOS version with this metric.
</summary>
<token key="FileTypeByDirectoryOrNot" variants="FileTypeByDirectoryOrNot"/>
<token key="Target" variants="AndroidDataSizeMeasurementTargetDirectories"/>
</histogram>

<histogram name="Arc.AndroidData.TraversalDuration" units="ms"
expires_after="2023-07-01">
<owner>momohatt@google.com</owner>
<owner>arc-storage@google.com</owner>
<summary>
The duration of the file system traversal to take the statistics about the
content of Android /data directory. The data is collected once per device,
on the first ARC boot after the device upgrades to a ChromeOS version that
ships with this metric.
</summary>
</histogram>

<histogram name="Arc.Anr.{AnrPeriod}" units="ANRs" expires_after="2022-09-01">
<owner>khmel@google.com</owner>
<owner>alanding@google.com</owner>
Expand Down Expand Up @@ -1517,6 +1600,19 @@ chromium-metrics-reviews@google.com.
</token>
</histogram>

<histogram name="Arc.PlayFilesCount.{FileTypeByDirectoryOrNot}" units="count"
expires_after="2023-07-01">
<owner>momohatt@google.com</owner>
<owner>arc-storage@google.com</owner>
<summary>
The number of {FileTypeByDirectoryOrNot} under the &quot;Play files&quot;
folder in ChromeOS Files app except for the &quot;Android&quot; directory.
The data is collected once per device, on the first ARC boot after the
device upgrades to a ChromeOS version with this metric.
</summary>
<token key="FileTypeByDirectoryOrNot" variants="FileTypeByDirectoryOrNot"/>
</histogram>

<histogram name="Arc.PlayStoreLaunch.TimeDelta" units="ms"
expires_after="2022-09-01">
<owner>khmel@google.com</owner>
Expand Down

0 comments on commit 843efff

Please sign in to comment.