summaryrefslogtreecommitdiff
path: root/location
diff options
context:
space:
mode:
authorBlake Kragten <kragtenb@google.com>2020-01-16 20:20:46 -0800
committerBlake Kragten <kragtenb@google.com>2020-02-19 17:07:11 -0800
commit6ce382a3728a5e9cd96e5fa4b28504ba8e397a63 (patch)
tree409795c6155aba4c7404cfb1c99fb229c5829323 /location
parentc43a9482b53125d51028a3f1198a33586295875c (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.java102
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;
+ }
+ }
}