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

Commit 6ce382a3 authored by Blake Kragten's avatar Blake Kragten
Browse files

GnssMetrics

These metrics will pull different metrics that tell the performance of the gnss subsystem.

Metrics include:
Location reports
% of location failure
Num times GPS had to first fix
Mean time to first fix on signal
Num position accuracy logs
Mean position accuracy in meters
Num top 4 Cn0 messages
Mean top 4 average Cn0 (signal quality)
Num L5 top 4 Cn0 messages
Mean L5 top 4 average Cn0 (signal quality)
Num Satellite status messages received
Num of Satellites used in fix
L5 Satellite status messages received
L5 of Satellites used in fix

metric_id: 1111
gauge_metrics {
  data {
    bucket_info {
      atom {
        gnss_stats {
          location_reports: 12
          location_failure_reports: 3
          time_to_first_fix_reports: 2
          time_to_first_fix_milli_s: 43588
          position_accuracy_reports: 9
          position_accuracy_meters: 112
          top_four_average_cn0_reports: 31
          top_four_average_cn0_db_mhz: 734711
          l5_top_four_average_cn0_reports: 1
          l5_top_four_average_cn0_db_mhz: 21500
          sv_status_reports: 1015
          sv_status_reports_used_in_fix: 100
          l5_sv_status_reports: 7
          l5_sv_status_reports_used_in_fix: 0
        }
      }
      elapsed_timestamp_nanos: 537249375445
      start_bucket_elapsed_millis: 522186
      end_bucket_elapsed_millis: 549283
    }
  }
}
time_base_elapsed_nano_seconds: 9283624934
bucket_size_nano_seconds: 60000000000
is_active: true

Bug: 147910698
Test: On Device using test script and gnsslogger.apk
>  make statsd_testdrive
>  ./out/host/linux-x86/bin/statsd_testdrive <ATOM_ID>

Change-Id: I92461eb8533ec810bb67d76a25931295cfa1efbd
parent c43a9482
Loading
Loading
Loading
Loading
+66 −14
Original line number Diff line number Diff line
@@ -396,7 +396,7 @@ message Atom {
    }

    // Pulled events will start at field 10000.
    // Next: 10074
    // Next: 10075
    oneof pulled {
        WifiBytesTransfer wifi_bytes_transfer = 10000 [(module) = "framework"];
        WifiBytesTransferByFgBg wifi_bytes_transfer_by_fg_bg = 10001 [(module) = "framework"];
@@ -477,6 +477,7 @@ message Atom {
                10072 [(module) = "framework"];
        PackageNotificationChannelGroupPreferences package_notification_channel_group_preferences =
                10073 [(module) = "framework"];
        GnssStats gnss_stats = 10074 [(module) = "framework"];
    }

    // DO NOT USE field numbers above 100,000 in AOSP.
@@ -8492,3 +8493,54 @@ message AppFreezeChanged {
    // Time since last unfrozen.
    optional int64 time_unfrozen_millis = 4;
}

/**
 * Logs gnss stats from location service provider
 *
 * Pulled from:
 *  frameworks/base/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java
 */

message GnssStats {
    // Number of location reports since boot
    optional int64 location_reports = 1;

    // Total pulled reports of Location failures since boot
    optional int64 location_failure_reports = 2;

    // Number of time to first fix reports since boot
    optional int64 time_to_first_fix_reports = 3;

    // Total pulled reported time to first fix (in milli-seconds) since boot
    optional int64 time_to_first_fix_milli_s = 4;

    // Number of position accuracy reports since boot
    optional int64 position_accuracy_reports = 5;

    // Total pulled reported position accuracy (in meters) since boot
    optional int64 position_accuracy_meters = 6;

    // Number of top 4 average CN0 reports since boot
    optional int64 top_four_average_cn0_reports = 7;

    // Total pulled reported of top 4 average CN0 (dB-mHz) since boot
    optional int64 top_four_average_cn0_db_mhz = 8;

    // Number of l5 top 4 average CN0 reports since boot
    optional int64 l5_top_four_average_cn0_reports = 9;

    // Total pulled reported of l5 top 4 average CN0 (dB-mHz) since boot
    optional int64 l5_top_four_average_cn0_db_mhz = 10;

    // Total number of sv status messages reports since boot
    optional int64 sv_status_reports = 11;

    // Total number of sv status messages reports, where sv is used in fix since boot
    optional int64 sv_status_reports_used_in_fix = 12;

    // Total number of L5 sv status messages reports since boot
    optional int64 l5_sv_status_reports = 13;

    // Total number of L5 sv status messages reports, where sv is used in fix since boot
    optional int64 l5_sv_status_reports_used_in_fix = 14;
}
+101 −1
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.internal.location.gnssmetrics;

import android.app.StatsManager;
import android.content.Context;
import android.location.GnssStatus;
import android.os.SystemClock;
import android.os.SystemProperties;
@@ -24,16 +26,19 @@ import android.server.location.ServerLocationProtoEnums;
import android.text.format.DateUtils;
import android.util.Base64;
import android.util.Log;
import android.util.StatsEvent;
import android.util.TimeUtils;

import com.android.internal.app.IBatteryStats;
import com.android.internal.location.nano.GnssLogsProto.GnssLog;
import com.android.internal.location.nano.GnssLogsProto.PowerMetrics;
import com.android.internal.os.BackgroundThread;
import com.android.internal.util.FrameworkStatsLog;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * GnssMetrics: Is used for logging GNSS metrics
@@ -96,7 +101,34 @@ public class GnssMetrics {
    /** Total number of L5 sv status messages processed, where sv is used in fix */
    private int mNumL5SvStatusUsedInFix;

    public GnssMetrics(IBatteryStats stats) {
    /* Statsd Logging Variables Section Start */
    /** Location failure reports since boot used for statsd logging */
    private Statistics mLocationFailureReportsStatistics;
    /** Time to first fix milli-seconds since boot used for statsd logging */
    private Statistics mTimeToFirstFixMilliSReportsStatistics;
    /** Position accuracy meters since boot used for statsd logging  */
    private Statistics mPositionAccuracyMetersReportsStatistics;
    /** Top 4 average CN0 (db-mHz) since boot used for statsd logging  */
    private Statistics mTopFourAverageCn0DbmHzReportsStatistics;
    /** Top 4 average CN0 (db-mHz) L5 since boot used for statsd logging  */
    private Statistics mL5TopFourAverageCn0DbmHzReportsStatistics;
    /** Total number of sv status reports processed since boot used for statsd logging  */
    private long mSvStatusReports;
    /** Total number of L5 sv status reports processed since boot used for statsd logging  */
    private long mL5SvStatusReports;
    /** Total number of sv status reports processed, where sv is used in fix since boot used for
     * statsd logging  */
    private long mSvStatusReportsUsedInFix;
    /** Total number of L5 sv status reports processed, where sv is used in fix since boot used for
     * statsd logging  */
    private long mL5SvStatusReportsUsedInFix;
    /** Stats manager service for reporting atoms */
    private StatsManager mStatsManager;
    /** Pull atom callback, this is called when atom pull request occurs */
    private StatsPullAtomCallbackImpl mPullAtomCallback;
    /* Statds Logging Variables Section End */

    public GnssMetrics(Context context, IBatteryStats stats) {
        mGnssPowerMetrics = new GnssPowerMetrics(stats);
        mLocationFailureStatistics = new Statistics();
        mTimeToFirstFixSecStatistics = new Statistics();
@@ -104,6 +136,13 @@ public class GnssMetrics {
        mTopFourAverageCn0Statistics = new Statistics();
        mTopFourAverageCn0StatisticsL5 = new Statistics();
        reset();
        mLocationFailureReportsStatistics = new Statistics();
        mTimeToFirstFixMilliSReportsStatistics = new Statistics();
        mPositionAccuracyMetersReportsStatistics = new Statistics();
        mTopFourAverageCn0DbmHzReportsStatistics = new Statistics();
        mL5TopFourAverageCn0DbmHzReportsStatistics = new Statistics();
        mStatsManager = (StatsManager) context.getSystemService(Context.STATS_MANAGER);
        registerGnssStats();
    }

    /**
@@ -112,9 +151,11 @@ public class GnssMetrics {
    public void logReceivedLocationStatus(boolean isSuccessful) {
        if (!isSuccessful) {
            mLocationFailureStatistics.addItem(1.0);
            mLocationFailureReportsStatistics.addItem(1.0);
            return;
        }
        mLocationFailureStatistics.addItem(0.0);
        mLocationFailureReportsStatistics.addItem(0.0);
    }

    /**
@@ -127,6 +168,7 @@ public class GnssMetrics {
        if (numReportMissed > 0) {
            for (int i = 0; i < numReportMissed; i++) {
                mLocationFailureStatistics.addItem(1.0);
                mLocationFailureReportsStatistics.addItem(1.0);
            }
        }
    }
@@ -136,6 +178,7 @@ public class GnssMetrics {
     */
    public void logTimeToFirstFixMilliSecs(int timeToFirstFixMilliSeconds) {
        mTimeToFirstFixSecStatistics.addItem((double) (timeToFirstFixMilliSeconds / 1000));
        mTimeToFirstFixMilliSReportsStatistics.addItem(timeToFirstFixMilliSeconds);
    }

    /**
@@ -143,6 +186,7 @@ public class GnssMetrics {
     */
    public void logPositionAccuracyMeters(float positionAccuracyMeters) {
        mPositionAccuracyMeterStatistics.addItem((double) positionAccuracyMeters);
        mPositionAccuracyMetersReportsStatistics.addItem(positionAccuracyMeters);
    }

    /**
@@ -174,6 +218,8 @@ public class GnssMetrics {
            }
            top4AvgCn0 /= 4;
            mTopFourAverageCn0Statistics.addItem(top4AvgCn0);
            // Convert to mHz for accuracy
            mTopFourAverageCn0DbmHzReportsStatistics.addItem(top4AvgCn0 * 1000);
        }
    }
    /* Helper function to check if a SV is L5 */
@@ -191,14 +237,18 @@ public class GnssMetrics {
        for (int i = 0; i < status.getSatelliteCount(); i++) {
            if (status.hasCarrierFrequencyHz(i)) {
                mNumSvStatus++;
                mSvStatusReports++;
                isL5 = isL5Sv(status.getCarrierFrequencyHz(i));
                if (isL5) {
                    mNumL5SvStatus++;
                    mL5SvStatusReports++;
                }
                if (status.usedInFix(i)) {
                    mNumSvStatusUsedInFix++;
                    mSvStatusReportsUsedInFix++;
                    if (isL5) {
                        mNumL5SvStatusUsedInFix++;
                        mL5SvStatusReportsUsedInFix++;
                    }
                }
            }
@@ -233,6 +283,8 @@ public class GnssMetrics {
            }
            top4AvgCn0 /= 4;
            mTopFourAverageCn0StatisticsL5.addItem(top4AvgCn0);
            // Convert to mHz for accuracy
            mL5TopFourAverageCn0DbmHzReportsStatistics.addItem(top4AvgCn0 * 1000);
        }
        return;
    }
@@ -421,12 +473,14 @@ public class GnssMetrics {
        private int mCount;
        private double mSum;
        private double mSumSquare;
        private long mLongSum;

        /** Resets statistics */
        public void reset() {
            mCount = 0;
            mSum = 0.0;
            mSumSquare = 0.0;
            mLongSum = 0;
        }

        /** Adds an item */
@@ -434,6 +488,7 @@ public class GnssMetrics {
            mCount++;
            mSum += item;
            mSumSquare += item * item;
            mLongSum += item;
        }

        /** Returns number of items added */
@@ -456,6 +511,11 @@ public class GnssMetrics {
            }
            return 0;
        }

        /** Returns long sum */
        public long getLongSum() {
            return mLongSum;
        }
    }

    /* Class for handling GNSS power related metrics */
@@ -561,4 +621,44 @@ public class GnssMetrics {
            return GnssMetrics.GPS_SIGNAL_QUALITY_POOR;
        }
    }

    private void registerGnssStats() {
        mPullAtomCallback = new StatsPullAtomCallbackImpl();
        mStatsManager.registerPullAtomCallback(
                FrameworkStatsLog.GNSS_STATS,
                null, // use default PullAtomMetadata values
                BackgroundThread.getExecutor(), mPullAtomCallback);
    }

    /**
     * Stats Pull Atom Callback
     * Calls the pull method to fill out gnss stats
     */
    private class StatsPullAtomCallbackImpl implements StatsManager.StatsPullAtomCallback {
        @Override
        public int onPullAtom(int atomTag, List<StatsEvent> data) {
            if (atomTag != FrameworkStatsLog.GNSS_STATS) {
                throw new UnsupportedOperationException("Unknown tagId = " + atomTag);
            }
            StatsEvent e = StatsEvent.newBuilder()
                    .setAtomId(atomTag)
                    .writeLong(mLocationFailureReportsStatistics.getCount())
                    .writeLong(mLocationFailureReportsStatistics.getLongSum())
                    .writeLong(mTimeToFirstFixMilliSReportsStatistics.getCount())
                    .writeLong(mTimeToFirstFixMilliSReportsStatistics.getLongSum())
                    .writeLong(mPositionAccuracyMetersReportsStatistics.getCount())
                    .writeLong(mPositionAccuracyMetersReportsStatistics.getLongSum())
                    .writeLong(mTopFourAverageCn0DbmHzReportsStatistics.getCount())
                    .writeLong(mTopFourAverageCn0DbmHzReportsStatistics.getLongSum())
                    .writeLong(mL5TopFourAverageCn0DbmHzReportsStatistics.getCount())
                    .writeLong(mL5TopFourAverageCn0DbmHzReportsStatistics.getLongSum())
                    .writeLong(mSvStatusReports)
                    .writeLong(mSvStatusReportsUsedInFix)
                    .writeLong(mL5SvStatusReports)
                    .writeLong(mL5SvStatusReportsUsedInFix)
                    .build();
            data.add(e);
            return StatsManager.PULL_SUCCESS;
        }
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -714,7 +714,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
            }
        };

        mGnssMetrics = new GnssMetrics(mBatteryStats);
        mGnssMetrics = new GnssMetrics(mContext, mBatteryStats);
        mNtpTimeHelper = new NtpTimeHelper(mContext, mLooper, this);
        GnssSatelliteBlacklistHelper gnssSatelliteBlacklistHelper =
                new GnssSatelliteBlacklistHelper(mContext,