Loading proto/src/metrics_constants.proto +28 −0 Original line number Diff line number Diff line Loading @@ -5229,6 +5229,34 @@ message MetricsEvent { // OS: P DIALOG_TV_NETWORK_PROXY = 1301; // Events for battery saver turning on/off and/or the interactive state changes. // OS: P BATTERY_SAVER = 1302; // Device interactive state -- i.e. the screen ON (=1) or OFF (=1) // OS: P FIELD_INTERACTIVE = 1303; // Time spent in milliseconds in the current mode. // OS: P FIELD_DURATION_MILLIS = 1304; // Battery level in uA (0 - ~3,000,000 depending on device) when the current "mode" started. // OS: P FIELD_START_BATTERY_UA = 1305; // Battery level in uA (0 - ~3,000,000 depending on device) when this event was created. // OS: P FIELD_END_BATTERY_UA = 1306; // Battery level in % (0-100) when the current "mode" started. // OS: P FIELD_START_BATTERY_PERCENT = 1307; // Battery level in % (0-100) when this event was created. // OS: P FIELD_END_BATTERY_PERCENT = 1308; // ---- End P Constants, all P constants go above this line ---- // Add new aosp constants above this line. // END OF AOSP CONSTANTS Loading services/core/java/com/android/server/power/batterysaver/BatterySavingStats.java +26 −25 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ */ package com.android.server.power.batterysaver; import android.metrics.LogMaker; import android.os.BatteryManagerInternal; import android.os.SystemClock; import android.util.ArrayMap; Loading @@ -23,6 +24,8 @@ import android.util.Slog; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.server.EventLogTags; import com.android.server.LocalServices; import com.android.server.power.BatterySaverPolicy; Loading @@ -43,6 +46,9 @@ public class BatterySavingStats { private static final boolean DEBUG = BatterySaverPolicy.DEBUG; @VisibleForTesting static final boolean SEND_TRON_EVENTS = true; private final Object mLock = new Object(); /** Whether battery saver is on or off. */ Loading Loading @@ -132,15 +138,6 @@ public class BatterySavingStats { } } @VisibleForTesting static final String COUNTER_POWER_PERCENT_PREFIX = "battery_saver_stats_percent_"; @VisibleForTesting static final String COUNTER_POWER_MILLIAMPS_PREFIX = "battery_saver_stats_milliamps_"; @VisibleForTesting static final String COUNTER_TIME_SECONDS_PREFIX = "battery_saver_stats_seconds_"; private static BatterySavingStats sInstance; private BatteryManagerInternal mBatteryManagerInternal; Loading Loading @@ -427,10 +424,9 @@ public class BatterySavingStats { if (stateChanging) { if (mLastState >= 0) { final long deltaTime = now - mStartTime; final int deltaBattery = mStartBatteryLevel - batteryLevel; final int deltaPercent = mStartPercent - batteryPercent; report(mLastState, deltaTime, deltaBattery, deltaPercent); report(mLastState, deltaTime, mStartBatteryLevel, mStartPercent, batteryLevel, batteryPercent); } mStartTime = now; mStartBatteryLevel = batteryLevel; Loading @@ -439,23 +435,28 @@ public class BatterySavingStats { mLastState = newState; } String getCounterSuffix(int state) { final boolean batterySaver = void report(int state, long deltaTimeMs, int startBatteryLevelUa, int startBatteryLevelPercent, int endBatteryLevelUa, int endBatteryLevelPercent) { if (!SEND_TRON_EVENTS) { return; } final boolean batterySaverOn = BatterySaverState.fromIndex(state) != BatterySaverState.OFF; final boolean interactive = InteractiveState.fromIndex(state) != InteractiveState.NON_INTERACTIVE; if (batterySaver) { return interactive ? "11" : "10"; } else { return interactive ? "01" : "00"; } } void report(int state, long deltaTimeMs, int deltaBatteryUa, int deltaPercent) { final String suffix = getCounterSuffix(state); mMetricsLogger.count(COUNTER_POWER_MILLIAMPS_PREFIX + suffix, deltaBatteryUa / 1000); mMetricsLogger.count(COUNTER_POWER_PERCENT_PREFIX + suffix, deltaPercent); mMetricsLogger.count(COUNTER_TIME_SECONDS_PREFIX + suffix, (int) (deltaTimeMs / 1000)); final LogMaker logMaker = new LogMaker(MetricsProto.MetricsEvent.BATTERY_SAVER) .setSubtype(batterySaverOn ? 1 : 0) .addTaggedData(MetricsEvent.FIELD_INTERACTIVE, interactive ? 1 : 0) .addTaggedData(MetricsEvent.FIELD_DURATION_MILLIS, deltaTimeMs) .addTaggedData(MetricsEvent.FIELD_START_BATTERY_UA, startBatteryLevelUa) .addTaggedData(MetricsEvent.FIELD_START_BATTERY_PERCENT, startBatteryLevelPercent) .addTaggedData(MetricsEvent.FIELD_END_BATTERY_UA, endBatteryLevelUa) .addTaggedData(MetricsEvent.FIELD_END_BATTERY_PERCENT, endBatteryLevelPercent); mMetricsLogger.write(logMaker); } } } services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySavingStatsTest.java +32 −15 Original line number Diff line number Diff line Loading @@ -15,25 +15,30 @@ */ package com.android.server.power.batterysaver; import static com.android.server.power.batterysaver.BatterySavingStats.SEND_TRON_EVENTS; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import android.metrics.LogMaker; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.server.power.batterysaver.BatterySavingStats.BatterySaverState; import com.android.server.power.batterysaver.BatterySavingStats.DozeState; import com.android.server.power.batterysaver.BatterySavingStats.InteractiveState; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import java.io.ByteArrayOutputStream; import java.io.PrintWriter; Loading Loading @@ -222,8 +227,28 @@ public class BatterySavingStatsTest { target.toDebugString()); } private void assertMetricsLog(String counter, int value) { verify(mMetricsLogger, times(1)).count(eq(counter), eq(value)); private void assertLog(boolean batterySaver, boolean interactive, long deltaTimeMs, int deltaBatteryLevelUa, int deltaBatteryLevelPercent) { if (SEND_TRON_EVENTS) { ArgumentCaptor<LogMaker> ac = ArgumentCaptor.forClass(LogMaker.class); verify(mMetricsLogger, times(1)).write(ac.capture()); LogMaker lm = ac.getValue(); assertEquals(MetricsEvent.BATTERY_SAVER, lm.getCategory()); assertEquals(batterySaver ? 1 : 0, lm.getTaggedData(MetricsEvent.RESERVED_FOR_LOGBUILDER_SUBTYPE)); assertEquals(interactive ? 1 : 0, lm.getTaggedData(MetricsEvent.FIELD_INTERACTIVE)); assertEquals(deltaTimeMs, lm.getTaggedData(MetricsEvent.FIELD_DURATION_MILLIS)); assertEquals(deltaBatteryLevelUa, (int) lm.getTaggedData(MetricsEvent.FIELD_START_BATTERY_UA) - (int) lm.getTaggedData(MetricsEvent.FIELD_END_BATTERY_UA)); assertEquals(deltaBatteryLevelPercent, (int) lm.getTaggedData(MetricsEvent.FIELD_START_BATTERY_PERCENT) - (int) lm.getTaggedData(MetricsEvent.FIELD_END_BATTERY_PERCENT)); } else { verify(mMetricsLogger, times(0)).write(any(LogMaker.class)); } } @Test Loading @@ -249,9 +274,7 @@ public class BatterySavingStatsTest { InteractiveState.NON_INTERACTIVE, DozeState.NOT_DOZING); assertMetricsLog(BatterySavingStats.COUNTER_POWER_MILLIAMPS_PREFIX + "01", 2); assertMetricsLog(BatterySavingStats.COUNTER_POWER_PERCENT_PREFIX + "01", 200); assertMetricsLog(BatterySavingStats.COUNTER_TIME_SECONDS_PREFIX + "01", 60); assertLog(false, true, 60_000, 2000, 200); target.advanceClock(1); target.drainBattery(2000); Loading Loading @@ -282,9 +305,7 @@ public class BatterySavingStatsTest { InteractiveState.INTERACTIVE, DozeState.NOT_DOZING); assertMetricsLog(BatterySavingStats.COUNTER_POWER_MILLIAMPS_PREFIX + "00", 2 * 3); assertMetricsLog(BatterySavingStats.COUNTER_POWER_PERCENT_PREFIX + "00", 200 * 3); assertMetricsLog(BatterySavingStats.COUNTER_TIME_SECONDS_PREFIX + "00", 60 * 3); assertLog(false, false, 60_000 * 3, 2000 * 3, 200 * 3); target.advanceClock(10); target.drainBattery(10000); Loading @@ -292,9 +313,7 @@ public class BatterySavingStatsTest { reset(mMetricsLogger); target.startCharging(); assertMetricsLog(BatterySavingStats.COUNTER_POWER_MILLIAMPS_PREFIX + "11", 10); assertMetricsLog(BatterySavingStats.COUNTER_POWER_PERCENT_PREFIX + "11", 1000); assertMetricsLog(BatterySavingStats.COUNTER_TIME_SECONDS_PREFIX + "11", 60 * 10); assertLog(true, true, 60_000 * 10, 10000, 1000); target.advanceClock(1); target.drainBattery(2000); Loading @@ -312,8 +331,6 @@ public class BatterySavingStatsTest { target.startCharging(); assertMetricsLog(BatterySavingStats.COUNTER_POWER_MILLIAMPS_PREFIX + "10", 2); assertMetricsLog(BatterySavingStats.COUNTER_POWER_PERCENT_PREFIX + "10", 200); assertMetricsLog(BatterySavingStats.COUNTER_TIME_SECONDS_PREFIX + "10", 60); assertLog(true, false, 60_000, 2000, 200); } } Loading
proto/src/metrics_constants.proto +28 −0 Original line number Diff line number Diff line Loading @@ -5229,6 +5229,34 @@ message MetricsEvent { // OS: P DIALOG_TV_NETWORK_PROXY = 1301; // Events for battery saver turning on/off and/or the interactive state changes. // OS: P BATTERY_SAVER = 1302; // Device interactive state -- i.e. the screen ON (=1) or OFF (=1) // OS: P FIELD_INTERACTIVE = 1303; // Time spent in milliseconds in the current mode. // OS: P FIELD_DURATION_MILLIS = 1304; // Battery level in uA (0 - ~3,000,000 depending on device) when the current "mode" started. // OS: P FIELD_START_BATTERY_UA = 1305; // Battery level in uA (0 - ~3,000,000 depending on device) when this event was created. // OS: P FIELD_END_BATTERY_UA = 1306; // Battery level in % (0-100) when the current "mode" started. // OS: P FIELD_START_BATTERY_PERCENT = 1307; // Battery level in % (0-100) when this event was created. // OS: P FIELD_END_BATTERY_PERCENT = 1308; // ---- End P Constants, all P constants go above this line ---- // Add new aosp constants above this line. // END OF AOSP CONSTANTS Loading
services/core/java/com/android/server/power/batterysaver/BatterySavingStats.java +26 −25 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ */ package com.android.server.power.batterysaver; import android.metrics.LogMaker; import android.os.BatteryManagerInternal; import android.os.SystemClock; import android.util.ArrayMap; Loading @@ -23,6 +24,8 @@ import android.util.Slog; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.server.EventLogTags; import com.android.server.LocalServices; import com.android.server.power.BatterySaverPolicy; Loading @@ -43,6 +46,9 @@ public class BatterySavingStats { private static final boolean DEBUG = BatterySaverPolicy.DEBUG; @VisibleForTesting static final boolean SEND_TRON_EVENTS = true; private final Object mLock = new Object(); /** Whether battery saver is on or off. */ Loading Loading @@ -132,15 +138,6 @@ public class BatterySavingStats { } } @VisibleForTesting static final String COUNTER_POWER_PERCENT_PREFIX = "battery_saver_stats_percent_"; @VisibleForTesting static final String COUNTER_POWER_MILLIAMPS_PREFIX = "battery_saver_stats_milliamps_"; @VisibleForTesting static final String COUNTER_TIME_SECONDS_PREFIX = "battery_saver_stats_seconds_"; private static BatterySavingStats sInstance; private BatteryManagerInternal mBatteryManagerInternal; Loading Loading @@ -427,10 +424,9 @@ public class BatterySavingStats { if (stateChanging) { if (mLastState >= 0) { final long deltaTime = now - mStartTime; final int deltaBattery = mStartBatteryLevel - batteryLevel; final int deltaPercent = mStartPercent - batteryPercent; report(mLastState, deltaTime, deltaBattery, deltaPercent); report(mLastState, deltaTime, mStartBatteryLevel, mStartPercent, batteryLevel, batteryPercent); } mStartTime = now; mStartBatteryLevel = batteryLevel; Loading @@ -439,23 +435,28 @@ public class BatterySavingStats { mLastState = newState; } String getCounterSuffix(int state) { final boolean batterySaver = void report(int state, long deltaTimeMs, int startBatteryLevelUa, int startBatteryLevelPercent, int endBatteryLevelUa, int endBatteryLevelPercent) { if (!SEND_TRON_EVENTS) { return; } final boolean batterySaverOn = BatterySaverState.fromIndex(state) != BatterySaverState.OFF; final boolean interactive = InteractiveState.fromIndex(state) != InteractiveState.NON_INTERACTIVE; if (batterySaver) { return interactive ? "11" : "10"; } else { return interactive ? "01" : "00"; } } void report(int state, long deltaTimeMs, int deltaBatteryUa, int deltaPercent) { final String suffix = getCounterSuffix(state); mMetricsLogger.count(COUNTER_POWER_MILLIAMPS_PREFIX + suffix, deltaBatteryUa / 1000); mMetricsLogger.count(COUNTER_POWER_PERCENT_PREFIX + suffix, deltaPercent); mMetricsLogger.count(COUNTER_TIME_SECONDS_PREFIX + suffix, (int) (deltaTimeMs / 1000)); final LogMaker logMaker = new LogMaker(MetricsProto.MetricsEvent.BATTERY_SAVER) .setSubtype(batterySaverOn ? 1 : 0) .addTaggedData(MetricsEvent.FIELD_INTERACTIVE, interactive ? 1 : 0) .addTaggedData(MetricsEvent.FIELD_DURATION_MILLIS, deltaTimeMs) .addTaggedData(MetricsEvent.FIELD_START_BATTERY_UA, startBatteryLevelUa) .addTaggedData(MetricsEvent.FIELD_START_BATTERY_PERCENT, startBatteryLevelPercent) .addTaggedData(MetricsEvent.FIELD_END_BATTERY_UA, endBatteryLevelUa) .addTaggedData(MetricsEvent.FIELD_END_BATTERY_PERCENT, endBatteryLevelPercent); mMetricsLogger.write(logMaker); } } }
services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySavingStatsTest.java +32 −15 Original line number Diff line number Diff line Loading @@ -15,25 +15,30 @@ */ package com.android.server.power.batterysaver; import static com.android.server.power.batterysaver.BatterySavingStats.SEND_TRON_EVENTS; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import android.metrics.LogMaker; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.server.power.batterysaver.BatterySavingStats.BatterySaverState; import com.android.server.power.batterysaver.BatterySavingStats.DozeState; import com.android.server.power.batterysaver.BatterySavingStats.InteractiveState; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import java.io.ByteArrayOutputStream; import java.io.PrintWriter; Loading Loading @@ -222,8 +227,28 @@ public class BatterySavingStatsTest { target.toDebugString()); } private void assertMetricsLog(String counter, int value) { verify(mMetricsLogger, times(1)).count(eq(counter), eq(value)); private void assertLog(boolean batterySaver, boolean interactive, long deltaTimeMs, int deltaBatteryLevelUa, int deltaBatteryLevelPercent) { if (SEND_TRON_EVENTS) { ArgumentCaptor<LogMaker> ac = ArgumentCaptor.forClass(LogMaker.class); verify(mMetricsLogger, times(1)).write(ac.capture()); LogMaker lm = ac.getValue(); assertEquals(MetricsEvent.BATTERY_SAVER, lm.getCategory()); assertEquals(batterySaver ? 1 : 0, lm.getTaggedData(MetricsEvent.RESERVED_FOR_LOGBUILDER_SUBTYPE)); assertEquals(interactive ? 1 : 0, lm.getTaggedData(MetricsEvent.FIELD_INTERACTIVE)); assertEquals(deltaTimeMs, lm.getTaggedData(MetricsEvent.FIELD_DURATION_MILLIS)); assertEquals(deltaBatteryLevelUa, (int) lm.getTaggedData(MetricsEvent.FIELD_START_BATTERY_UA) - (int) lm.getTaggedData(MetricsEvent.FIELD_END_BATTERY_UA)); assertEquals(deltaBatteryLevelPercent, (int) lm.getTaggedData(MetricsEvent.FIELD_START_BATTERY_PERCENT) - (int) lm.getTaggedData(MetricsEvent.FIELD_END_BATTERY_PERCENT)); } else { verify(mMetricsLogger, times(0)).write(any(LogMaker.class)); } } @Test Loading @@ -249,9 +274,7 @@ public class BatterySavingStatsTest { InteractiveState.NON_INTERACTIVE, DozeState.NOT_DOZING); assertMetricsLog(BatterySavingStats.COUNTER_POWER_MILLIAMPS_PREFIX + "01", 2); assertMetricsLog(BatterySavingStats.COUNTER_POWER_PERCENT_PREFIX + "01", 200); assertMetricsLog(BatterySavingStats.COUNTER_TIME_SECONDS_PREFIX + "01", 60); assertLog(false, true, 60_000, 2000, 200); target.advanceClock(1); target.drainBattery(2000); Loading Loading @@ -282,9 +305,7 @@ public class BatterySavingStatsTest { InteractiveState.INTERACTIVE, DozeState.NOT_DOZING); assertMetricsLog(BatterySavingStats.COUNTER_POWER_MILLIAMPS_PREFIX + "00", 2 * 3); assertMetricsLog(BatterySavingStats.COUNTER_POWER_PERCENT_PREFIX + "00", 200 * 3); assertMetricsLog(BatterySavingStats.COUNTER_TIME_SECONDS_PREFIX + "00", 60 * 3); assertLog(false, false, 60_000 * 3, 2000 * 3, 200 * 3); target.advanceClock(10); target.drainBattery(10000); Loading @@ -292,9 +313,7 @@ public class BatterySavingStatsTest { reset(mMetricsLogger); target.startCharging(); assertMetricsLog(BatterySavingStats.COUNTER_POWER_MILLIAMPS_PREFIX + "11", 10); assertMetricsLog(BatterySavingStats.COUNTER_POWER_PERCENT_PREFIX + "11", 1000); assertMetricsLog(BatterySavingStats.COUNTER_TIME_SECONDS_PREFIX + "11", 60 * 10); assertLog(true, true, 60_000 * 10, 10000, 1000); target.advanceClock(1); target.drainBattery(2000); Loading @@ -312,8 +331,6 @@ public class BatterySavingStatsTest { target.startCharging(); assertMetricsLog(BatterySavingStats.COUNTER_POWER_MILLIAMPS_PREFIX + "10", 2); assertMetricsLog(BatterySavingStats.COUNTER_POWER_PERCENT_PREFIX + "10", 200); assertMetricsLog(BatterySavingStats.COUNTER_TIME_SECONDS_PREFIX + "10", 60); assertLog(true, false, 60_000, 2000, 200); } }