Add variant feature param to "day zero" feature, only report metric for feature participants

This commit is contained in:
Darnell Andries
2024-04-02 16:18:25 -07:00
parent cb772d2ee9
commit cc8c90ec59
8 changed files with 80 additions and 50 deletions
+7
View File
@@ -4,6 +4,7 @@
* You can obtain one at https://mozilla.org/MPL/2.0/. */
#include "brave/browser/brave_browser_features.h"
#include "build/build_config.h"
namespace features {
@@ -41,4 +42,10 @@ BASE_FEATURE(kBraveDayZeroExperiment,
"BraveDayZeroExperiment",
base::FEATURE_DISABLED_BY_DEFAULT);
// The variant of the "day zero" experiment. i.e. A, B, C, D, etc.
const base::FeatureParam<std::string> kBraveDayZeroExperimentVariant{
&kBraveDayZeroExperiment,
/*name=*/"variant",
/*default_value=*/""};
} // namespace features
+5
View File
@@ -6,7 +6,10 @@
#ifndef BRAVE_BROWSER_BRAVE_BROWSER_FEATURES_H_
#define BRAVE_BROWSER_BRAVE_BROWSER_FEATURES_H_
#include <string>
#include "base/feature_list.h"
#include "base/metrics/field_trial_params.h"
namespace features {
@@ -14,7 +17,9 @@ BASE_DECLARE_FEATURE(kBraveCleanupSessionCookiesOnSessionRestore);
BASE_DECLARE_FEATURE(kBraveCopyCleanLinkByDefault);
BASE_DECLARE_FEATURE(kBraveOverrideDownloadDangerLevel);
BASE_DECLARE_FEATURE(kBraveWebViewRoundedCorners);
BASE_DECLARE_FEATURE(kBraveDayZeroExperiment);
extern const base::FeatureParam<std::string> kBraveDayZeroExperimentVariant;
} // namespace features
+6 -3
View File
@@ -109,11 +109,14 @@ BraveStatsUpdater::BraveStatsUpdater(PrefService* pref_service,
usage_server_ = BUILDFLAG(BRAVE_USAGE_SERVER);
}
std::optional<std::string> day_zero_variant;
if (base::FeatureList::IsEnabled(features::kBraveDayZeroExperiment)) {
day_zero_variant = features::kBraveDayZeroExperimentVariant.Get();
}
general_browser_usage_p3a_ =
std::make_unique<misc_metrics::GeneralBrowserUsage>(
pref_service,
base::FeatureList::IsEnabled(features::kBraveDayZeroExperiment),
first_run::IsChromeFirstRun(), GetFirstRunTime(pref_service));
pref_service, day_zero_variant, first_run::IsChromeFirstRun(),
GetFirstRunTime(pref_service));
if (profile_manager != nullptr) {
g_browser_process->profile_manager()->AddObserver(this);
@@ -6,6 +6,8 @@
#include "brave/components/misc_metrics/general_browser_usage.h"
#include "base/metrics/histogram_macros.h"
#include "base/strings/strcat.h"
#include "base/strings/string_util.h"
#include "base/time/time.h"
#include "brave/components/misc_metrics/pref_names.h"
#include "brave/components/p3a_utils/bucket.h"
@@ -25,17 +27,19 @@ constexpr int kProfileCountBuckets[] = {0, 1, 2, 3, 5};
} // namespace
GeneralBrowserUsage::GeneralBrowserUsage(PrefService* local_state,
bool day_zero_experiment_enabled,
bool is_first_run,
base::Time first_run_time)
GeneralBrowserUsage::GeneralBrowserUsage(
PrefService* local_state,
std::optional<std::string> day_zero_experiment_variant,
bool is_first_run,
base::Time first_run_time)
: local_state_(local_state), first_run_time_(first_run_time) {
usage_storage_ = std::make_unique<ISOWeeklyStorage>(
local_state, kMiscMetricsBrowserUsageList);
if (is_first_run) {
if (day_zero_experiment_enabled) {
local_state->SetBoolean(kMiscMetricsDayZeroAtInstall, true);
if (day_zero_experiment_variant) {
local_state->SetString(kMiscMetricsDayZeroVariantAtInstall,
*day_zero_experiment_variant);
}
if (first_run_time.is_null()) {
first_run_time_ = base::Time::Now();
@@ -49,7 +53,7 @@ GeneralBrowserUsage::~GeneralBrowserUsage() = default;
void GeneralBrowserUsage::RegisterPrefs(PrefRegistrySimple* registry) {
registry->RegisterListPref(kMiscMetricsBrowserUsageList);
registry->RegisterBooleanPref(kMiscMetricsDayZeroAtInstall, false);
registry->RegisterStringPref(kMiscMetricsDayZeroVariantAtInstall, {});
}
void GeneralBrowserUsage::ReportWeeklyUse() {
@@ -64,10 +68,14 @@ void GeneralBrowserUsage::ReportInstallTime() {
if (days_since_install < 0 || days_since_install > 30) {
return;
}
const char* histogram_name =
local_state_->GetBoolean(kMiscMetricsDayZeroAtInstall)
? kDayZeroOnInstallTime
: kDayZeroOffInstallTime;
std::string day_zero_variant =
local_state_->GetString(kMiscMetricsDayZeroVariantAtInstall);
if (day_zero_variant.empty()) {
return;
}
std::string histogram_name = base::StrCat(
{kDayZeroInstallTimePrefix, base::ToUpperASCII(day_zero_variant),
kDayZeroInstallTimeSuffix});
base::UmaHistogramExactLinear(histogram_name, days_since_install, 31);
}
#endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_WIN)
@@ -7,6 +7,8 @@
#define BRAVE_COMPONENTS_MISC_METRICS_GENERAL_BROWSER_USAGE_H_
#include <memory>
#include <optional>
#include <string>
#include "base/memory/raw_ptr.h"
#include "base/timer/wall_clock_timer.h"
@@ -21,15 +23,14 @@ inline constexpr char kWeeklyUseHistogramName[] = "Brave.Core.WeeklyUsage";
inline constexpr char kProfileCountHistogramName[] = "Brave.Core.ProfileCount";
#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_WIN)
inline constexpr char kDayZeroOnInstallTime[] = "Brave.DayZero.On.InstallTime";
inline constexpr char kDayZeroOffInstallTime[] =
"Brave.DayZero.Off.InstallTime";
inline constexpr char kDayZeroInstallTimePrefix[] = "Brave.DayZero.";
inline constexpr char kDayZeroInstallTimeSuffix[] = ".InstallTime";
#endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_WIN)
class GeneralBrowserUsage {
public:
GeneralBrowserUsage(PrefService* local_state,
bool day_zero_experiment_enabled,
std::optional<std::string> day_zero_experiment_variant,
bool is_first_run,
base::Time first_run_time);
~GeneralBrowserUsage();
@@ -4,6 +4,8 @@
* You can obtain one at https://mozilla.org/MPL/2.0/. */
#include <memory>
#include <optional>
#include <string>
#include "base/test/metrics/histogram_tester.h"
#include "base/time/time.h"
@@ -14,6 +16,11 @@
namespace misc_metrics {
#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_WIN)
constexpr char kDayZeroAInstallTime[] = "Brave.DayZero.A.InstallTime";
constexpr char kDayZeroBInstallTime[] = "Brave.DayZero.B.InstallTime";
#endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_WIN)
class GeneralBrowserUsageUnitTest : public testing::Test {
public:
GeneralBrowserUsageUnitTest()
@@ -36,12 +43,11 @@ class GeneralBrowserUsageUnitTest : public testing::Test {
}
protected:
void SetUpUsage(bool day_zero_experiment_enabled,
void SetUpUsage(std::optional<std::string> day_zero_variant,
bool is_first_run,
base::Time first_run_time) {
general_browser_usage_ = std::make_unique<GeneralBrowserUsage>(
&local_state_, day_zero_experiment_enabled, is_first_run,
first_run_time);
&local_state_, day_zero_variant, is_first_run, first_run_time);
}
content::BrowserTaskEnvironment task_environment_;
@@ -51,7 +57,7 @@ class GeneralBrowserUsageUnitTest : public testing::Test {
};
TEST_F(GeneralBrowserUsageUnitTest, WeeklyUsage) {
SetUpUsage(false, true, base::Time::Now());
SetUpUsage({}, true, base::Time::Now());
histogram_tester_.ExpectUniqueSample(kWeeklyUseHistogramName, 0, 1);
@@ -68,7 +74,7 @@ TEST_F(GeneralBrowserUsageUnitTest, WeeklyUsage) {
#if !BUILDFLAG(IS_ANDROID)
TEST_F(GeneralBrowserUsageUnitTest, ProfileCount) {
SetUpUsage(false, true, base::Time::Now());
SetUpUsage({}, true, base::Time::Now());
histogram_tester_.ExpectTotalCount(kProfileCountHistogramName, 0);
@@ -83,48 +89,48 @@ TEST_F(GeneralBrowserUsageUnitTest, ProfileCount) {
#endif // !BUILDFLAG(IS_ANDROID)
#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_WIN)
TEST_F(GeneralBrowserUsageUnitTest, InstallTimeOff) {
TEST_F(GeneralBrowserUsageUnitTest, InstallTimeB) {
base::Time install_time = base::Time::Now();
SetUpUsage(false, true, install_time);
SetUpUsage("B", true, install_time);
histogram_tester_.ExpectUniqueSample(kDayZeroOffInstallTime, 0, 1);
histogram_tester_.ExpectUniqueSample(kDayZeroBInstallTime, 0, 1);
task_environment_.FastForwardBy(base::Days(15));
histogram_tester_.ExpectBucketCount(kDayZeroOffInstallTime, 15, 1);
histogram_tester_.ExpectTotalCount(kDayZeroOnInstallTime, 0);
histogram_tester_.ExpectBucketCount(kDayZeroBInstallTime, 15, 1);
histogram_tester_.ExpectTotalCount(kDayZeroAInstallTime, 0);
SetUpUsage(true, false, install_time);
SetUpUsage("A", false, install_time);
// Ensure histogram name does not change if "day zero" is enabled
// after install; we only want to report the "day zero on" metric
// if it was enabled at install time.
histogram_tester_.ExpectBucketCount(kDayZeroOffInstallTime, 15, 2);
histogram_tester_.ExpectTotalCount(kDayZeroOnInstallTime, 0);
histogram_tester_.ExpectBucketCount(kDayZeroBInstallTime, 15, 2);
histogram_tester_.ExpectTotalCount(kDayZeroAInstallTime, 0);
task_environment_.FastForwardBy(base::Days(15));
histogram_tester_.ExpectBucketCount(kDayZeroOffInstallTime, 30, 1);
histogram_tester_.ExpectBucketCount(kDayZeroBInstallTime, 30, 1);
// Ensure there are no more reports past 30 days
task_environment_.FastForwardBy(base::Days(5));
histogram_tester_.ExpectTotalCount(kDayZeroOffInstallTime, 32);
histogram_tester_.ExpectTotalCount(kDayZeroOnInstallTime, 0);
histogram_tester_.ExpectTotalCount(kDayZeroBInstallTime, 32);
histogram_tester_.ExpectTotalCount(kDayZeroAInstallTime, 0);
}
TEST_F(GeneralBrowserUsageUnitTest, InstallTimeOn) {
TEST_F(GeneralBrowserUsageUnitTest, InstallTimeA) {
base::Time install_time = base::Time::Now();
SetUpUsage(true, true, install_time);
SetUpUsage("A", true, install_time);
histogram_tester_.ExpectUniqueSample(kDayZeroOnInstallTime, 0, 1);
histogram_tester_.ExpectUniqueSample(kDayZeroAInstallTime, 0, 1);
task_environment_.FastForwardBy(base::Days(15));
histogram_tester_.ExpectBucketCount(kDayZeroOnInstallTime, 15, 1);
histogram_tester_.ExpectTotalCount(kDayZeroOffInstallTime, 0);
histogram_tester_.ExpectBucketCount(kDayZeroAInstallTime, 15, 1);
histogram_tester_.ExpectTotalCount(kDayZeroBInstallTime, 0);
SetUpUsage(false, false, install_time);
histogram_tester_.ExpectBucketCount(kDayZeroOnInstallTime, 15, 2);
histogram_tester_.ExpectTotalCount(kDayZeroOffInstallTime, 0);
SetUpUsage("B", false, install_time);
histogram_tester_.ExpectBucketCount(kDayZeroAInstallTime, 15, 2);
histogram_tester_.ExpectTotalCount(kDayZeroBInstallTime, 0);
}
#endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_WIN)
+2 -2
View File
@@ -60,8 +60,8 @@ inline constexpr char kMiscMetricsNewTabLocationBarEntriesStorage[] =
inline constexpr char kMiscMetricsTotalLocationBarEntriesStorage[] =
"brave.misc_metrics.total_location_bar_entries_storage";
inline constexpr char kMiscMetricsDayZeroAtInstall[] =
"brave.misc_metrics.day_zero_at_install";
inline constexpr char kMiscMetricsDayZeroVariantAtInstall[] =
"brave.misc_metrics.day_zero_variant_at_install";
} // namespace misc_metrics
#endif // BRAVE_COMPONENTS_MISC_METRICS_PREF_NAMES_H_
+6 -6
View File
@@ -257,8 +257,8 @@ inline constexpr auto kCollectedExpressHistograms =
base::MakeFixedFlatSet<std::string_view>(base::sorted_unique,{
"Brave.AIChat.UsageDaily.2",
"Brave.Core.UsageDaily",
"Brave.DayZero.Off.InstallTime",
"Brave.DayZero.On.InstallTime",
"Brave.DayZero.A.InstallTime",
"Brave.DayZero.B.InstallTime",
"Brave.Rewards.EnabledInstallationTime",
"Brave.Search.DefaultEngine.4",
"Brave.Today.IsEnabled",
@@ -329,16 +329,16 @@ inline constexpr auto kEphemeralHistograms =
inline constexpr auto kConstellationOnlyHistograms =
base::MakeFixedFlatSet<std::string_view>(base::sorted_unique,{
"Brave.Core.PrimaryLang",
"Brave.DayZero.Off.InstallTime",
"Brave.DayZero.On.InstallTime",
"Brave.DayZero.A.InstallTime",
"Brave.DayZero.B.InstallTime",
});
// List of metrics which will include the stored refcode when transmitted
// via the STAR/Constellation protocol.
inline constexpr auto kHistogramsWithRefcodeIncluded =
base::MakeFixedFlatSet<std::string_view>(base::sorted_unique,{
"Brave.DayZero.Off.InstallTime",
"Brave.DayZero.On.InstallTime",
"Brave.DayZero.A.InstallTime",
"Brave.DayZero.B.InstallTime",
});
// clang-format on