blob: 36915cea16e2b2099656fbef6ef2bfecbdbb408b [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.base.metrics;
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import org.chromium.base.TimeUtils;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* A class to be used with a try-with-resources to record the elapsed time within the try
* block. Measures time elapsed between instantiation and the call to close using supplied time
* source.
*/
public class TimingMetric implements AutoCloseable {
@IntDef({TimerType.SHORT_UPTIME, TimerType.MEDIUM_UPTIME, TimerType.SHORT_THREAD_TIME})
@Retention(RetentionPolicy.SOURCE)
private @interface TimerType {
int SHORT_UPTIME = 0;
int MEDIUM_UPTIME = 1;
int SHORT_THREAD_TIME = 2;
}
private final String mMetricName;
private final @TimerType int mTimerType;
private long mStartTime;
/**
* Create a new TimingMetric measuring wall time (ie. time experienced by the user) of
* up to 10 seconds.
*
* @param metric The name of the histogram to record.
*/
public static TimingMetric shortUptime(@NonNull String metricName) {
TimingMetric ret = new TimingMetric(metricName, TimerType.SHORT_UPTIME);
ret.mStartTime = TimeUtils.uptimeMillis();
return ret;
}
/**
* Create a new TimingMetric measuring wall time (ie. time experienced by the user) of up to 3
* minutes.
*
* @param metricName The name of the histogram to record.
*/
public static TimingMetric mediumUptime(@NonNull String metricName) {
TimingMetric ret = new TimingMetric(metricName, TimerType.MEDIUM_UPTIME);
ret.mStartTime = TimeUtils.uptimeMillis();
return ret;
}
/**
* Create a new TimingMetric measuring thread time (ie. actual time spent executing the code) of
* up to 10 seconds.
*
* @param metricName The name of the histogram to record.
*/
public static TimingMetric shortThreadTime(@NonNull String metricName) {
TimingMetric ret = new TimingMetric(metricName, TimerType.SHORT_THREAD_TIME);
ret.mStartTime = TimeUtils.currentThreadTimeMillis();
return ret;
}
private TimingMetric(String metricName, @TimerType int timerType) {
mMetricName = metricName;
mTimerType = timerType;
}
@Override
public void close() {
String metricName = mMetricName;
long startTime = mStartTime;
if (startTime == 0) return;
mStartTime = 0;
switch (mTimerType) {
case TimerType.SHORT_UPTIME:
RecordHistogram.recordTimesHistogram(
metricName, TimeUtils.uptimeMillis() - startTime);
break;
case TimerType.MEDIUM_UPTIME:
RecordHistogram.recordMediumTimesHistogram(
metricName, TimeUtils.uptimeMillis() - startTime);
break;
case TimerType.SHORT_THREAD_TIME:
RecordHistogram.recordTimesHistogram(
metricName, TimeUtils.currentThreadTimeMillis() - startTime);
break;
}
}
}