Skip to content

Commit

Permalink
Added UMA metrics to record background task duration
Browse files Browse the repository at this point in the history
This CL adds metrics to record the length of background task for each
type of tasks. The metrics was added for both JobService and alarm
manager type of tasks. GCM manager type was excluded since it is only
used for Android L and below. The uma stats were directly passed to
the recorder in BackgroundTaskSchedulerUma instead of the existing
pattern of caching and flushing to disk after native is loaded.
UMA seems to already have a similar caching mechanism in-built
which eliminates the need for it.

Bug: 1291584
Change-Id: Ia0720e94c605add7af2f0bdbcaeae1ef23161ef7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3635420
Reviewed-by: Tommy Nyquist <nyquist@chromium.org>
Reviewed-by: Tomasz Wiszkowski <ender@google.com>
Commit-Queue: Shakti Sahu <shaktisahu@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1002431}
  • Loading branch information
Shakti Sahu authored and Chromium LUCI CQ committed May 12, 2022
1 parent 3cf88ac commit 803f0c1
Show file tree
Hide file tree
Showing 5 changed files with 134 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -143,4 +143,71 @@ public static int toUmaEnumValueFromTaskId(int taskId) {
// Returning a value that is not expected to ever be reported.
return BACKGROUND_TASK_NOT_FOUND;
}

