From 741e335458e16398ee4d3be2334cf70714e260a1 Mon Sep 17 00:00:00 2001 From: Ben Murdoch Date: Thu, 9 May 2019 11:27:28 +0100 Subject: [PATCH] Add Standby Bucket and job duration to ScheduledJobStateChanged atom. This fields enable us to slice job metrics by bucket and gain insight to the average time spent executing jobs in each bucket. The metrics we'll write for this data will help to tune thresholds for throttling background behavior in Q. BUG: 132227621 Test: make statsd_testdrive && statsd_testdrive 8 Change-Id: I1af94dc4a8e51f9741f48c817d1d2f99f164858d --- cmds/statsd/src/atoms.proto | 16 ++++++++++++++++ .../com/android/internal/app/IBatteryStats.aidl | 4 ++-- .../android/server/am/BatteryStatsService.java | 10 ++++++---- .../android/server/job/JobSchedulerService.java | 3 ++- .../android/server/job/JobServiceContext.java | 6 ++++-- 5 files changed, 30 insertions(+), 9 deletions(-) diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index f53ac1b770217..7bd7d6e18930f 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -745,6 +745,22 @@ message ScheduledJobStateChanged { // This is only applicable when the state is FINISHED. // The default value is STOP_REASON_UNKNOWN. optional android.app.job.StopReasonEnum stop_reason = 4; + + // The standby bucket of the app that scheduled the job. These match the framework constants + // defined in JobSchedulerService.java with the addition of UNKNOWN using -1, as ACTIVE is + // already assigned 0. + enum Bucket { + UNKNOWN = -1; + ACTIVE = 0; + WORKING_SET = 1; + FREQUENT = 2; + RARE = 3; + NEVER = 4; + } + optional Bucket standby_bucket = 5 [default = UNKNOWN]; + + // The job id (as assigned by the app). + optional int32 job_id = 6; } /** diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl index 114d31f207bda..d60d5438b3a74 100644 --- a/core/java/com/android/internal/app/IBatteryStats.aidl +++ b/core/java/com/android/internal/app/IBatteryStats.aidl @@ -71,8 +71,8 @@ interface IBatteryStats { void noteSyncStart(String name, int uid); void noteSyncFinish(String name, int uid); - void noteJobStart(String name, int uid); - void noteJobFinish(String name, int uid, int stopReason); + void noteJobStart(String name, int uid, int standbyBucket, int jobid); + void noteJobFinish(String name, int uid, int stopReason, int standbyBucket, int jobid); void noteStartWakelock(int uid, int pid, String name, String historyName, int type, boolean unimportantForLogging); diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index f86ba278138c7..e2b59b45e1e6c 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -467,23 +467,25 @@ public final class BatteryStatsService extends IBatteryStats.Stub } } - public void noteJobStart(String name, int uid) { + /** A scheduled job was started. */ + public void noteJobStart(String name, int uid, int standbyBucket, int jobid) { enforceCallingPermission(); synchronized (mStats) { mStats.noteJobStartLocked(name, uid); StatsLog.write_non_chained(StatsLog.SCHEDULED_JOB_STATE_CHANGED, uid, null, name, StatsLog.SCHEDULED_JOB_STATE_CHANGED__STATE__STARTED, - JobProtoEnums.STOP_REASON_UNKNOWN); + JobProtoEnums.STOP_REASON_UNKNOWN, standbyBucket, jobid); } } - public void noteJobFinish(String name, int uid, int stopReason) { + /** A scheduled job was finished. */ + public void noteJobFinish(String name, int uid, int stopReason, int standbyBucket, int jobid) { enforceCallingPermission(); synchronized (mStats) { mStats.noteJobFinishLocked(name, uid, stopReason); StatsLog.write_non_chained(StatsLog.SCHEDULED_JOB_STATE_CHANGED, uid, null, name, StatsLog.SCHEDULED_JOB_STATE_CHANGED__STATE__FINISHED, - stopReason); + stopReason, standbyBucket, jobid); } } diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java index 35a82aef51b55..ea1c49daefb94 100644 --- a/services/core/java/com/android/server/job/JobSchedulerService.java +++ b/services/core/java/com/android/server/job/JobSchedulerService.java @@ -1057,7 +1057,8 @@ public class JobSchedulerService extends com.android.server.SystemService StatsLog.write_non_chained(StatsLog.SCHEDULED_JOB_STATE_CHANGED, uId, null, jobStatus.getBatteryName(), StatsLog.SCHEDULED_JOB_STATE_CHANGED__STATE__SCHEDULED, - JobProtoEnums.STOP_REASON_CANCELLED); + JobProtoEnums.STOP_REASON_CANCELLED, jobStatus.getStandbyBucket(), + jobStatus.getJobId()); // If the job is immediately ready to run, then we can just immediately // put it in the pending list and try to schedule it. This is especially diff --git a/services/core/java/com/android/server/job/JobServiceContext.java b/services/core/java/com/android/server/job/JobServiceContext.java index a349d875c1ffa..7689bd26a1939 100644 --- a/services/core/java/com/android/server/job/JobServiceContext.java +++ b/services/core/java/com/android/server/job/JobServiceContext.java @@ -265,7 +265,8 @@ public final class JobServiceContext implements ServiceConnection { } mJobPackageTracker.noteActive(job); try { - mBatteryStats.noteJobStart(job.getBatteryName(), job.getSourceUid()); + mBatteryStats.noteJobStart(job.getBatteryName(), job.getSourceUid(), + job.getStandbyBucket(), job.getJobId()); } catch (RemoteException e) { // Whatever. } @@ -774,7 +775,8 @@ public final class JobServiceContext implements ServiceConnection { mJobPackageTracker.noteInactive(completedJob, mParams.getStopReason(), reason); try { mBatteryStats.noteJobFinish(mRunningJob.getBatteryName(), - mRunningJob.getSourceUid(), mParams.getStopReason()); + mRunningJob.getSourceUid(), mParams.getStopReason(), + mRunningJob.getStandbyBucket(), mRunningJob.getJobId()); } catch (RemoteException e) { // Whatever. }