1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef COMPONENTS_RAPPOR_RAPPOR_SERVICE_H_ 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define COMPONENTS_RAPPOR_RAPPOR_SERVICE_H_ 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include <map> 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <string> 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/basictypes.h" 12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/macros.h" 13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/memory/scoped_ptr.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/timer/timer.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/metrics/daily_event.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class PrefRegistrySimple; 18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass PrefService; 19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace net { 21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass URLRequestContextGetter; 22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace rappor { 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass LogUploader; 27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass RapporMetric; 28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass RapporReports; 29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochstruct RapporParameters; 30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// The type of data stored in a metric. 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)enum RapporType { 33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // For sampling the eTLD+1 of a URL. 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ETLD_PLUS_ONE_RAPPOR_TYPE = 0, 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NUM_RAPPOR_TYPES 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// This class provides an interface for recording samples for rappor metrics, 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// and periodically generates and uploads reports based on the collected data. 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class RapporService { 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Constructs a RapporService. 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Calling code is responsible for ensuring that the lifetime of 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // |pref_service| is longer than the lifetime of RapporService. 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci explicit RapporService(PrefService* pref_service); 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual ~RapporService(); 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Add an observer for collecting daily metrics. 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void AddDailyObserver(scoped_ptr<metrics::DailyEvent::Observer> observer); 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Starts the periodic generation of reports and upload attempts. 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void Start(net::URLRequestContextGetter* context, 536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool metrics_enabled); 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Records a sample of the rappor metric specified by |metric_name|. 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Creates and initializes the metric, if it doesn't yet exist. 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void RecordSample(const std::string& metric_name, 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RapporType type, 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& sample); 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Sets the cohort value. For use by tests only. 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void SetCohortForTesting(uint32_t cohort) { cohort_ = cohort; } 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Sets the secret value. For use by tests only. 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void SetSecretForTesting(const std::string& secret) { secret_ = secret; } 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Registers the names of all of the preferences used by RapporService in the 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // provided PrefRegistry. This should be called before calling Start(). 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static void RegisterPrefs(PrefRegistrySimple* registry); 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected: 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Retrieves the cohort number this client was assigned to, generating it if 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // doesn't already exist. The cohort should be persistent. 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void LoadCohort(); 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Retrieves the value for secret_ from preferences, generating it if doesn't 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // already exist. The secret should be persistent, so that additional bits 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // from the client do not get exposed over time. 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void LoadSecret(); 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Logs all of the collected metrics to the reports proto message and clears 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // the internal map. Exposed for tests. Returns true if any metrics were 83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // recorded. 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool ExportMetrics(RapporReports* reports); 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Records a sample of the rappor metric specified by |parameters|. 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Creates and initializes the metric, if it doesn't yet exist. 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Exposed for tests. 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void RecordSampleInternal(const std::string& metric_name, 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const RapporParameters& parameters, 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& sample); 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Check if the service has been started successfully. 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool IsInitialized() const; 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Called whenever the logging interval elapses to generate a new log of 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // reports and pass it to the uploader. 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void OnLogInterval(); 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Finds a metric in the metrics_map_, creating it if it doesn't already 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // exist. 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RapporMetric* LookUpMetric(const std::string& metric_name, 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const RapporParameters& parameters); 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // A weak pointer to the PrefService used to read and write preferences. 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefService* pref_service_; 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Client-side secret used to generate fake bits. 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string secret_; 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The cohort this client is assigned to. -1 is uninitialized. 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int32_t cohort_; 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 115effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Timer which schedules calls to OnLogInterval(). 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::OneShotTimer<RapporService> log_rotation_timer_; 117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // A daily event for collecting metrics once a day. 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci metrics::DailyEvent daily_event_; 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // A private LogUploader instance for sending reports to the server. 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<LogUploader> uploader_; 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // We keep all registered metrics in a map, from name to metric. 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The map owns the metrics it contains. 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::map<std::string, RapporMetric*> metrics_map_; 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(RapporService); 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace rappor 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif // COMPONENTS_RAPPOR_RAPPOR_SERVICE_H_ 134