Wire up geotz metrics to the real metrics code
This adds a pull metric to capture time_zone_detector state, and push
metric code to the RealProviderMetricsLogger for recording
LocationTimeZoneProvider state changes.
Tested with instructions from http://go/westworld-create-atom:
m statsd_testdrive
Testing the pull atom:
$ statsd_testdrive 10099
...
metric_id: 1111
gauge_metrics {
data {
bucket_info {
atom {
time_zone_detector_state {
telephony_supported: true
geo_supported: true
location_enabled: true
auto_detection_setting: true
geo_detection_setting: true
detection_mode: GEO
device_time_zone_ordinal: 0
latest_telephony_suggestion {
type: CERTAIN
time_zone_ordinals: 0
}
latest_geo_suggestion {
type: CERTAIN
time_zone_ordinals: 0
}
}
}
elapsed_timestamp_nanos: 4997012144302
bucket_num: 83
}
}
}
time_base_elapsed_nano_seconds: 9457122554
bucket_size_nano_seconds: 60000000000
is_active: true
Testing the push atoms:
$ statsd_testdrive 342
<Toggled tz detection off and on, location tz detection off and on,
etc.>
metric_id: 1111
event_metrics {
data {
elapsed_timestamp_nanos: 136166610854
atom {
location_time_zone_provider_state_reported {
provider_index: 0
state: STOPPED
}
}
}
data {
elapsed_timestamp_nanos: 136166870437
atom {
location_time_zone_provider_state_reported {
provider_index: 1
state: STOPPED
}
}
}
data {
elapsed_timestamp_nanos: 138413619828
atom {
location_time_zone_provider_state_reported {
provider_index: 0
state: INITIALIZING
}
}
}
data {
elapsed_timestamp_nanos: 143320553546
atom {
location_time_zone_provider_state_reported {
provider_index: 0
state: STOPPED
}
}
}
data {
elapsed_timestamp_nanos: 145668774196
atom {
location_time_zone_provider_state_reported {
provider_index: 0
state: INITIALIZING
}
}
}
data {
elapsed_timestamp_nanos: 149896281961
atom {
location_time_zone_provider_state_reported {
provider_index: 0
state: STOPPED
}
}
}
data {
elapsed_timestamp_nanos: 151686869171
atom {
location_time_zone_provider_state_reported {
provider_index: 0
state: INITIALIZING
}
}
}
}
is_active: true
Bug: 172934905
Test: See above
Change-Id: I85b3ca4abd670bd5a339111f3c30a8e0bc57579c
diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
index 8023fd4..664dc21 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -42,6 +42,9 @@
import static com.android.internal.util.ConcurrentUtils.DIRECT_EXECUTOR;
import static com.android.internal.util.FrameworkStatsLog.DATA_USAGE_BYTES_TRANSFER__OPPORTUNISTIC_DATA_SUB__NOT_OPPORTUNISTIC;
import static com.android.internal.util.FrameworkStatsLog.DATA_USAGE_BYTES_TRANSFER__OPPORTUNISTIC_DATA_SUB__OPPORTUNISTIC;
+import static com.android.internal.util.FrameworkStatsLog.TIME_ZONE_DETECTOR_STATE__DETECTION_MODE__GEO;
+import static com.android.internal.util.FrameworkStatsLog.TIME_ZONE_DETECTOR_STATE__DETECTION_MODE__MANUAL;
+import static com.android.internal.util.FrameworkStatsLog.TIME_ZONE_DETECTOR_STATE__DETECTION_MODE__TELEPHONY;
import static com.android.server.am.MemoryStatUtil.readMemoryStatFromFilesystem;
import static com.android.server.stats.pull.IonMemoryUtil.readProcessSystemIonHeapSizesFromDebugfs;
import static com.android.server.stats.pull.IonMemoryUtil.readSystemIonHeapSizeFromDebugfs;
@@ -174,6 +177,8 @@
import com.android.server.stats.pull.netstats.SubInfo;
import com.android.server.storage.DiskStatsFileLogger;
import com.android.server.storage.DiskStatsLoggingService;
+import com.android.server.timezonedetector.MetricsTimeZoneDetectorState;
+import com.android.server.timezonedetector.TimeZoneDetectorInternal;
import libcore.io.IoUtils;
@@ -398,6 +403,7 @@
private final Object mBuildInformationLock = new Object();
private final Object mRoleHolderLock = new Object();
private final Object mTimeZoneDataInfoLock = new Object();
+ private final Object mTimeZoneDetectionInfoLock = new Object();
private final Object mExternalStorageInfoLock = new Object();
private final Object mAppsOnExternalStorageInfoLock = new Object();
private final Object mFaceSettingsLock = new Object();
@@ -629,6 +635,10 @@
synchronized (mTimeZoneDataInfoLock) {
return pullTimeZoneDataInfoLocked(atomTag, data);
}
+ case FrameworkStatsLog.TIME_ZONE_DETECTOR_STATE:
+ synchronized (mTimeZoneDetectionInfoLock) {
+ return pullTimeZoneDetectorStateLocked(atomTag, data);
+ }
case FrameworkStatsLog.EXTERNAL_STORAGE_INFO:
synchronized (mExternalStorageInfoLock) {
return pullExternalStorageInfoLocked(atomTag, data);
@@ -833,6 +843,7 @@
registerBuildInformation();
registerRoleHolder();
registerTimeZoneDataInfo();
+ registerTimeZoneDetectorState();
registerExternalStorageInfo();
registerAppsOnExternalStorageInfo();
registerFaceSettings();
@@ -3134,6 +3145,57 @@
return StatsManager.PULL_SUCCESS;
}
+ private void registerTimeZoneDetectorState() {
+ int tagId = FrameworkStatsLog.TIME_ZONE_DETECTOR_STATE;
+ mStatsManager.setPullAtomCallback(
+ tagId,
+ null, // use default PullAtomMetadata values
+ DIRECT_EXECUTOR,
+ mStatsCallbackImpl
+ );
+ }
+
+ int pullTimeZoneDetectorStateLocked(int atomTag, List<StatsEvent> pulledData) {
+ final long token = Binder.clearCallingIdentity();
+ try {
+ TimeZoneDetectorInternal timeZoneDetectorInternal =
+ LocalServices.getService(TimeZoneDetectorInternal.class);
+ MetricsTimeZoneDetectorState metricsState =
+ timeZoneDetectorInternal.generateMetricsState();
+ pulledData.add(FrameworkStatsLog.buildStatsEvent(atomTag,
+ metricsState.isTelephonyDetectionSupported(),
+ metricsState.isGeoDetectionSupported(),
+ metricsState.isUserLocationEnabled(),
+ metricsState.getAutoDetectionEnabledSetting(),
+ metricsState.getGeoDetectionEnabledSetting(),
+ convertToMetricsDetectionMode(metricsState.getDetectionMode()),
+ metricsState.getDeviceTimeZoneIdOrdinal(),
+ metricsState.getLatestManualSuggestionProtoBytes(),
+ metricsState.getLatestTelephonySuggestionProtoBytes(),
+ metricsState.getLatestGeolocationSuggestionProtoBytes()
+ ));
+ } catch (RuntimeException e) {
+ Slog.e(TAG, "Getting time zone detection state failed: ", e);
+ return StatsManager.PULL_SKIP;
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ return StatsManager.PULL_SUCCESS;
+ }
+
+ private int convertToMetricsDetectionMode(int detectionMode) {
+ switch (detectionMode) {
+ case MetricsTimeZoneDetectorState.DETECTION_MODE_MANUAL:
+ return TIME_ZONE_DETECTOR_STATE__DETECTION_MODE__MANUAL;
+ case MetricsTimeZoneDetectorState.DETECTION_MODE_GEO:
+ return TIME_ZONE_DETECTOR_STATE__DETECTION_MODE__GEO;
+ case MetricsTimeZoneDetectorState.DETECTION_MODE_TELEPHONY:
+ return TIME_ZONE_DETECTOR_STATE__DETECTION_MODE__TELEPHONY;
+ default:
+ throw new IllegalArgumentException("" + detectionMode);
+ }
+ }
+
private void registerExternalStorageInfo() {
int tagId = FrameworkStatsLog.EXTERNAL_STORAGE_INFO;
mStatsManager.setPullAtomCallback(
diff --git a/services/core/java/com/android/server/timezonedetector/location/RealProviderMetricsLogger.java b/services/core/java/com/android/server/timezonedetector/location/RealProviderMetricsLogger.java
index dfff6f2..e19ec84 100644
--- a/services/core/java/com/android/server/timezonedetector/location/RealProviderMetricsLogger.java
+++ b/services/core/java/com/android/server/timezonedetector/location/RealProviderMetricsLogger.java
@@ -16,6 +16,21 @@
package com.android.server.timezonedetector.location;
+import static com.android.internal.util.FrameworkStatsLog.LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__CERTAIN;
+import static com.android.internal.util.FrameworkStatsLog.LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__DESTROYED;
+import static com.android.internal.util.FrameworkStatsLog.LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__INITIALIZING;
+import static com.android.internal.util.FrameworkStatsLog.LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__PERM_FAILED;
+import static com.android.internal.util.FrameworkStatsLog.LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__STOPPED;
+import static com.android.internal.util.FrameworkStatsLog.LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__UNCERTAIN;
+import static com.android.internal.util.FrameworkStatsLog.LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__UNKNOWN;
+import static com.android.server.timezonedetector.location.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_DESTROYED;
+import static com.android.server.timezonedetector.location.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_PERM_FAILED;
+import static com.android.server.timezonedetector.location.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_STARTED_CERTAIN;
+import static com.android.server.timezonedetector.location.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_STARTED_INITIALIZING;
+import static com.android.server.timezonedetector.location.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_STARTED_UNCERTAIN;
+import static com.android.server.timezonedetector.location.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_STOPPED;
+import static com.android.server.timezonedetector.location.LocationTimeZoneProvider.ProviderState.PROVIDER_STATE_UNKNOWN;
+
import android.annotation.IntRange;
import com.android.internal.util.FrameworkStatsLog;
@@ -37,6 +52,28 @@
@Override
public void onProviderStateChanged(@ProviderStateEnum int stateEnum) {
- // TODO(b/172934905): Implement once the atom has landed.
+ FrameworkStatsLog.write(FrameworkStatsLog.LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED,
+ mProviderIndex,
+ metricsProviderState(stateEnum));
+ }
+
+ private static int metricsProviderState(@ProviderStateEnum int stateEnum) {
+ switch (stateEnum) {
+ case PROVIDER_STATE_STARTED_INITIALIZING:
+ return LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__INITIALIZING;
+ case PROVIDER_STATE_STARTED_UNCERTAIN:
+ return LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__UNCERTAIN;
+ case PROVIDER_STATE_STARTED_CERTAIN:
+ return LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__CERTAIN;
+ case PROVIDER_STATE_STOPPED:
+ return LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__STOPPED;
+ case PROVIDER_STATE_DESTROYED:
+ return LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__DESTROYED;
+ case PROVIDER_STATE_PERM_FAILED:
+ return LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__PERM_FAILED;
+ case PROVIDER_STATE_UNKNOWN:
+ default:
+ return LOCATION_TIME_ZONE_PROVIDER_STATE_CHANGED__STATE__UNKNOWN;
+ }
}
}