Add Wear Power Anomaly Service atoms Metrics Design: https://eldar.corp.google.com/assessments/562471828/revisions/1?jsmode=o#sections/999001 Test: statsd_testdrive after cherry-pick to tm-wear-dev Bug: b/262273214 Change-Id: I85c81a19317161f9ae88a41769ff5370299b2a7f
diff --git a/stats/Android.bp b/stats/Android.bp index b963c5d..98e8a2f 100644 --- a/stats/Android.bp +++ b/stats/Android.bp
@@ -114,6 +114,7 @@ "atoms/wear/media/*.proto", "atoms/media/*.proto", "atoms/adservices/*.proto", + "atoms/wearpas/*.proto", ] cc_library_host_shared {
diff --git a/stats/atoms.proto b/stats/atoms.proto index 6dee7c3..4f76d86 100644 --- a/stats/atoms.proto +++ b/stats/atoms.proto
@@ -966,6 +966,9 @@ extensions 616; // HealthConnectApiCalled health_connect_api_called extensions 617; // HealthConnectUsageStats health_usage_stats extensions 618; // HealthConnectStorageStats health_connect_storage_stats + extensions 619; // WearAdaptiveSuspendStatsReported wear_adaptive_suspend_stats_reported + extensions 620; // WearPowerAnomalyServiceOperationalStatsReported wear_power_anomaly_service_operational_stats_reported + extensions 621; // WearPowerAnomalyServiceEventStatsReported wear_power_anomaly_service_event_stats_reported extensions 9999; // Atom9999 atom_9999 // Pulled events will start at field 10000.
diff --git a/stats/atoms/wearpas/wearpas_extension_atoms.proto b/stats/atoms/wearpas/wearpas_extension_atoms.proto new file mode 100644 index 0000000..2a5cc5a --- /dev/null +++ b/stats/atoms/wearpas/wearpas_extension_atoms.proto
@@ -0,0 +1,217 @@ +syntax = "proto2"; + +package android.os.statsd.wearpas; + +option java_package = "com.android.os.wearpas"; + +import "frameworks/proto_logging/stats/atoms.proto"; +import "frameworks/proto_logging/stats/atom_field_options.proto"; + +extend Atom { + optional WearAdaptiveSuspendStatsReported wear_adaptive_suspend_stats_reported = 619 [(module) = "wearpas"]; + + optional WearPowerAnomalyServiceOperationalStatsReported wear_power_anomaly_service_operational_stats_reported = 620 [(module) = "wearpas"]; + + optional WearPowerAnomalyServiceEventStatsReported wear_power_anomaly_service_event_stats_reported = 621 [(module) = "wearpas"]; +} + +/** + * Logs cumulative stats about the Adaptive Suspend algorithm + */ +message WearAdaptiveSuspendStatsReported { + /* Elapsed time covered by the data in this interval */ + optional int32 data_interval_millis = 1; + + /* Number of suspend attempts during this interval */ + optional int32 total_suspend_attempts = 2; + + /** + * Number of suspend attempts that failed during this interval, a subset of + * total_suspend_attempts + */ + optional int32 total_failed_suspends = 3; + + /** + * Number of successful suspends with duration < configured break-even during + * this interval. + */ + optional int32 total_short_suspends = 4; + + /** + * Time spent in suspend with duration >= configured break-even, + * during this interval. + */ + optional int32 time_suspended_long_millis = 5; + + /** + * Time spent in suspend with duration < configured break-even, + * during this interval + */ + optional int32 time_suspended_short_millis = 6; + + /** + * The break-even time configured from the server based on local offline power + * testing. + */ + optional int32 break_even_millis = 7; + + /** + * Time spent doing suspend/resume work for all successful suspends during + * this interval, regardless of short vs long suspend duration. + */ + optional int32 time_suspending_success_millis = 8; + + /** + * Time spent doing suspend/resume work for all failed suspend attempts during + * this interval. + */ + optional int32 time_suspending_fail_millis = 9; + + /** + * Number of times suspend backoff started during this interval. + */ + optional int32 new_backoffs = 10; + + /** + * Number of times suspend backoff continued, either multiplying the backoff + * or remaining at the max backoff, during this interval. + */ + optional int32 backoff_continuations = 11; + + /** + * Time spent in backoff during this interval. i.e. Total of individual + * backoff durations, each of which is measured from the moment a "new + * backoff" is initiated to the time beginning of the successful suspend that + * causes backoff to end, which will be some time before the backoff is + * actually ended. + */ + optional int32 time_backed_off_millis = 12; + + /** + * A randomly selected suspend duration, to establish aggregate distributions + */ + optional int32 sampled_suspend_duration_millis = 13; +} + +/** + * Logs cumulative stats about the Power Anomaly Service + */ +message WearPowerAnomalyServiceOperationalStatsReported { + /* Duration of the monitoring operation */ + optional int32 monitoring_duration_millis = 1; + + /* Elapsed time between the start of the previous operation and this one */ + optional int32 interval_duration_millis = 2; + + /* Current flash storage size used by PAS */ + optional int32 persist_size = 3; + + /** + * 1 if PAS had to start from cold (i.e. perform initialization), 0 if it was + * still resident in memory from a previous operation. This is an int32 for + * cumulative metrics. + */ + optional int32 cold_start = 4; + + /* Number of data provider errors encountered */ + optional int32 data_provider_error_count = 5; + + /* Number of rule evaluation errors encountered */ + optional int32 rule_evaluation_error_count = 6; + + /* Number of reaction handling errors encountered */ + optional int32 reaction_error_count = 7; + + /** + * Number of infrastructure errors encountered (e.g. storage, cross-app comms, + * config access, etc) + */ + optional int32 infrastructure_error_count = 8; + + /** + * Total number of new anomalies detected during the just-completed operation + */ + optional int32 new_anomaly_count = 9; + + /** + * Total anomalies active at the end of the just-completed operation + * (including previously detected anomalies) + */ + optional int32 active_anomaly_count = 10; +} + +/** + * Logs event stats about the Power Anomaly Service + */ +message WearPowerAnomalyServiceEventStatsReported { + enum EntityType { + UNDEFINED = 0; + POWER_RAIL = 1; + SUBSYSTEM_RESIDENCY = 2; + KERNEL_SUSPEND = 3; + KERNEL_WAKE_REASON = 4; + CPU_TIME = 5; + KERNEL_WAKESOURCE = 6; + NATIVE_WAKELOCK = 7; + FRAMEWORK_WAKELOCK = 8; + COULOMB_COUNTER = 9; + NOTIFICATIONS = 10; + USAGE_SCALAR = 11; + USAGE_RESIDENCY = 12; + BLUETOOTH = 13; + } + + enum Status { + /** + * If the triggered anomaly rule does not have additional reactions beyond + * "WW stats" and "bugreport", this will be sent once upon detection. + */ + NEW_NO_REACTIONS = 0; + + /** + * If the triggered anomaly rule does have additional reactions, this will + * be sent once upon detection and be followed by one of + * {RESOLVED_POST_REACTIONS, UNRESOLVED_POST_REACTIONS} + */ + NEW_REACTIONS_PENDING = 1; + + /** + * Following an anomaly with additional reactions, this will be sent if the + * reactions have resolved the anomaly. + */ + RESOLVED_POST_REACTIONS = 2; + + /** + * Following an anomaly with additional reactions, this will be sent if the + * reactions have not resolved the anomaly. + */ + UNRESOLVED_POST_REACTIONS = 3; + + /** + * Following an anomaly with bugreport triggering enabled, this will be sent + * if a bugreport is actually triggered (e.g. if rate limiting allows). + */ + BUGREPORT_TRIGGERED = 4; + } + + /* Power entity type for which an anomaly was detected */ + optional EntityType entity_type = 1; + + /* Name of the power entity showing anomalous behavior */ + optional string entity_name = 2; + + /** + * Anomaly rule ID (from the PAS configuration rules distributed via + * Phenotype) + */ + optional int32 rule_id = 3; + + /** + * Resource ID for standard Google stock apps/resources + * (ONLY FACTORY GOOGLE FLASHED APPS). Mapping is stored server-side. + */ + optional int32 resource_holder_id = 4; + + /* The current status of the anomaly */ + optional Status status = 5; +} \ No newline at end of file