| // Copyright 2015 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. |
| |
| #ifndef COMPONENTS_PAGE_LOAD_METRICS_BROWSER_OBSERVERS_CORE_UMA_PAGE_LOAD_METRICS_OBSERVER_H_ |
| #define COMPONENTS_PAGE_LOAD_METRICS_BROWSER_OBSERVERS_CORE_UMA_PAGE_LOAD_METRICS_OBSERVER_H_ |
| |
| #include "base/time/time.h" |
| #include "components/page_load_metrics/browser/observers/click_input_tracker.h" |
| #include "components/page_load_metrics/browser/page_load_metrics_observer.h" |
| #include "content/public/browser/navigation_handle_timing.h" |
| #include "services/metrics/public/cpp/ukm_source.h" |
| |
| namespace internal { |
| |
| // NOTE: Some of these histograms are separated into a separate histogram |
| // specified by the ".Background" suffix. For these events, we put them into the |
| // background histogram if the web contents was ever in the background from |
| // navigation start to the event in question. |
| extern const char kHistogramNumInteractions[]; |
| extern const char |
| kHistogramAverageUserInteractionLatencyOverBudgetMaxEventDuration[]; |
| extern const char |
| kHistogramSlowUserInteractionLatencyOverBudgetHighPercentile2MaxEventDuration |
| []; |
| extern const char |
| kHistogramUserInteractionLatencyHighPercentile2MaxEventDuration[]; |
| extern const char |
| kHistogramSumOfUserInteractionLatencyOverBudgetMaxEventDuration[]; |
| extern const char kHistogramWorstUserInteractionLatencyMaxEventDuration[]; |
| extern const char kHistogramFirstInputDelay[]; |
| extern const char kHistogramFirstInputTimestamp[]; |
| extern const char kHistogramFirstInputDelay4[]; |
| extern const char kHistogramFirstInputTimestamp4[]; |
| extern const char kHistogramLongestInputDelay[]; |
| extern const char kHistogramLongestInputTimestamp[]; |
| extern const char kHistogramFirstPaint[]; |
| extern const char kHistogramFirstImagePaint[]; |
| extern const char kHistogramDomContentLoaded[]; |
| extern const char kHistogramLoad[]; |
| extern const char kHistogramFirstContentfulPaint[]; |
| extern const char kHistogramFirstMeaningfulPaint[]; |
| extern const char kHistogramLargestContentfulPaint[]; |
| extern const char kHistogramLargestContentfulPaintContentType[]; |
| extern const char kHistogramLargestContentfulPaintMainFrame[]; |
| extern const char kHistogramLargestContentfulPaintMainFrameContentType[]; |
| extern const char kHistogramLargestContentfulPaintCrossSiteSubFrame[]; |
| extern const char kHistogramParseDuration[]; |
| extern const char kHistogramParseBlockedOnScriptLoad[]; |
| extern const char kHistogramParseBlockedOnScriptExecution[]; |
| extern const char kHistogramParseStartToFirstMeaningfulPaint[]; |
| |
| extern const char kBackgroundHistogramFirstImagePaint[]; |
| extern const char kBackgroundHistogramDomContentLoaded[]; |
| extern const char kBackgroundHistogramLoad[]; |
| extern const char kBackgroundHistogramFirstPaint[]; |
| |
| extern const char kHistogramLoadTypeFirstContentfulPaintReload[]; |
| extern const char kHistogramLoadTypeFirstContentfulPaintForwardBack[]; |
| extern const char kHistogramLoadTypeFirstContentfulPaintNewNavigation[]; |
| |
| extern const char kHistogramLoadTypeParseStartReload[]; |
| extern const char kHistogramLoadTypeParseStartForwardBack[]; |
| extern const char kHistogramLoadTypeParseStartNewNavigation[]; |
| |
| extern const char kHistogramUserGestureNavigationToForwardBack[]; |
| |
| extern const char kHistogramPageTimingForegroundDuration[]; |
| extern const char kHistogramPageTimingForegroundDurationNoCommit[]; |
| |
| extern const char kHistogramFirstMeaningfulPaintStatus[]; |
| |
| extern const char kHistogramCachedResourceLoadTimePrefix[]; |
| extern const char kHistogramCommitSentToFirstSubresourceLoadStart[]; |
| extern const char kHistogramNavigationToFirstSubresourceLoadStart[]; |
| extern const char kHistogramResourceLoadTimePrefix[]; |
| extern const char kHistogramTotalSubresourceLoadTimeAtFirstContentfulPaint[]; |
| extern const char kHistogramFirstEligibleToPaint[]; |
| extern const char kHistogramFirstEligibleToPaintToFirstPaint[]; |
| |
| extern const char kHistogramFirstNonScrollInputAfterFirstPaint[]; |
| extern const char kHistogramFirstScrollInputAfterFirstPaint[]; |
| |
| extern const char kHistogramPageLoadTotalBytes[]; |
| extern const char kHistogramPageLoadNetworkBytes[]; |
| extern const char kHistogramPageLoadCacheBytes[]; |
| extern const char kHistogramPageLoadNetworkBytesIncludingHeaders[]; |
| extern const char kHistogramPageLoadUnfinishedBytes[]; |
| |
| extern const char kHistogramPageLoadCpuTotalUsage[]; |
| extern const char kHistogramPageLoadCpuTotalUsageForegrounded[]; |
| |
| extern const char kHistogramLoadTypeTotalBytesForwardBack[]; |
| extern const char kHistogramLoadTypeNetworkBytesForwardBack[]; |
| extern const char kHistogramLoadTypeCacheBytesForwardBack[]; |
| |
| extern const char kHistogramLoadTypeTotalBytesReload[]; |
| extern const char kHistogramLoadTypeNetworkBytesReload[]; |
| extern const char kHistogramLoadTypeCacheBytesReload[]; |
| |
| extern const char kHistogramLoadTypeTotalBytesNewNavigation[]; |
| extern const char kHistogramLoadTypeNetworkBytesNewNavigation[]; |
| extern const char kHistogramLoadTypeCacheBytesNewNavigation[]; |
| |
| extern const char kHistogramInputToNavigation[]; |
| extern const char kBackgroundHistogramInputToNavigation[]; |
| extern const char kHistogramInputToNavigationLinkClick[]; |
| extern const char kHistogramInputToNavigationOmnibox[]; |
| extern const char kHistogramInputToFirstPaint[]; |
| extern const char kBackgroundHistogramInputToFirstPaint[]; |
| extern const char kHistogramInputToFirstContentfulPaint[]; |
| extern const char kBackgroundHistogramInputToFirstContentfulPaint[]; |
| extern const char kHistogramBackForwardCacheEvent[]; |
| |
| // Navigation metrics from the navigation start. |
| extern const char |
| kHistogramNavigationTimingNavigationStartToFirstRequestStart[]; |
| extern const char |
| kHistogramNavigationTimingNavigationStartToFirstResponseStart[]; |
| extern const char |
| kHistogramNavigationTimingNavigationStartToFirstLoaderCallback[]; |
| extern const char |
| kHistogramNavigationTimingNavigationStartToFinalRequestStart[]; |
| extern const char |
| kHistogramNavigationTimingNavigationStartToFinalResponseStart[]; |
| extern const char |
| kHistogramNavigationTimingNavigationStartToFinalLoaderCallback[]; |
| extern const char |
| kHistogramNavigationTimingNavigationStartToNavigationCommitSent[]; |
| |
| // Navigation metrics between milestones. |
| extern const char |
| kHistogramNavigationTimingFirstRequestStartToFirstResponseStart[]; |
| extern const char |
| kHistogramNavigationTimingFirstResponseStartToFirstLoaderCallback[]; |
| extern const char |
| kHistogramNavigationTimingFinalRequestStartToFinalResponseStart[]; |
| extern const char |
| kHistogramNavigationTimingFinalResponseStartToFinalLoaderCallback[]; |
| extern const char |
| kHistogramNavigationTimingFinalLoaderCallbackToNavigationCommitSent[]; |
| |
| // V8 memory usage metrics. |
| extern const char kHistogramMemoryMainframe[]; |
| extern const char kHistogramMemorySubframeAggregate[]; |
| extern const char kHistogramMemoryTotal[]; |
| extern const char kHistogramMemoryUpdateReceived[]; |
| |
| enum FirstMeaningfulPaintStatus { |
| FIRST_MEANINGFUL_PAINT_RECORDED, |
| FIRST_MEANINGFUL_PAINT_BACKGROUNDED, |
| FIRST_MEANINGFUL_PAINT_DID_NOT_REACH_NETWORK_STABLE, |
| FIRST_MEANINGFUL_PAINT_USER_INTERACTION_BEFORE_FMP, |
| FIRST_MEANINGFUL_PAINT_DID_NOT_REACH_FIRST_CONTENTFUL_PAINT, |
| FIRST_MEANINGFUL_PAINT_LAST_ENTRY |
| }; |
| |
| // Please keep in sync with PageLoadBackForwardCacheEvent in |
| // tools/metrics/histograms/enums.xml. These values should not be renumbered. |
| enum class PageLoadBackForwardCacheEvent { |
| kEnterBackForwardCache = 0, |
| kRestoreFromBackForwardCache = 1, |
| kMaxValue = kRestoreFromBackForwardCache, |
| }; |
| |
| } // namespace internal |
| |
| // Observer responsible for recording 'core' UMA page load metrics. Core metrics |
| // are maintained by loading-dev team, typically the metrics under |
| // PageLoad.(Document|Paint|Parse)Timing.*. |
| class UmaPageLoadMetricsObserver |
| : public page_load_metrics::PageLoadMetricsObserver { |
| public: |
| UmaPageLoadMetricsObserver(); |
| |
| UmaPageLoadMetricsObserver(const UmaPageLoadMetricsObserver&) = delete; |
| UmaPageLoadMetricsObserver& operator=(const UmaPageLoadMetricsObserver&) = |
| delete; |
| |
| ~UmaPageLoadMetricsObserver() override; |
| |
| // page_load_metrics::PageLoadMetricsObserver: |
| ObservePolicy OnRedirect( |
| content::NavigationHandle* navigation_handle) override; |
| ObservePolicy OnCommit(content::NavigationHandle* navigation_handle, |
| ukm::SourceId source_id) override; |
| void OnDomContentLoadedEventStart( |
| const page_load_metrics::mojom::PageLoadTiming& timing) override; |
| void OnLoadEventStart( |
| const page_load_metrics::mojom::PageLoadTiming& timing) override; |
| void OnFirstPaintInPage( |
| const page_load_metrics::mojom::PageLoadTiming& timing) override; |
| void OnFirstImagePaintInPage( |
| const page_load_metrics::mojom::PageLoadTiming& timing) override; |
| void OnFirstContentfulPaintInPage( |
| const page_load_metrics::mojom::PageLoadTiming& timing) override; |
| void OnFirstMeaningfulPaintInMainFrameDocument( |
| const page_load_metrics::mojom::PageLoadTiming& timing) override; |
| void OnFirstInputInPage( |
| const page_load_metrics::mojom::PageLoadTiming& timing) override; |
| void OnParseStart( |
| const page_load_metrics::mojom::PageLoadTiming& timing) override; |
| void OnParseStop( |
| const page_load_metrics::mojom::PageLoadTiming& timing) override; |
| void OnComplete( |
| const page_load_metrics::mojom::PageLoadTiming& timing) override; |
| void OnFailedProvisionalLoad( |
| const page_load_metrics::FailedProvisionalLoadInfo& failed_load_info) |
| override; |
| void OnLoadedResource(const page_load_metrics::ExtraRequestCompleteInfo& |
| extra_request_complete_info) override; |
| ObservePolicy FlushMetricsOnAppEnterBackground( |
| const page_load_metrics::mojom::PageLoadTiming& timing) override; |
| void OnUserInput( |
| const blink::WebInputEvent& event, |
| const page_load_metrics::mojom::PageLoadTiming& timing) override; |
| void OnResourceDataUseObserved( |
| content::RenderFrameHost* rfh, |
| const std::vector<page_load_metrics::mojom::ResourceDataUpdatePtr>& |
| resources) override; |
| void OnCpuTimingUpdate( |
| content::RenderFrameHost* subframe_rfh, |
| const page_load_metrics::mojom::CpuTiming& timing) override; |
| ObservePolicy OnEnterBackForwardCache( |
| const page_load_metrics::mojom::PageLoadTiming& timing) override; |
| void OnRestoreFromBackForwardCache( |
| const page_load_metrics::mojom::PageLoadTiming& timing, |
| content::NavigationHandle* navigation_handle) override; |
| void OnV8MemoryChanged(const std::vector<page_load_metrics::MemoryUpdate>& |
| memory_updates) override; |
| |
| private: |
| // Class to keep track of per-frame memory usage by V8. |
| class MemoryUsage { |
| public: |
| void UpdateUsage(int64_t delta_bytes); |
| |
| uint64_t current_bytes_used() { return current_bytes_used_; } |
| uint64_t max_bytes_used() { return max_bytes_used_; } |
| |
| private: |
| uint64_t current_bytes_used_ = 0U; |
| uint64_t max_bytes_used_ = 0U; |
| }; |
| |
| void RecordNavigationTimingHistograms(); |
| void RecordTimingHistograms( |
| const page_load_metrics::mojom::PageLoadTiming& main_frame_timing); |
| void RecordByteAndResourceHistograms( |
| const page_load_metrics::mojom::PageLoadTiming& timing); |
| void RecordCpuUsageHistograms(); |
| void RecordForegroundDurationHistograms( |
| const page_load_metrics::mojom::PageLoadTiming& timing, |
| base::TimeTicks app_background_time); |
| void RecordV8MemoryHistograms(); |
| void RecordNormalizedResponsivenessMetrics(); |
| |
| content::NavigationHandleTiming navigation_handle_timing_; |
| |
| ui::PageTransition transition_; |
| bool was_no_store_main_resource_; |
| |
| // The number of body (not header) prefilter bytes consumed by completed |
| // requests for the page. |
| int64_t cache_bytes_; |
| int64_t network_bytes_; |
| |
| // The number of prefilter bytes consumed by completed and partial network |
| // requests for the page. |
| int64_t network_bytes_including_headers_; |
| |
| // The CPU usage attributed to this page. |
| base::TimeDelta total_cpu_usage_; |
| base::TimeDelta foreground_cpu_usage_; |
| |
| // Size of the redirect chain, which excludes the first URL. |
| int redirect_chain_size_; |
| |
| // True if we've received a non-scroll input (touch tap or mouse up) |
| // after first paint has happened. |
| bool received_non_scroll_input_after_first_paint_ = false; |
| |
| // True if we've received a scroll input after first paint has happened. |
| bool received_scroll_input_after_first_paint_ = false; |
| |
| base::TimeTicks first_paint_; |
| |
| // Tracks user input clicks for possible click burst. |
| page_load_metrics::ClickInputTracker click_tracker_; |
| |
| // V8 Memory Usage: whether a memory update was received, the usage of the |
| // mainframe, the aggregate usage of all subframes on the page, and the |
| // aggregate usage of all frames on the page (including the main frame), |
| // respectively. |
| bool memory_update_received_ = false; |
| MemoryUsage main_frame_memory_usage_; |
| MemoryUsage aggregate_subframe_memory_usage_; |
| MemoryUsage aggregate_total_memory_usage_; |
| |
| bool received_first_subresource_load_ = false; |
| base::TimeDelta total_subresource_load_time_; |
| }; |
| |
| #endif // COMPONENTS_PAGE_LOAD_METRICS_BROWSER_OBSERVERS_CORE_UMA_PAGE_LOAD_METRICS_OBSERVER_H_ |