Commit 3f60731a authored by asvitkine's avatar asvitkine Committed by Commit bot

Reland "Move Java CachedMetrics functionality to base/."

This is a re-land of:
https://codereview.chromium.org/2435813002/

The reland keeps a TimesHistogramSample class in LaunchMetrics
since it's still referenced in internal code. Once this lands, the
clank/ code can be updated and this class can be cleaned up.

Original CL description:

This is general-purpose functionality that allows
recording UMA metrics before the C++ native library
has been loaded and is useful to have outside of the
Chrome layer. In particular, I will be using it from
components/variations to record information about the
first run variations seed fetch.

No functional changes in this CL.

BUG=632199
TBR=bauerb@chromium.org, thestig@chromium.org

Review-Url: https://chromiumcodereview.appspot.com/2439113002
Cr-Commit-Position: refs/heads/master@{#426853}
parent a0b7b87e
......@@ -2322,6 +2322,7 @@ if (is_android) {
"android/java/src/org/chromium/base/library_loader/ModernLinker.java",
"android/java/src/org/chromium/base/library_loader/NativeLibraryPreloader.java",
"android/java/src/org/chromium/base/library_loader/ProcessInitException.java",
"android/java/src/org/chromium/base/metrics/CachedMetrics.java",
"android/java/src/org/chromium/base/metrics/RecordHistogram.java",
"android/java/src/org/chromium/base/metrics/RecordUserAction.java",
"android/java/src/org/chromium/base/metrics/StatisticsRecorderAndroid.java",
......
// Copyright 2016 The Chromium Authors. All rights reserved.
// 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 org.chromium.base.library_loader.LibraryLoader;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* Utility classes for recording UMA metrics before the native library
* may have been loaded. Metrics are cached until the library is known
* to be loaded, then committed to the MetricsService all at once.
*/
public class CachedMetrics {
/**
* Creating an instance of a subclass of this class automatically adds it to a list of objects
* that are committed when the native library is available.
*/
private abstract static class CachedHistogram {
private static final List<CachedHistogram> sEvents = new ArrayList<CachedHistogram>();
protected final String mHistogramName;
/**
* @param histogramName Name of the histogram to record.
*/
protected CachedHistogram(String histogramName) {
mHistogramName = histogramName;
sEvents.add(this);
}
/** Commits the histogram. Expects the native library to be loaded. */
protected abstract void commitAndClear();
}
/**
* Caches an action that will be recorded after native side is loaded.
*/
public static class ActionEvent extends CachedHistogram {
private int mCount;
public ActionEvent(String actionName) {
super(actionName);
}
public void record() {
if (LibraryLoader.isInitialized()) {
recordWithNative();
} else {
mCount++;
}
}
private void recordWithNative() {
RecordUserAction.record(mHistogramName);
}
@Override
protected void commitAndClear() {
while (mCount > 0) {
recordWithNative();
mCount--;
}
}
}
/** Caches a set of integer histogram samples. */
public static class SparseHistogramSample extends CachedHistogram {
private final List<Integer> mSamples = new ArrayList<Integer>();
public SparseHistogramSample(String histogramName) {
super(histogramName);
}
public void record(int sample) {
if (LibraryLoader.isInitialized()) {
recordWithNative(sample);
} else {
mSamples.add(sample);
}
}
private void recordWithNative(int sample) {
RecordHistogram.recordSparseSlowlyHistogram(mHistogramName, sample);
}
@Override
protected void commitAndClear() {
for (Integer sample : mSamples) {
recordWithNative(sample);
}
mSamples.clear();
}
}
/** Caches a set of enumerated histogram samples. */
public static class EnumeratedHistogramSample extends CachedHistogram {
private final List<Integer> mSamples = new ArrayList<Integer>();
private final int mMaxValue;
public EnumeratedHistogramSample(String histogramName, int maxValue) {
super(histogramName);
mMaxValue = maxValue;
}
public void record(int sample) {
if (LibraryLoader.isInitialized()) {
recordWithNative(sample);
} else {
mSamples.add(sample);
}
}
private void recordWithNative(int sample) {
RecordHistogram.recordEnumeratedHistogram(mHistogramName, sample, mMaxValue);
}
@Override
protected void commitAndClear() {
for (Integer sample : mSamples) {
recordWithNative(sample);
}
mSamples.clear();
}
}
/** Caches a set of times histogram samples. */
public static class TimesHistogramSample extends CachedHistogram {
private final List<Long> mSamples = new ArrayList<Long>();
private final TimeUnit mTimeUnit;
public TimesHistogramSample(String histogramName, TimeUnit timeUnit) {
super(histogramName);
mTimeUnit = timeUnit;
}
public void record(long sample) {
if (LibraryLoader.isInitialized()) {
recordWithNative(sample);
} else {
mSamples.add(sample);
}
}
private void recordWithNative(long sample) {
RecordHistogram.recordTimesHistogram(mHistogramName, sample, mTimeUnit);
}
@Override
protected void commitAndClear() {
for (Long sample : mSamples) {
recordWithNative(sample);
}
mSamples.clear();
}
}
/**
* Calls out to native code to commit any cached histograms and events.
* Should be called once the native library has been loaded.
*/
public static void commitCachedMetrics() {
for (CachedHistogram event : CachedHistogram.sEvents) event.commitAndClear();
}
}
......@@ -22,9 +22,9 @@ import android.widget.LinearLayout;
import android.widget.RemoteViews;
import org.chromium.base.Log;
import org.chromium.base.metrics.CachedMetrics;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.metrics.LaunchMetrics;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.ui.interpolators.BakedBezierInterpolator;
......@@ -35,10 +35,10 @@ import java.util.List;
*/
class CustomTabBottomBarDelegate {
private static final String TAG = "CustomTab";
private static final LaunchMetrics.ActionEvent REMOTE_VIEWS_SHOWN =
new LaunchMetrics.ActionEvent("CustomTabsRemoteViewsShown");
private static final LaunchMetrics.ActionEvent REMOTE_VIEWS_UPDATED =
new LaunchMetrics.ActionEvent("CustomTabsRemoteViewsUpdated");
private static final CachedMetrics.ActionEvent REMOTE_VIEWS_SHOWN =
new CachedMetrics.ActionEvent("CustomTabsRemoteViewsShown");
private static final CachedMetrics.ActionEvent REMOTE_VIEWS_UPDATED =
new CachedMetrics.ActionEvent("CustomTabsRemoteViewsUpdated");
private static final int SLIDE_ANIMATION_DURATION_MS = 400;
private ChromeActivity mActivity;
private ViewGroup mBottomBarView;
......
......@@ -25,6 +25,7 @@ import org.chromium.base.CommandLineInitUtil;
import org.chromium.base.ContextUtils;
import org.chromium.base.Log;
import org.chromium.base.TraceEvent;
import org.chromium.base.metrics.CachedMetrics;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeApplication;
import org.chromium.chrome.browser.ChromeSwitches;
......@@ -42,7 +43,6 @@ import org.chromium.chrome.browser.firstrun.FirstRunActivity;
import org.chromium.chrome.browser.firstrun.FirstRunFlowSequencer;
import org.chromium.chrome.browser.firstrun.LightweightFirstRunActivity;
import org.chromium.chrome.browser.instantapps.InstantAppsHandler;
import org.chromium.chrome.browser.metrics.LaunchMetrics;
import org.chromium.chrome.browser.metrics.MediaNotificationUma;
import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
import org.chromium.chrome.browser.notifications.NotificationPlatformBridge;
......@@ -87,8 +87,8 @@ public class ChromeLauncherActivity extends Activity
*/
private static final int PARTNER_BROWSER_CUSTOMIZATIONS_TIMEOUT_MS = 10000;
private static final LaunchMetrics.SparseHistogramSample sIntentFlagsHistogram =
new LaunchMetrics.SparseHistogramSample("Launch.IntentFlags");
private static final CachedMetrics.SparseHistogramSample sIntentFlagsHistogram =
new CachedMetrics.SparseHistogramSample("Launch.IntentFlags");
private IntentHandler mIntentHandler;
private boolean mIsInLegacyMultiInstanceMode;
......
......@@ -21,9 +21,9 @@ import org.chromium.base.ContextUtils;
import org.chromium.base.Log;
import org.chromium.base.ThreadUtils;
import org.chromium.base.VisibleForTesting;
import org.chromium.base.metrics.CachedMetrics.SparseHistogramSample;
import org.chromium.base.metrics.CachedMetrics.TimesHistogramSample;
import org.chromium.chrome.browser.ChromeApplication;
import org.chromium.chrome.browser.metrics.LaunchMetrics.SparseHistogramSample;
import org.chromium.chrome.browser.metrics.LaunchMetrics.TimesHistogramSample;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
......
......@@ -11,7 +11,7 @@ import android.content.Context;
import com.google.android.gms.common.GoogleApiAvailability;
import org.chromium.base.ThreadUtils;
import org.chromium.chrome.browser.metrics.LaunchMetrics.EnumeratedHistogramSample;
import org.chromium.base.metrics.CachedMetrics.EnumeratedHistogramSample;
import java.util.concurrent.atomic.AtomicBoolean;
......
......@@ -15,11 +15,11 @@ import org.chromium.base.CommandLine;
import org.chromium.base.ContextUtils;
import org.chromium.base.FieldTrialList;
import org.chromium.base.Log;
import org.chromium.base.metrics.CachedMetrics.TimesHistogramSample;
import org.chromium.chrome.browser.ChromeApplication;
import org.chromium.chrome.browser.ChromeSwitches;
import org.chromium.chrome.browser.IntentHandler;
import org.chromium.chrome.browser.externalnav.ExternalNavigationDelegateImpl;
import org.chromium.chrome.browser.metrics.LaunchMetrics.TimesHistogramSample;
import org.chromium.chrome.browser.preferences.ChromePreferenceManager;
import org.chromium.chrome.browser.util.IntentUtils;
import org.chromium.content_public.browser.WebContents;
......
......@@ -7,9 +7,7 @@ package org.chromium.chrome.browser.metrics;
import android.util.Pair;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.library_loader.LibraryLoader;
import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.metrics.RecordUserAction;
import org.chromium.base.metrics.CachedMetrics;
import org.chromium.content_public.browser.WebContents;
import java.util.ArrayList;
......@@ -23,147 +21,13 @@ import java.util.concurrent.TimeUnit;
*/
@JNINamespace("metrics")
public class LaunchMetrics {
/**
* Creating an instance of a subclass of this class automatically adds it to a list of objects
* that are committed when the native library is available.
*/
private abstract static class CachedHistogram {
private static final List<CachedHistogram> sEvents = new ArrayList<CachedHistogram>();
protected final String mHistogramName;
/**
* @param histogramName Name of the histogram to record.
*/
protected CachedHistogram(String histogramName) {
mHistogramName = histogramName;
sEvents.add(this);
}
/** Commits the histogram. Expects the native library to be loaded. */
protected abstract void commitAndClear();
}
/**
* Caches an action that will be recorded after native side is loaded.
* Caches a set of times histogram samples.
* TODO(asvitkine): Remove after internal code is migrated to CachedMetrics.
*/
public static class ActionEvent extends CachedHistogram {
private int mCount;
public ActionEvent(String actionName) {
super(actionName);
}
public void record() {
if (LibraryLoader.isInitialized()) {
recordWithNative();
} else {
mCount++;
}
}
private void recordWithNative() {
RecordUserAction.record(mHistogramName);
}
@Override
protected void commitAndClear() {
while (mCount > 0) {
recordWithNative();
mCount--;
}
}
}
/** Caches a set of integer histogram samples. */
public static class SparseHistogramSample extends CachedHistogram {
private final List<Integer> mSamples = new ArrayList<Integer>();
public SparseHistogramSample(String histogramName) {
super(histogramName);
}
public void record(int sample) {
if (LibraryLoader.isInitialized()) {
recordWithNative(sample);
} else {
mSamples.add(sample);
}
}
private void recordWithNative(int sample) {
RecordHistogram.recordSparseSlowlyHistogram(mHistogramName, sample);
}
@Override
protected void commitAndClear() {
for (Integer sample : mSamples) {
recordWithNative(sample);
}
mSamples.clear();
}
}
/** Caches a set of enumerated histogram samples. */
public static class EnumeratedHistogramSample extends CachedHistogram {
private final List<Integer> mSamples = new ArrayList<Integer>();
private final int mMaxValue;
public EnumeratedHistogramSample(String histogramName, int maxValue) {
super(histogramName);
mMaxValue = maxValue;
}
public void record(int sample) {
if (LibraryLoader.isInitialized()) {
recordWithNative(sample);
} else {
mSamples.add(sample);
}
}
private void recordWithNative(int sample) {
RecordHistogram.recordEnumeratedHistogram(mHistogramName, sample, mMaxValue);
}
@Override
protected void commitAndClear() {
for (Integer sample : mSamples) {
recordWithNative(sample);
}
mSamples.clear();
}
}
/** Caches a set of times histogram samples. */
public static class TimesHistogramSample extends CachedHistogram {
private final List<Long> mSamples = new ArrayList<Long>();
private final TimeUnit mTimeUnit;
public static class TimesHistogramSample extends CachedMetrics.TimesHistogramSample {
public TimesHistogramSample(String histogramName, TimeUnit timeUnit) {
super(histogramName);
mTimeUnit = timeUnit;
}
public void record(long sample) {
if (LibraryLoader.isInitialized()) {
recordWithNative(sample);
} else {
mSamples.add(sample);
}
}
private void recordWithNative(long sample) {
RecordHistogram.recordTimesHistogram(mHistogramName, sample, mTimeUnit);
}
@Override
protected void commitAndClear() {
for (Long sample : mSamples) {
recordWithNative(sample);
}
mSamples.clear();
super(histogramName, timeUnit);
}
}
......@@ -222,7 +86,7 @@ public class LaunchMetrics {
sTabUrls.clear();
// Record generic cached events.
for (CachedHistogram event : CachedHistogram.sEvents) event.commitAndClear();
CachedMetrics.commitCachedMetrics();
}
/**
......
......@@ -4,7 +4,7 @@
package org.chromium.chrome.browser.metrics;
import static org.chromium.chrome.browser.metrics.LaunchMetrics.EnumeratedHistogramSample;
import static org.chromium.base.metrics.CachedMetrics.EnumeratedHistogramSample;
import android.content.Intent;
......@@ -23,8 +23,7 @@ public class MediaNotificationUma {
"org.chromium.chrome.browser.metrics.MediaNotificationUma.EXTRA_CLICK_SOURCE";
private static final EnumeratedHistogramSample sClickSourceHistogram =
new LaunchMetrics.EnumeratedHistogramSample(
"Media.Notification.Click", SOURCE_MAX);
new EnumeratedHistogramSample("Media.Notification.Click", SOURCE_MAX);
/**
* Record the UMA as specified by {@link intent}. The {@link intent} should contain intent extra
......
......@@ -12,7 +12,7 @@ import android.os.SystemClock;
import android.util.Log;
import org.chromium.base.SecureRandomInitializer;
import org.chromium.chrome.browser.metrics.LaunchMetrics.TimesHistogramSample;
import org.chromium.base.metrics.CachedMetrics.TimesHistogramSample;
import java.io.File;
import java.io.FileInputStream;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment