From 6ce382a3728a5e9cd96e5fa4b28504ba8e397a63 Mon Sep 17 00:00:00 2001 From: Blake Kragten Date: Thu, 16 Jan 2020 20:20:46 -0800 Subject: 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 Change-Id: I92461eb8533ec810bb67d76a25931295cfa1efbd --- .../internal/location/gnssmetrics/GnssMetrics.java | 102 ++++++++++++++++++++- 1 file changed, 101 insertions(+), 1 deletion(-) (limited to 'location') diff --git a/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java b/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java index d57148092754..1ac4b4b29fbf 100644 --- a/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java +++ b/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java @@ -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 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; + } + } } -- cgit v1.2.3