diff --git a/browser/brave_local_state_prefs.cc b/browser/brave_local_state_prefs.cc index 7e709a5fbac..9d757cbd974 100644 --- a/browser/brave_local_state_prefs.cc +++ b/browser/brave_local_state_prefs.cc @@ -72,6 +72,7 @@ void RegisterLocalStatePrefsForMigration(PrefRegistrySimple* registry) { #if !BUILDFLAG(IS_ANDROID) // Added 10/2022 registry->RegisterBooleanPref(kDefaultBrowserPromptEnabled, true); + BraveUptimeTracker::RegisterPrefsForMigration(registry); #endif brave_wallet::RegisterLocalStatePrefsForMigration(registry); diff --git a/browser/p3a/p3a_core_metrics.cc b/browser/p3a/p3a_core_metrics.cc index f90ad868050..a54cfdd0c64 100644 --- a/browser/p3a/p3a_core_metrics.cc +++ b/browser/p3a/p3a_core_metrics.cc @@ -9,6 +9,7 @@ #include "base/metrics/histogram_macros.h" #include "base/time/time.h" +#include "brave/components/p3a_utils/bucket.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_list.h" @@ -51,44 +52,66 @@ const char* GetPrefNameForProfile(Profile* profile) { BraveUptimeTracker* g_brave_uptime_tracker_instance = nullptr; -constexpr size_t kUsageTimeQueryIntervalMinutes = 1; -constexpr char kDailyUptimesListPrefName[] = "daily_uptimes"; +constexpr base::TimeDelta kUsageTimeQueryInterval = base::Minutes(1); +constexpr base::TimeDelta kUsageTimeReportInterval = base::Days(1); +constexpr char kDailyUptimesListPrefName[] = "daily_uptimes"; // DEPRECATED +constexpr char kDailyUptimeSumPrefName[] = "brave.misc_metrics.uptime_sum"; +constexpr char kDailyUptimeFrameStartTimePrefName[] = + "brave.misc_metrics.uptime_frame_start_time"; + +constexpr char kBrowserOpenTimeHistogramName[] = "Brave.Uptime.BrowserOpenTime"; + +constexpr int kBrowserOpenTimeBuckets[] = {30, 60, 120, 180, 300, 420, 600}; } // namespace BraveUptimeTracker::BraveUptimeTracker(PrefService* local_state) - : state_(local_state, kDailyUptimesListPrefName) { - timer_.Start(FROM_HERE, base::Minutes(kUsageTimeQueryIntervalMinutes), + : local_state_(local_state), + report_frame_start_time_( + local_state->GetTime(kDailyUptimeFrameStartTimePrefName)), + report_frame_time_sum_( + local_state_->GetTimeDelta(kDailyUptimeSumPrefName)) { + if (report_frame_start_time_.is_null()) { + // If today is the first time monitoring uptime, set the frame start time + // to now. + ResetReportFrame(); + } + RecordP3A(); + timer_.Start(FROM_HERE, kUsageTimeQueryInterval, base::BindRepeating(&BraveUptimeTracker::RecordUsage, base::Unretained(this))); } void BraveUptimeTracker::RecordUsage() { const base::TimeDelta new_total = usage_clock_.GetTotalUsageTime(); - const base::TimeDelta interval = new_total - current_total_usage_; - if (interval > base::TimeDelta()) { - state_.AddDelta(interval.InSeconds()); + const base::TimeDelta total_diff = new_total - current_total_usage_; + if (total_diff > base::TimeDelta()) { + report_frame_time_sum_ += total_diff; current_total_usage_ = new_total; + local_state_->SetTimeDelta(kDailyUptimeSumPrefName, report_frame_time_sum_); RecordP3A(); } } void BraveUptimeTracker::RecordP3A() { - int answer = 0; - if (state_.IsOneWeekPassed()) { - uint64_t total = state_.GetWeeklySum(); - const int minutes = base::Seconds(total).InMinutes(); - DCHECK_GE(minutes, 0); - if (0 <= minutes && minutes < 30) { - answer = 1; - } else if (30 <= minutes && minutes < 5 * 60) { - answer = 2; - } else { - answer = 3; - } + if ((base::Time::Now() - report_frame_start_time_) < + kUsageTimeReportInterval) { + // Do not report, since 1 day has not passed. + return; } - UMA_HISTOGRAM_EXACT_LINEAR("Brave.Uptime.BrowserOpenMinutes", answer, 3); + p3a_utils::RecordToHistogramBucket(kBrowserOpenTimeHistogramName, + kBrowserOpenTimeBuckets, + report_frame_time_sum_.InMinutes()); + ResetReportFrame(); +} + +void BraveUptimeTracker::ResetReportFrame() { + report_frame_time_sum_ = base::TimeDelta(); + report_frame_start_time_ = base::Time::Now(); + local_state_->SetTimeDelta(kDailyUptimeSumPrefName, report_frame_time_sum_); + local_state_->SetTime(kDailyUptimeFrameStartTimePrefName, + report_frame_start_time_); } BraveUptimeTracker::~BraveUptimeTracker() = default; @@ -98,9 +121,21 @@ void BraveUptimeTracker::CreateInstance(PrefService* local_state) { } void BraveUptimeTracker::RegisterPrefs(PrefRegistrySimple* registry) { + registry->RegisterTimeDeltaPref(kDailyUptimeSumPrefName, base::TimeDelta()); + registry->RegisterTimePref(kDailyUptimeFrameStartTimePrefName, base::Time()); +} + +void BraveUptimeTracker::RegisterPrefsForMigration( + PrefRegistrySimple* registry) { + // Added 10/2023 registry->RegisterListPref(kDailyUptimesListPrefName); } +void BraveUptimeTracker::MigrateObsoletePrefs(PrefService* local_state) { + // Added 10/2023 + local_state->ClearPref(kDailyUptimesListPrefName); +} + BraveWindowTracker::BraveWindowTracker(PrefService* local_state) : local_state_(local_state) { if (!local_state) { diff --git a/browser/p3a/p3a_core_metrics.h b/browser/p3a/p3a_core_metrics.h index be675c338be..f96eebc46b1 100644 --- a/browser/p3a/p3a_core_metrics.h +++ b/browser/p3a/p3a_core_metrics.h @@ -17,11 +17,8 @@ #error This file should only be included on desktop. #endif -#include - #include "base/memory/raw_ptr.h" #include "base/timer/timer.h" -#include "brave/components/time_period_storage/weekly_storage.h" #include "chrome/browser/resource_coordinator/usage_clock.h" #include "chrome/browser/ui/browser_list_observer.h" @@ -40,15 +37,22 @@ class BraveUptimeTracker { static void CreateInstance(PrefService* local_state); static void RegisterPrefs(PrefRegistrySimple* registry); + static void RegisterPrefsForMigration(PrefRegistrySimple* registry); + static void MigrateObsoletePrefs(PrefService* local_state); private: void RecordUsage(); void RecordP3A(); + void ResetReportFrame(); + + raw_ptr local_state_; resource_coordinator::UsageClock usage_clock_; base::RepeatingTimer timer_; base::TimeDelta current_total_usage_; - WeeklyStorage state_; + + base::Time report_frame_start_time_; + base::TimeDelta report_frame_time_sum_; }; // BraveWindowTracker is under !OS_ANDROID guard because diff --git a/chromium_src/chrome/browser/prefs/browser_prefs.cc b/chromium_src/chrome/browser/prefs/browser_prefs.cc index 9b2e50293b0..985088df7c5 100644 --- a/chromium_src/chrome/browser/prefs/browser_prefs.cc +++ b/chromium_src/chrome/browser/prefs/browser_prefs.cc @@ -30,6 +30,7 @@ #include "third_party/widevine/cdm/buildflags.h" #if !BUILDFLAG(IS_ANDROID) +#include "brave/browser/p3a/p3a_core_metrics.h" #include "brave/browser/search_engines/search_engine_provider_util.h" #endif @@ -262,6 +263,7 @@ void MigrateObsoleteLocalStatePrefs(PrefService* local_state) { #if !BUILDFLAG(IS_ANDROID) // Added 10/2022 local_state->ClearPref(kDefaultBrowserPromptEnabled); + brave::BraveUptimeTracker::MigrateObsoletePrefs(local_state); #endif brave_search_conversion::p3a::MigrateObsoleteLocalStatePrefs(local_state); diff --git a/components/p3a/metric_names.h b/components/p3a/metric_names.h index 403db479d48..89a710926f8 100644 --- a/components/p3a/metric_names.h +++ b/components/p3a/metric_names.h @@ -92,7 +92,6 @@ constexpr inline auto kCollectedTypicalHistograms = "Brave.Toolbar.MenuOpens", "Brave.Sync.Status.2", "Brave.Sync.ProgressTokenEverReset", - "Brave.Uptime.BrowserOpenMinutes", "Brave.VerticalTabs.GroupTabs", "Brave.VerticalTabs.OpenTabs", "Brave.VerticalTabs.PinnedTabs", @@ -221,6 +220,7 @@ constexpr inline auto kCollectedExpressHistograms = "Brave.Rewards.EnabledInstallationTime", "Brave.Today.IsEnabled", "Brave.Today.UsageDaily", + "Brave.Uptime.BrowserOpenTime", "Brave.Wallet.UsageDaily" });