From dec152806d9ed0bdc3d14566bbb7bb3f0464b45e Mon Sep 17 00:00:00 2001 From: Neil Fuller Date: Fri, 5 Mar 2021 17:09:50 +0000 Subject: [PATCH] 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 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 --- .../stats/pull/StatsPullAtomService.java | 62 +++++++++++++++++++ .../location/RealProviderMetricsLogger.java | 39 +++++++++++- 2 files changed, 100 insertions(+), 1 deletion(-) 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 8023fd42edfa1..664dc210cc2df 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 android.util.MathUtils.constrain; 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.NetworkStatsExt; 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 @@ public class StatsPullAtomService extends SystemService { 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 @@ public class StatsPullAtomService extends SystemService { 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 @@ public class StatsPullAtomService extends SystemService { registerBuildInformation(); registerRoleHolder(); registerTimeZoneDataInfo(); + registerTimeZoneDetectorState(); registerExternalStorageInfo(); registerAppsOnExternalStorageInfo(); registerFaceSettings(); @@ -3134,6 +3145,57 @@ public class StatsPullAtomService extends SystemService { 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 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 dfff6f2dd5ae6..e19ec8472e0a8 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 @@ public class RealProviderMetricsLogger implements ProviderMetricsLogger { @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; + } } }