diff options
author | Blake Kragten <kragtenb@google.com> | 2020-01-16 20:20:46 -0800 |
---|---|---|
committer | Blake Kragten <kragtenb@google.com> | 2020-02-19 17:07:11 -0800 |
commit | 6ce382a3728a5e9cd96e5fa4b28504ba8e397a63 (patch) | |
tree | 409795c6155aba4c7404cfb1c99fb229c5829323 /location | |
parent | c43a9482b53125d51028a3f1198a33586295875c (diff) |
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
Diffstat (limited to 'location')
-rw-r--r-- | location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java | 102 |
1 files changed, 101 insertions, 1 deletions
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<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; + } + } } |