// 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 COMPONENTS_UKM_UKM_SERVICE_H_ #define COMPONENTS_UKM_UKM_SERVICE_H_ #include #include #include #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/threading/thread_checker.h" #include "build/build_config.h" #include "components/metrics/metrics_provider.h" #include "components/metrics/metrics_rotation_scheduler.h" #include "components/ukm/ukm_recorder_impl.h" #include "components/ukm/ukm_reporting_service.h" class PrefRegistrySimple; class PrefService; namespace metrics { class MetricsServiceClient; class UkmBrowserTest; } namespace ukm { namespace debug { class DebugPage; } // The URL-Keyed Metrics (UKM) service is responsible for gathering and // uploading reports that contain fine grained performance metrics including // URLs for top-level navigations. class UkmService : public UkmRecorderImpl { public: // Constructs a UkmService. // Calling code is responsible for ensuring that the lifetime of // |pref_service| is longer than the lifetime of UkmService. UkmService(PrefService* pref_service, metrics::MetricsServiceClient* client); ~UkmService() override; // Initializes the UKM service. void Initialize(); // Enables/disables transmission of accumulated logs. Logs that have already // been created will remain persisted to disk. void EnableReporting(); void DisableReporting(); #if defined(OS_ANDROID) || defined(OS_IOS) void OnAppEnterBackground(); void OnAppEnterForeground(); #endif // Records any collected data into logs, and writes to disk. void Flush(); // Deletes any unsent local data. void Purge(); // Resets the client id stored in prefs. void ResetClientId(); // Registers the specified |provider| to provide additional metrics into the // UKM log. Should be called during MetricsService initialization only. void RegisterMetricsProvider( std::unique_ptr provider); // Registers the names of all of the preferences used by UkmService in // the provided PrefRegistry. static void RegisterPrefs(PrefRegistrySimple* registry); private: friend ::ukm::debug::DebugPage; friend ::metrics::UkmBrowserTest; FRIEND_TEST_ALL_PREFIXES(UkmServiceTest, AddEntryWithEmptyMetrics); FRIEND_TEST_ALL_PREFIXES(UkmServiceTest, EntryBuilderAndSerialization); FRIEND_TEST_ALL_PREFIXES(UkmServiceTest, LogsUploadedOnlyWhenHavingSourcesOrEntries); FRIEND_TEST_ALL_PREFIXES(UkmServiceTest, MetricsProviderTest); FRIEND_TEST_ALL_PREFIXES(UkmServiceTest, PersistAndPurge); FRIEND_TEST_ALL_PREFIXES(UkmServiceTest, WhitelistEntryTest); // Starts metrics client initialization. void StartInitTask(); // Called when initialization tasks are complete, to notify the scheduler // that it can begin calling RotateLog. void FinishedInitTask(); // Periodically called by scheduler_ to advance processing of logs. void RotateLog(); // Constructs a new Report from available data and stores it in // persisted_logs_. void BuildAndStoreLog(); // Starts an upload of the next log from persisted_logs_. void StartScheduledUpload(); // Called by log_uploader_ when the an upload is completed. void OnLogUploadComplete(int response_code); // A weak pointer to the PrefService used to read and write preferences. PrefService* pref_service_; // The UKM client id stored in prefs. uint64_t client_id_; // The UKM session id stored in prefs. int32_t session_id_; // Used to interact with the embedder. Weak pointer; must outlive |this| // instance. metrics::MetricsServiceClient* const client_; // Registered metrics providers. std::vector> metrics_providers_; // Log reporting service. ukm::UkmReportingService reporting_service_; // The scheduler for determining when uploads should happen. std::unique_ptr scheduler_; base::ThreadChecker thread_checker_; bool initialize_started_; bool initialize_complete_; // Weak pointers factory used to post task on different threads. All weak // pointers managed by this factory have the same lifetime as UkmService. base::WeakPtrFactory self_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(UkmService); }; } // namespace ukm #endif // COMPONENTS_UKM_UKM_SERVICE_H_