/**
* Keep this in sync with TaskType variant in
* //tools/metrics/histograms/metadata/android/histograms.xml.
* @return The histogram pattern to be used for the given {@code taskId}.
*/
@VisibleForTesting(otherwise = VisibleForTesting.PROTECTED)
public String getHistogramPatternForTaskId(int taskId) {
switch (taskId) {
case TaskIds.TEST:
return "Test";
case TaskIds.OMAHA_JOB_ID:
return "Omaha";
case TaskIds.GCM_BACKGROUND_TASK_JOB_ID:
return "Gcm";
case TaskIds.NOTIFICATION_SERVICE_JOB_ID:
return "NotificationService";
case TaskIds.WEBVIEW_MINIDUMP_UPLOADING_JOB_ID:
return "WebviewMinidumpUploading";
case TaskIds.CHROME_MINIDUMP_UPLOADING_JOB_ID:
return "ChromeMinidumpUploading";
case TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID:
return "OfflinePages";
case TaskIds.OFFLINE_PAGES_PREFETCH_JOB_ID:
return "OfflinePagesPrefetch";
case TaskIds.DOWNLOAD_SERVICE_JOB_ID:
return "DownloadService";
case TaskIds.DOWNLOAD_CLEANUP_JOB_ID:
return "DownloadCleanup";
case TaskIds.DOWNLOAD_AUTO_RESUMPTION_JOB_ID:
return "DownloadAutoResumption";
case TaskIds.DOWNLOAD_LATER_JOB_ID:
return "DownloadLater";
case TaskIds.WEBVIEW_VARIATIONS_SEED_FETCH_JOB_ID:
return "WebviewVariationsSeedFetch";
case TaskIds.OFFLINE_PAGES_PREFETCH_NOTIFICATION_JOB_ID:
return "OfflinePagesPrefetchNotification";
case TaskIds.WEBAPK_UPDATE_JOB_ID:
return "WebApkUpdate";
case TaskIds.DEPRECATED_DOWNLOAD_RESUMPTION_JOB_ID:
return "DeprecatedDownloadResumption";
case TaskIds.FEED_REFRESH_JOB_ID:
return "FeedRefresh";
case TaskIds.COMPONENT_UPDATE_JOB_ID:
return "ComponentUpdate";
case TaskIds.DEPRECATED_EXPLORE_SITES_REFRESH_JOB_ID:
return "DeprecatedExploreSitesRefresh";
case TaskIds.EXPLORE_SITES_REFRESH_JOB_ID:
return "ExploreSitesRefresh";
case TaskIds.BACKGROUND_SYNC_ONE_SHOT_JOB_ID:
return "BackgroundSyncOneShot";
case TaskIds.NOTIFICATION_SCHEDULER_JOB_ID:
return "NotificationScheduler";
case TaskIds.NOTIFICATION_TRIGGER_JOB_ID:
return "NotificationTrigger";
case TaskIds.PERIODIC_BACKGROUND_SYNC_CHROME_WAKEUP_TASK_JOB_ID:
return "PeriodicBackgroundSyncChromeWakeup";
case TaskIds.QUERY_TILE_JOB_ID:
return "QueryTile";
case TaskIds.FEEDV2_REFRESH_JOB_ID:
return "FeedV2Refresh";
case TaskIds.WEBVIEW_COMPONENT_UPDATE_JOB_ID:
return "WebviewComponentUpdate";
}
assert false;
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import android.os.BatteryManager;
import android.os.Build;
import android.os.PowerManager;
import android.os.SystemClock;
import android.text.format.DateUtils;

import androidx.annotation.Nullable;
Expand Down Expand Up @@ -49,6 +50,7 @@ private static class TaskExecutor implements BackgroundTask.TaskFinishedCallback
private final PowerManager.WakeLock mWakeLock;
private final TaskParameters mTaskParams;
private final BackgroundTask mBackgroundTask;
private final long mTaskStartTimeMs;

private boolean mHasExecuted;

Expand All @@ -58,6 +60,7 @@ public TaskExecutor(Context context, PowerManager.WakeLock wakeLock,
mWakeLock = wakeLock;
mTaskParams = taskParams;
mBackgroundTask = backgroundTask;
mTaskStartTimeMs = SystemClock.uptimeMillis();
}

public void execute() {
Expand Down Expand Up @@ -99,7 +102,8 @@ private void finished(boolean reschedule) {
BackgroundTaskSchedulerUma.getInstance().reportTaskRescheduled();
mBackgroundTask.reschedule(mContext);
}
// TODO(crbug.com/970160): Add UMA to record how long the tasks need to complete.
BackgroundTaskSchedulerUma.getInstance().reportTaskFinished(
mTaskParams.getTaskId(), SystemClock.uptimeMillis() - mTaskStartTimeMs);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

import android.app.job.JobParameters;
import android.app.job.JobService;
import android.os.SystemClock;

import androidx.annotation.VisibleForTesting;

Expand Down Expand Up @@ -34,12 +35,17 @@ private static class TaskFinishedCallbackJobService
private final BackgroundTaskJobService mJobService;
private final BackgroundTask mBackgroundTask;
private final JobParameters mParams;
private final long mTaskStartTimeMs;

TaskFinishedCallbackJobService(BackgroundTaskJobService jobService,
BackgroundTask backgroundTask, JobParameters params) {
mJobService = jobService;
mBackgroundTask = backgroundTask;
mParams = params;

// We are using uptimeMillis here to record the exact amount of time needed for the task
// to run that excludes the time spent during deep sleep.
mTaskStartTimeMs = SystemClock.uptimeMillis();
}

@Override
Expand All @@ -60,6 +66,8 @@ public void run() {

mJobService.mCurrentTasks.remove(mParams.getJobId());
mJobService.jobFinished(mParams, needsReschedule);
BackgroundTaskSchedulerUma.getInstance().reportTaskFinished(
mParams.getJobId(), SystemClock.uptimeMillis() - mTaskStartTimeMs);
}
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
package org.chromium.components.background_task_scheduler.internal;

import android.content.SharedPreferences;
import android.text.format.DateUtils;

import androidx.annotation.VisibleForTesting;

Expand Down Expand Up @@ -155,6 +156,13 @@ public void reportTaskStopped(int taskId) {
cacheEvent("Android.BackgroundTaskScheduler.TaskStopped", toUmaEnumValueFromTaskId(taskId));
}

/** Reports metrics for finishing a task. */
public void reportTaskFinished(int taskId, long taskDurationMs) {
RecordHistogram.recordCustomTimesHistogram("Android.BackgroundTaskScheduler.TaskFinished."
+ getHistogramPatternForTaskId(taskId),
taskDurationMs, 1, DateUtils.DAY_IN_MILLIS, 50);
}

/** Reports metrics for rescheduling a task. */
public void reportTaskRescheduled() {
cacheEvent("Android.BackgroundTaskScheduler.TaskRescheduled", 0);
Expand Down
46 changes: 46 additions & 0 deletions tools/metrics/histograms/metadata/android/histograms.xml
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,41 @@ chromium-metrics-reviews@google.com.
<variant name=".VrServicesUpgrade"/>
</variants>

<variants name="TaskType">
<variant name="BackgroundSyncOneShot" summary="BackgroundSyncOneShot"/>
<variant name="ChromeMinidumpUploading" summary="ChromeMinidumpUploading"/>
<variant name="ComponentUpdate" summary="ComponentUpdate"/>
<variant name="DeprecatedDownloadResumption"
summary="DeprecatedDownloadResumption"/>
<variant name="DeprecatedExploreSitesRefresh"
summary="DeprecatedExploreSitesRefresh"/>
<variant name="DownloadAutoResumption" summary="DownloadAutoResumption"/>
<variant name="DownloadCleanup" summary="DownloadCleanup"/>
<variant name="DownloadLater" summary="DownloadLater"/>
<variant name="DownloadService" summary="DownloadService"/>
<variant name="ExploreSitesRefresh" summary="ExploreSitesRefresh"/>
<variant name="FeedRefresh" summary="FeedRefresh"/>
<variant name="FeedV2Refresh" summary="FeedV2Refresh"/>
<variant name="Gcm" summary="Gcm"/>
<variant name="NotificationScheduler" summary="NotificationScheduler"/>
<variant name="NotificationService" summary="NotificationService"/>
<variant name="NotificationTrigger" summary="NotificationTrigger"/>
<variant name="OfflinePages" summary="OfflinePages"/>
<variant name="OfflinePagesPrefetch" summary="OfflinePagesPrefetch"/>
<variant name="OfflinePagesPrefetchNotification"
summary="OfflinePagesPrefetchNotification"/>
<variant name="Omaha" summary="Omaha"/>
<variant name="PeriodicBackgroundSyncChromeWakeup"
summary="PeriodicBackgroundSyncChromeWakeup"/>
<variant name="QueryTile" summary="QueryTile"/>
<variant name="Test" summary="Test"/>
<variant name="WebApkUpdate" summary="WebApkUpdate"/>
<variant name="WebviewComponentUpdate" summary="WebviewComponentUpdate"/>
<variant name="WebviewMinidumpUploading" summary="WebviewMinidumpUploading"/>
<variant name="WebviewVariationsSeedFetch"
summary="WebviewVariationsSeedFetch"/>
</variants>

<variants name="ThumbnailProvider_ClientType">
<variant name=".DownloadHome" summary="Download home"/>
<variant name=".NTPSnippets" summary="NTP snippets"/>
Expand Down Expand Up @@ -492,6 +527,17 @@ chromium-metrics-reviews@google.com.
</summary>
</histogram>

<histogram name="Android.BackgroundTaskScheduler.TaskFinished.{TaskType}"
units="ms" expires_after="2022-11-01">
<owner>shaktisahu@chromium.org</owner>
<owner>nyquist@chromium.org</owner>
<summary>
Records the time (uptimeMillis) taken by a background task of type
{TaskType}. Recorded when the task finished callback is invoked.
</summary>
<token key="TaskType" variants="TaskType"/>
</histogram>

<histogram name="Android.BackgroundTaskScheduler.TaskLoadedNative"
enum="BackgroundTaskId" expires_after="2022-09-11">
<owner>fgorski@chromium.org</owner>
Expand Down

0 comments on commit 803f0c1

Please sign in to comment.