[go: nahoru, domu]

Record some metrics in the Memory Pressure dispatcher

Change-Id: I9780fb3a54efd0d8b7c7473574e10f66e5fede10
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2037452
Reviewed-by: François Doray <fdoray@chromium.org>
Reviewed-by: Jesse Doherty <jwd@chromium.org>
Auto-Submit: Sébastien Marchand <sebmarchand@chromium.org>
Commit-Queue: Jesse Doherty <jwd@chromium.org>
Cr-Commit-Position: refs/heads/master@{#739514}
diff --git a/base/util/memory_pressure/multi_source_memory_pressure_monitor.cc b/base/util/memory_pressure/multi_source_memory_pressure_monitor.cc
index 2b9a2c4..13bc119 100644
--- a/base/util/memory_pressure/multi_source_memory_pressure_monitor.cc
+++ b/base/util/memory_pressure/multi_source_memory_pressure_monitor.cc
@@ -6,7 +6,9 @@
 
 #include "base/bind.h"
 #include "base/logging.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/time/time.h"
 #include "base/util/memory_pressure/system_memory_pressure_evaluator.h"
 
 namespace util {
@@ -76,6 +78,54 @@
 void MultiSourceMemoryPressureMonitor::OnMemoryPressureLevelChanged(
     base::MemoryPressureListener::MemoryPressureLevel level) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK_NE(current_pressure_level_, level);
+
+  // Records the duration of the latest pressure session, there are 4
+  // transitions of interest:
+  //   - Moderate -> None
+  //   - Moderate -> Critical
+  //   - Critical -> Moderate
+  //   - Critical -> None
+
+  base::TimeTicks now = base::TimeTicks::Now();
+
+  if (current_pressure_level_ !=
+      MemoryPressureLevel::MEMORY_PRESSURE_LEVEL_NONE) {
+    DCHECK(!last_pressure_change_timestamp_.is_null());
+    std::string histogram_name = "Memory.PressureWindowDuration.";
+    switch (current_pressure_level_) {
+      // From:
+      case MemoryPressureLevel::MEMORY_PRESSURE_LEVEL_MODERATE: {
+        // To:
+        if (level == MemoryPressureLevel::MEMORY_PRESSURE_LEVEL_NONE) {
+          histogram_name += "ModerateToNone";
+        } else {  // MemoryPressureLevel::MEMORY_PRESSURE_LEVEL_CRITICAL
+          histogram_name += "ModerateToCritical";
+        }
+        break;
+      }
+      // From:
+      case MemoryPressureLevel::MEMORY_PRESSURE_LEVEL_CRITICAL: {
+        // To:
+        if (level == MemoryPressureLevel::MEMORY_PRESSURE_LEVEL_NONE) {
+          histogram_name += "CriticalToNone";
+        } else {  // MemoryPressureLevel::MEMORY_PRESSURE_LEVEL_MODERATE
+          histogram_name += "CriticalToModerate";
+        }
+        break;
+      }
+      case MemoryPressureLevel::MEMORY_PRESSURE_LEVEL_NONE:
+      default:
+        break;
+    }
+
+    base::UmaHistogramCustomTimes(
+        histogram_name, now - last_pressure_change_timestamp_,
+        base::TimeDelta::FromSeconds(1), base::TimeDelta::FromMinutes(10), 50);
+  }
+
+  last_pressure_change_timestamp_ = now;
+
   current_pressure_level_ = level;
 }