| Index: third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
 | 
| diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
 | 
| index b3812dc5780262f6b79143108f71885aee99d4b6..a4119f0ec830a77ce9e80d083928015d5b43209f 100644
 | 
| --- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
 | 
| +++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
 | 
| @@ -53,9 +53,11 @@ constexpr base::TimeDelta kThrottlingDelayAfterAudioIsPlayed =
 | 
|      base::TimeDelta::FromSeconds(5);
 | 
|  constexpr base::TimeDelta kQueueingTimeWindowDuration =
 | 
|      base::TimeDelta::FromSeconds(1);
 | 
| -// Maximal bound on task duration for reporting.
 | 
| -constexpr base::TimeDelta kMaxTaskDurationForReporting =
 | 
| -    base::TimeDelta::FromMinutes(1);
 | 
| +// Threshold for discarding ultra-long tasks. It is assumed that ultra-long
 | 
| +// tasks are reporting glitches (e.g. system falling asleep in the middle
 | 
| +// of the task).
 | 
| +constexpr base::TimeDelta kLongTaskDiscardingThreshold =
 | 
| +    base::TimeDelta::FromSeconds(30);
 | 
|  
 | 
|  void ReportForegroundRendererTaskLoad(base::TimeTicks time, double load) {
 | 
|    if (!blink::RuntimeEnabledFeatures::timerThrottlingForBackgroundTabsEnabled())
 | 
| @@ -64,8 +66,8 @@ void ReportForegroundRendererTaskLoad(base::TimeTicks time, double load) {
 | 
|    int load_percentage = static_cast<int>(load * 100);
 | 
|    DCHECK_LE(load_percentage, 100);
 | 
|  
 | 
| -  UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.ForegroundRendererMainThreadLoad",
 | 
| -                           load_percentage);
 | 
| +  UMA_HISTOGRAM_PERCENTAGE(
 | 
| +      "RendererScheduler.ForegroundRendererMainThreadLoad2", load_percentage);
 | 
|    TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
 | 
|                   "RendererScheduler.ForegroundRendererLoad", load_percentage);
 | 
|  }
 | 
| @@ -77,8 +79,8 @@ void ReportBackgroundRendererTaskLoad(base::TimeTicks time, double load) {
 | 
|    int load_percentage = static_cast<int>(load * 100);
 | 
|    DCHECK_LE(load_percentage, 100);
 | 
|  
 | 
| -  UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.BackgroundRendererMainThreadLoad",
 | 
| -                           load_percentage);
 | 
| +  UMA_HISTOGRAM_PERCENTAGE(
 | 
| +      "RendererScheduler.BackgroundRendererMainThreadLoad2", load_percentage);
 | 
|    TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
 | 
|                   "RendererScheduler.BackgroundRendererLoad", load_percentage);
 | 
|  }
 | 
| @@ -220,7 +222,7 @@ RendererSchedulerImpl::MainThreadOnly::MainThreadOnly(
 | 
|        rail_mode_observer(nullptr),
 | 
|        wake_up_budget_pool(nullptr),
 | 
|        task_duration_per_queue_type_histogram(base::Histogram::FactoryGet(
 | 
| -          "RendererScheduler.TaskDurationPerQueueType",
 | 
| +          "RendererScheduler.TaskDurationPerQueueType2",
 | 
|            1,
 | 
|            static_cast<int>(TaskQueue::QueueType::COUNT),
 | 
|            static_cast<int>(TaskQueue::QueueType::COUNT) + 1,
 | 
| @@ -1841,26 +1843,31 @@ void RendererSchedulerImpl::DidProcessTask(TaskQueue* task_queue,
 | 
|    task_queue_throttler()->OnTaskRunTimeReported(task_queue, start_time_ticks,
 | 
|                                                  end_time_ticks);
 | 
|  
 | 
| -  // We want to measure thread time here, but for efficiency reasons
 | 
| -  // we stick with wall time.
 | 
| -  GetMainThreadOnly().foreground_main_thread_load_tracker.RecordTaskTime(
 | 
| -      start_time_ticks, end_time_ticks);
 | 
| -  GetMainThreadOnly().background_main_thread_load_tracker.RecordTaskTime(
 | 
| -      start_time_ticks, end_time_ticks);
 | 
| -
 | 
|    // TODO(altimin): Per-page metrics should also be considered.
 | 
| -  RecordTaskMetrics(task_queue->GetQueueType(),
 | 
| -                    end_time_ticks - start_time_ticks);
 | 
| +  RecordTaskMetrics(task_queue->GetQueueType(), start_time_ticks,
 | 
| +                    end_time_ticks);
 | 
|  }
 | 
|  
 | 
|  void RendererSchedulerImpl::RecordTaskMetrics(TaskQueue::QueueType queue_type,
 | 
| -                                              base::TimeDelta duration) {
 | 
| -  UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime",
 | 
| +                                              base::TimeTicks start_time,
 | 
| +                                              base::TimeTicks end_time) {
 | 
| +  base::TimeDelta duration = end_time - start_time;
 | 
| +  if (duration > kLongTaskDiscardingThreshold)
 | 
| +    return;
 | 
| +
 | 
| +  UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime2",
 | 
|                                duration.InMicroseconds(), 1, 1000 * 1000, 50);
 | 
|  
 | 
| +  // We want to measure thread time here, but for efficiency reasons
 | 
| +  // we stick with wall time.
 | 
| +  GetMainThreadOnly().foreground_main_thread_load_tracker.RecordTaskTime(
 | 
| +      start_time, end_time);
 | 
| +  GetMainThreadOnly().background_main_thread_load_tracker.RecordTaskTime(
 | 
| +      start_time, end_time);
 | 
| +
 | 
|    // TODO(altimin): See whether this metric is still useful after
 | 
|    // adding RendererScheduler.TaskDurationPerQueueType.
 | 
| -  UMA_HISTOGRAM_ENUMERATION("RendererScheduler.NumberOfTasksPerQueueType",
 | 
| +  UMA_HISTOGRAM_ENUMERATION("RendererScheduler.NumberOfTasksPerQueueType2",
 | 
|                              static_cast<int>(queue_type),
 | 
|                              static_cast<int>(TaskQueue::QueueType::COUNT));
 | 
|  
 | 
| @@ -1870,8 +1877,6 @@ void RendererSchedulerImpl::RecordTaskMetrics(TaskQueue::QueueType queue_type,
 | 
|  void RendererSchedulerImpl::RecordTaskDurationPerQueueType(
 | 
|      TaskQueue::QueueType queue_type,
 | 
|      base::TimeDelta duration) {
 | 
| -  duration = std::min(duration, kMaxTaskDurationForReporting);
 | 
| -
 | 
|    // Report only whole milliseconds to avoid overflow.
 | 
|    base::TimeDelta& unreported_duration =
 | 
|        GetMainThreadOnly()
 | 
| 
 |