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

Commit 65d2fbff authored by Jack Yu's avatar Jack Yu
Browse files

Reduced redundant metrics logging

If the state changed events does not really contain the change,
do not log it. This can reduce the logging size significantly.
Also separated IMS outgoing and incoming call logging.

Test: runtest -x frameworks/opt/telephony/tests/telephonytests/src/
com/android/internal/telephony/metrics/TelephonyMetricsTest.java

bug: 32537099
Change-Id: I824ffebd45ef6a4c4a6ca8a5ad50b35a20748b07
parent d46a2541
Loading
Loading
Loading
Loading
+54 −2
Original line number Diff line number Diff line
@@ -77,6 +77,7 @@ import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Deque;
import java.util.List;

@@ -140,6 +141,11 @@ public class TelephonyMetrics {
     */
    private final SparseArray<ImsConnectionState> mLastImsConnectionState = new SparseArray<>();

    /**
     * Last settings state. This is for deduping same settings event logged.
     */
    private final SparseArray<TelephonySettings> mLastSettings = new SparseArray<>();

    /** The start system time of the TelephonyLog in milliseconds*/
    private long mStartSystemTimeMs;

@@ -781,6 +787,13 @@ public class TelephonyMetrics {
        TelephonyEvent event = new TelephonyEventBuilder(phoneId)
                .setServiceState(toServiceStateProto(serviceState)).build();

        // If service state doesn't change, we don't log the event.
        if (mLastServiceState.get(phoneId) != null &&
                Arrays.equals(TelephonyServiceState.toByteArray(mLastServiceState.get(phoneId)),
                        TelephonyServiceState.toByteArray(event.serviceState))) {
            return;
        }

        mLastServiceState.put(phoneId, event.serviceState);
        addTelephonyEvent(event);

@@ -832,6 +845,15 @@ public class TelephonyMetrics {
                break;
        }

        // If the settings don't change, we don't log the event.
        if (mLastSettings.get(phoneId) != null &&
                Arrays.equals(TelephonySettings.toByteArray(mLastSettings.get(phoneId)),
                        TelephonySettings.toByteArray(s))) {
            return;
        }

        mLastSettings.put(phoneId, s);

        TelephonyEvent event = new TelephonyEventBuilder(phoneId).setSettings(s).build();
        addTelephonyEvent(event);

@@ -852,6 +874,16 @@ public class TelephonyMetrics {
    public void writeSetPreferredNetworkType(int phoneId, int networkType) {
        TelephonySettings s = new TelephonySettings();
        s.setPreferredNetworkMode(networkType);

        // If the settings don't change, we don't log the event.
        if (mLastSettings.get(phoneId) != null &&
                Arrays.equals(TelephonySettings.toByteArray(mLastSettings.get(phoneId)),
                        TelephonySettings.toByteArray(s))) {
            return;
        }

        mLastSettings.put(phoneId, s);

        addTelephonyEvent(new TelephonyEventBuilder(phoneId).setSettings(s).build());
    }

@@ -866,7 +898,6 @@ public class TelephonyMetrics {
                                                       ImsReasonInfo reasonInfo) {
        ImsConnectionState imsState = new ImsConnectionState();
        imsState.setState(state);
        mLastImsConnectionState.put(phoneId, imsState);

        if (reasonInfo != null) {
            TelephonyProto.ImsReasonInfo ri = new TelephonyProto.ImsReasonInfo();
@@ -881,6 +912,15 @@ public class TelephonyMetrics {
            imsState.reasonInfo = ri;
        }

        // If the connection state does not change, do not log it.
        if (mLastImsConnectionState.get(phoneId) != null &&
                Arrays.equals(ImsConnectionState.toByteArray(mLastImsConnectionState.get(phoneId)),
                        ImsConnectionState.toByteArray(imsState))) {
            return;
        }

        mLastImsConnectionState.put(phoneId, imsState);

        TelephonyEvent event = new TelephonyEventBuilder(phoneId)
                .setImsConnectionState(imsState).build();
        addTelephonyEvent(event);
@@ -912,6 +952,14 @@ public class TelephonyMetrics {
        cap.setUtOverWifi(capabilities[5]);

        TelephonyEvent event = new TelephonyEventBuilder(phoneId).setImsCapabilities(cap).build();

        // If the capabilities don't change, we don't log the event.
        if (mLastImsCapabilities.get(phoneId) != null &&
                Arrays.equals(ImsCapabilities.toByteArray(mLastImsCapabilities.get(phoneId)),
                ImsCapabilities.toByteArray(cap))) {
            return;
        }

        mLastImsCapabilities.put(phoneId, cap);
        addTelephonyEvent(event);

@@ -1395,7 +1443,11 @@ public class TelephonyMetrics {
     * @param session IMS call session
     */
    public void writeOnImsCallReceive(int phoneId, ImsCallSession session) {
        writeOnImsCallStart(phoneId, session);
        InProgressCallSession callSession = startNewCallSessionIfNeeded(phoneId);

        callSession.addEvent(
                new CallSessionEventBuilder(TelephonyCallSession.Event.Type.IMS_CALL_RECEIVE)
                        .setCallIndex(getCallId(session)));
    }

    /**
+64 −0
Original line number Diff line number Diff line
@@ -193,6 +193,27 @@ public class TelephonyMetricsTest extends TelephonyTest {
        assertEquals(ImsCommand.IMS_CMD_START, log.callSessions[0].events[0].getImsCommand());
    }

    // Test write on IMS call received
    @Test
    @SmallTest
    public void testWriteOnImsCallReceive() throws Exception {
        mMetrics.writeOnImsCallReceive(mPhone.getPhoneId(), mImsCallSession);
        mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.IDLE);
        TelephonyLog log = buildProto();

        assertEquals(0, log.events.length);
        assertEquals(1, log.callSessions.length);
        assertEquals(0, log.smsSessions.length);
        assertTrue(log.callSessions[0].hasPhoneId());
        assertEquals(mPhone.getPhoneId(), log.callSessions[0].getPhoneId());
        assertTrue(log.callSessions[0].hasEventsDropped());
        assertFalse(log.callSessions[0].getEventsDropped());
        assertTrue(log.callSessions[0].hasStartTimeMinutes());
        assertEquals(1, log.callSessions[0].events.length);
        assertTrue(log.callSessions[0].events[0].hasCallIndex());
        assertEquals(123, log.callSessions[0].events[0].getCallIndex());
    }

    // Test write ims call state
    @Test
    @SmallTest
@@ -219,6 +240,8 @@ public class TelephonyMetricsTest extends TelephonyTest {
    @SmallTest
    public void testWriteImsSetFeatureValue() throws Exception {
        mMetrics.writeOnImsCallStart(mPhone.getPhoneId(), mImsCallSession);
        mMetrics.writeImsSetFeatureValue(mPhone.getPhoneId(),
                ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE, 0, 1, 0);
        mMetrics.writeImsSetFeatureValue(mPhone.getPhoneId(),
                ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE, 0, 1, 0);
        mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.IDLE);
@@ -298,6 +321,8 @@ public class TelephonyMetricsTest extends TelephonyTest {
    @SmallTest
    public void testWriteOnImsConnectionState() throws Exception {
        mMetrics.writeOnImsCallStart(mPhone.getPhoneId(), mImsCallSession);
        mMetrics.writeOnImsConnectionState(mPhone.getPhoneId(),
                ImsConnectionState.State.CONNECTED, mImsReasonInfo);
        mMetrics.writeOnImsConnectionState(mPhone.getPhoneId(),
                ImsConnectionState.State.CONNECTED, mImsReasonInfo);
        mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.IDLE);
@@ -541,6 +566,7 @@ public class TelephonyMetricsTest extends TelephonyTest {
    @Test
    @SmallTest
    public void testWriteServiceStateChanged() throws Exception {
        mMetrics.writeServiceStateChanged(mPhone.getPhoneId(), mServiceState);
        mMetrics.writeServiceStateChanged(mPhone.getPhoneId(), mServiceState);
        TelephonyLog log = buildProto();

@@ -629,4 +655,42 @@ public class TelephonyMetricsTest extends TelephonyTest {
        byte[] decodedString = Base64.decode(encodedString, Base64.DEFAULT);
        assertArrayEquals(TelephonyProto.TelephonyLog.toByteArray(log), decodedString);
    }

    // Test write ims capabilities changed
    @Test
    @SmallTest
    public void testWriteOnImsCapabilities() throws Exception {
        boolean[] caps1 = new boolean[]{true, false, true, false, true, false};
        mMetrics.writeOnImsCapabilities(mPhone.getPhoneId(), caps1);
        boolean[] caps2 = new boolean[]{true, false, true, false, true, false};
        // The duplicate one should be filtered out.
        mMetrics.writeOnImsCapabilities(mPhone.getPhoneId(), caps2);
        boolean[] caps3 = new boolean[]{false, true, false, true, false, true};
        mMetrics.writeOnImsCapabilities(mPhone.getPhoneId(), caps3);
        TelephonyLog log = buildProto();

        assertEquals(2, log.events.length);
        assertEquals(0, log.callSessions.length);
        assertEquals(0, log.smsSessions.length);

        TelephonyEvent event = log.events[0];
        assertTrue(event.hasType());
        assertEquals(TelephonyEvent.Type.IMS_CAPABILITIES_CHANGED, event.getType());
        assertEquals(caps1[0], event.imsCapabilities.getVoiceOverLte());
        assertEquals(caps1[1], event.imsCapabilities.getVideoOverLte());
        assertEquals(caps1[2], event.imsCapabilities.getVoiceOverWifi());
        assertEquals(caps1[3], event.imsCapabilities.getVideoOverWifi());
        assertEquals(caps1[4], event.imsCapabilities.getUtOverLte());
        assertEquals(caps1[5], event.imsCapabilities.getUtOverWifi());

        event = log.events[1];
        assertTrue(event.hasType());
        assertEquals(TelephonyEvent.Type.IMS_CAPABILITIES_CHANGED, event.getType());
        assertEquals(caps3[0], event.imsCapabilities.getVoiceOverLte());
        assertEquals(caps3[1], event.imsCapabilities.getVideoOverLte());
        assertEquals(caps3[2], event.imsCapabilities.getVoiceOverWifi());
        assertEquals(caps3[3], event.imsCapabilities.getVideoOverWifi());
        assertEquals(caps3[4], event.imsCapabilities.getUtOverLte());
        assertEquals(caps3[5], event.imsCapabilities.getUtOverWifi());
    }
}
 No newline at end of file