blob: 7b5e03a6195d8ef1e8e03effc3ca7cda47691085 [file] [log] [blame]
// Copyright 2017 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 SERVICES_RESOURCE_COORDINATOR_COORDINATION_UNIT_METRICS_COLLECTOR_H_
#define SERVICES_RESOURCE_COORDINATOR_COORDINATION_UNIT_METRICS_COLLECTOR_H_
#include "base/macros.h"
#include "base/metrics/histogram_macros.h"
#include "base/time/time.h"
#include "services/metrics/public/cpp/ukm_builders.h"
#include "services/metrics/public/cpp/ukm_source_id.h"
#include "services/resource_coordinator/observers/background_metrics_reporter.h"
#include "services/resource_coordinator/observers/coordination_unit_graph_observer.h"
namespace resource_coordinator {
class CoordinationUnitBase;
class FrameCoordinationUnitImpl;
class PageCoordinationUnitImpl;
extern const char kTabFromBackgroundedToFirstFaviconUpdatedUMA[];
extern const char kTabFromBackgroundedToFirstTitleUpdatedUMA[];
extern const char
kTabFromBackgroundedToFirstNonPersistentNotificationCreatedUMA[];
extern const base::TimeDelta kMetricsReportDelayTimeout;
extern const int kDefaultFrequencyUkmEQTReported;
// A MetricsCollector observes changes happened inside CoordinationUnit Graph,
// and reports UMA/UKM.
class MetricsCollector : public CoordinationUnitGraphObserver {
public:
MetricsCollector();
~MetricsCollector() override;
// CoordinationUnitGraphObserver implementation.
bool ShouldObserve(const CoordinationUnitBase* coordination_unit) override;
void OnCoordinationUnitCreated(
const CoordinationUnitBase* coordination_unit) override;
void OnBeforeCoordinationUnitDestroyed(
const CoordinationUnitBase* coordination_unit) override;
void OnPagePropertyChanged(const PageCoordinationUnitImpl* page_cu,
const mojom::PropertyType property_type,
int64_t value) override;
void OnProcessPropertyChanged(const ProcessCoordinationUnitImpl* process_cu,
const mojom::PropertyType property_type,
int64_t value) override;
void OnFrameEventReceived(const FrameCoordinationUnitImpl* frame_cu,
const mojom::Event event) override;
void OnPageEventReceived(const PageCoordinationUnitImpl* page_cu,
const mojom::Event event) override;
private:
struct MetricsReportRecord {
MetricsReportRecord();
MetricsReportRecord(const MetricsReportRecord& other);
void UpdateUKMSourceID(int64_t ukm_source_id);
void Reset();
BackgroundMetricsReporter<
ukm::builders::TabManager_Background_FirstFaviconUpdated,
kTabFromBackgroundedToFirstFaviconUpdatedUMA,
internal::UKMFrameReportType::kMainFrameOnly>
first_favicon_updated;
BackgroundMetricsReporter<
ukm::builders::
TabManager_Background_FirstNonPersistentNotificationCreated,
kTabFromBackgroundedToFirstNonPersistentNotificationCreatedUMA,
internal::UKMFrameReportType::kMainFrameAndChildFrame>
first_non_persistent_notification_created;
BackgroundMetricsReporter<
ukm::builders::TabManager_Background_FirstTitleUpdated,
kTabFromBackgroundedToFirstTitleUpdatedUMA,
internal::UKMFrameReportType::kMainFrameOnly>
first_title_updated;
};
struct UkmCollectionState {
int num_unreported_eqt_measurements = 0u;
ukm::SourceId ukm_source_id = ukm::kInvalidSourceId;
};
bool ShouldReportMetrics(const PageCoordinationUnitImpl* page_cu);
bool IsCollectingExpectedQueueingTimeForUkm(
const CoordinationUnitID& page_cu_id);
void RecordExpectedQueueingTimeForUkm(const CoordinationUnitID& page_cu_id,
int64_t expected_queueing_time);
void UpdateUkmSourceIdForPage(const CoordinationUnitID& page_cu_id,
ukm::SourceId ukm_source_id);
void UpdateWithFieldTrialParams();
void ResetMetricsReportRecord(CoordinationUnitID cu_id);
// The metrics_report_record_map_ is used to record whether a metric was
// already reported to avoid reporting multiple metrics.
std::map<CoordinationUnitID, MetricsReportRecord> metrics_report_record_map_;
std::map<CoordinationUnitID, UkmCollectionState> ukm_collection_state_map_;
// The number of reports to wait before reporting ExpectedQueueingTime. For
// example, if |frequency_ukm_eqt_reported_| is 2, then the first value is not
// reported, the second one is, the third one isn't, etc.
int frequency_ukm_eqt_reported_;
DISALLOW_COPY_AND_ASSIGN(MetricsCollector);
};
} // namespace resource_coordinator
#endif // SERVICES_RESOURCE_COORDINATOR_COORDINATION_UNIT_METRICS_COLLECTOR_H_