Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dec15280 authored by Neil Fuller's avatar Neil Fuller
Browse files

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
parent 27ddc8f4
Loading
Loading
Loading
Loading
+62 −0
Original line number Diff line number Diff line
@@ -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<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(
+38 −1
Original line number Diff line number Diff line
@@ -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;
        }
    }
}