Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4c5c42d7 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Switch to tron events for battery saver logging"

parents e9aa3388 698f7a06
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -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
+26 −25
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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. */
@@ -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;
@@ -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;
@@ -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);
        }
    }
}
+32 −15
Original line number Diff line number Diff line
@@ -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;
@@ -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
@@ -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);
@@ -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);
@@ -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);
@@ -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);
    }
}