| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // This file defines a service that collects information about the user | 5 // This file defines a service that collects information about the user |
| 6 // experience in order to help improve future versions of the app. | 6 // experience in order to help improve future versions of the app. |
| 7 | 7 |
| 8 #ifndef CHROME_BROWSER_METRICS_METRICS_SERVICE_H_ | 8 #ifndef CHROME_BROWSER_METRICS_METRICS_SERVICE_H_ |
| 9 #define CHROME_BROWSER_METRICS_METRICS_SERVICE_H_ | 9 #define CHROME_BROWSER_METRICS_METRICS_SERVICE_H_ |
| 10 | 10 |
| 11 #include <list> | 11 #include <list> |
| 12 #include <map> | 12 #include <map> |
| 13 #include <set> | 13 #include <set> |
| 14 #include <string> | 14 #include <string> |
| 15 #include <vector> | 15 #include <vector> |
| 16 | 16 |
| 17 #include "base/basictypes.h" | 17 #include "base/basictypes.h" |
| 18 #include "base/gtest_prod_util.h" | 18 #include "base/gtest_prod_util.h" |
| 19 #include "base/histogram.h" | 19 #include "base/histogram.h" |
| 20 #include "base/scoped_ptr.h" | 20 #include "base/scoped_ptr.h" |
| 21 #include "base/values.h" | 21 #include "base/values.h" |
| 22 #include "chrome/browser/metrics/metrics_log.h" | 22 #include "chrome/browser/metrics/metrics_log.h" |
| 23 #include "chrome/common/child_process_info.h" | 23 #include "chrome/common/child_process_info.h" |
| 24 #include "chrome/common/metrics_helpers.h" |
| 24 #include "chrome/common/net/url_fetcher.h" | 25 #include "chrome/common/net/url_fetcher.h" |
| 25 #include "chrome/common/notification_registrar.h" | 26 #include "chrome/common/notification_registrar.h" |
| 26 #include "webkit/glue/plugins/webplugininfo.h" | 27 #include "webkit/glue/plugins/webplugininfo.h" |
| 27 | 28 |
| 28 #if defined(OS_CHROMEOS) | 29 #if defined(OS_CHROMEOS) |
| 29 #include "chrome/browser/chromeos/external_metrics.h" | 30 #include "chrome/browser/chromeos/external_metrics.h" |
| 30 #endif | 31 #endif |
| 31 | 32 |
| 32 class BookmarkModel; | 33 class BookmarkModel; |
| 33 class BookmarkNode; | 34 class BookmarkNode; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 63 | 64 |
| 64 // The number of instances of this child process that have been created. | 65 // The number of instances of this child process that have been created. |
| 65 // An instance is a DOM object rendered by this child process during a page | 66 // An instance is a DOM object rendered by this child process during a page |
| 66 // load. | 67 // load. |
| 67 int instances; | 68 int instances; |
| 68 | 69 |
| 69 ChildProcessInfo::ProcessType process_type; | 70 ChildProcessInfo::ProcessType process_type; |
| 70 }; | 71 }; |
| 71 | 72 |
| 72 class MetricsService : public NotificationObserver, | 73 class MetricsService : public NotificationObserver, |
| 73 public URLFetcher::Delegate { | 74 public URLFetcher::Delegate, |
| 75 public MetricsServiceBase { |
| 74 public: | 76 public: |
| 75 MetricsService(); | 77 MetricsService(); |
| 76 virtual ~MetricsService(); | 78 virtual ~MetricsService(); |
| 77 | 79 |
| 78 // Sets whether the user permits uploading. The argument of this function | 80 // Sets whether the user permits uploading. The argument of this function |
| 79 // should match the checkbox in Options. | 81 // should match the checkbox in Options. |
| 80 void SetUserPermitsUpload(bool enabled); | 82 void SetUserPermitsUpload(bool enabled); |
| 81 | 83 |
| 82 // Start/stop the metrics recording and uploading machine. These should be | 84 // Start/stop the metrics recording and uploading machine. These should be |
| 83 // used on startup and when the user clicks the checkbox in the prefs. | 85 // used on startup and when the user clicks the checkbox in the prefs. |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 143 enum State { | 145 enum State { |
| 144 INITIALIZED, // Constructor was called. | 146 INITIALIZED, // Constructor was called. |
| 145 INIT_TASK_SCHEDULED, // Waiting for deferred init tasks to complete. | 147 INIT_TASK_SCHEDULED, // Waiting for deferred init tasks to complete. |
| 146 INIT_TASK_DONE, // Waiting for timer to send initial log. | 148 INIT_TASK_DONE, // Waiting for timer to send initial log. |
| 147 INITIAL_LOG_READY, // Initial log generated, and waiting for reply. | 149 INITIAL_LOG_READY, // Initial log generated, and waiting for reply. |
| 148 SEND_OLD_INITIAL_LOGS, // Sending unsent logs from previous session. | 150 SEND_OLD_INITIAL_LOGS, // Sending unsent logs from previous session. |
| 149 SENDING_OLD_LOGS, // Sending unsent logs from previous session. | 151 SENDING_OLD_LOGS, // Sending unsent logs from previous session. |
| 150 SENDING_CURRENT_LOGS, // Sending standard current logs as they acrue. | 152 SENDING_CURRENT_LOGS, // Sending standard current logs as they acrue. |
| 151 }; | 153 }; |
| 152 | 154 |
| 153 // Maintain a map of histogram names to the sample stats we've sent. | |
| 154 typedef std::map<std::string, Histogram::SampleSet> LoggedSampleMap; | |
| 155 | |
| 156 class InitTask; | 155 class InitTask; |
| 157 class InitTaskComplete; | 156 class InitTaskComplete; |
| 158 | 157 |
| 159 // Callback to let us know that the init task is done. | 158 // Callback to let us know that the init task is done. |
| 160 void OnInitTaskComplete( | 159 void OnInitTaskComplete( |
| 161 const std::string& hardware_class, | 160 const std::string& hardware_class, |
| 162 const std::vector<WebPluginInfo>& plugins); | 161 const std::vector<WebPluginInfo>& plugins); |
| 163 | 162 |
| 164 // When we start a new version of Chromium (different from our last run), we | 163 // When we start a new version of Chromium (different from our last run), we |
| 165 // need to discard the old crash stats so that we don't attribute crashes etc. | 164 // need to discard the old crash stats so that we don't attribute crashes etc. |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 211 // make a change, call ScheduleNextStateSave() instead. | 210 // make a change, call ScheduleNextStateSave() instead. |
| 212 void SaveLocalState(); | 211 void SaveLocalState(); |
| 213 | 212 |
| 214 // Called to start recording user experience metrics. | 213 // Called to start recording user experience metrics. |
| 215 // Constructs a new, empty current_log_. | 214 // Constructs a new, empty current_log_. |
| 216 void StartRecording(); | 215 void StartRecording(); |
| 217 | 216 |
| 218 // Called to stop recording user experience metrics. The caller takes | 217 // Called to stop recording user experience metrics. The caller takes |
| 219 // ownership of the resulting MetricsLog object via the log parameter, | 218 // ownership of the resulting MetricsLog object via the log parameter, |
| 220 // or passes in NULL to indicate that the log should simply be deleted. | 219 // or passes in NULL to indicate that the log should simply be deleted. |
| 221 void StopRecording(MetricsLog** log); | 220 void StopRecording(MetricsLogBase** log); |
| 222 | 221 |
| 223 // Deletes pending_log_ and current_log_, and pushes their text into the | 222 // Deletes pending_log_ and current_log_, and pushes their text into the |
| 224 // appropriate unsent_log vectors. Called when Chrome shuts down. | 223 // appropriate unsent_log vectors. Called when Chrome shuts down. |
| 225 void PushPendingLogsToUnsentLists(); | 224 void PushPendingLogsToUnsentLists(); |
| 226 | 225 |
| 227 // Save the pending_log_text_ persistently in a pref for transmission when we | 226 // Save the pending_log_text_ persistently in a pref for transmission when we |
| 228 // next run. Note that IF this text is "too large," we just dicard it. | 227 // next run. Note that IF this text is "too large," we just dicard it. |
| 229 void PushPendingLogTextToUnsentOngoingLogs(); | 228 void PushPendingLogTextToUnsentOngoingLogs(); |
| 230 | 229 |
| 231 // Start timer for next log transmission. | 230 // Start timer for next log transmission. |
| (...skipping 11 matching lines...) Expand all Loading... |
| 243 // Takes whatever log should be uploaded next (according to the state_) | 242 // Takes whatever log should be uploaded next (according to the state_) |
| 244 // and makes it the pending log. If pending_log_ is not NULL, | 243 // and makes it the pending log. If pending_log_ is not NULL, |
| 245 // MakePendingLog does nothing and returns. | 244 // MakePendingLog does nothing and returns. |
| 246 void MakePendingLog(); | 245 void MakePendingLog(); |
| 247 | 246 |
| 248 // Determines from state_ and permissions set out by the server and by | 247 // Determines from state_ and permissions set out by the server and by |
| 249 // the user whether the pending_log_ should be sent or discarded. Called by | 248 // the user whether the pending_log_ should be sent or discarded. Called by |
| 250 // TryToStartTransmission. | 249 // TryToStartTransmission. |
| 251 bool TransmissionPermitted() const; | 250 bool TransmissionPermitted() const; |
| 252 | 251 |
| 253 // Check to see if there is a log that needs to be, or is being, transmitted. | |
| 254 bool pending_log() const { | |
| 255 return pending_log_ || !pending_log_text_.empty(); | |
| 256 } | |
| 257 // Check to see if there are any unsent logs from previous sessions. | 252 // Check to see if there are any unsent logs from previous sessions. |
| 258 bool unsent_logs() const { | 253 bool unsent_logs() const { |
| 259 return !unsent_initial_logs_.empty() || !unsent_ongoing_logs_.empty(); | 254 return !unsent_initial_logs_.empty() || !unsent_ongoing_logs_.empty(); |
| 260 } | 255 } |
| 261 // Record stats, client ID, Session ID, etc. in a special "first" log. | 256 // Record stats, client ID, Session ID, etc. in a special "first" log. |
| 262 void PrepareInitialLog(); | 257 void PrepareInitialLog(); |
| 263 // Pull copies of unsent logs from prefs into instance variables. | 258 // Pull copies of unsent logs from prefs into instance variables. |
| 264 void RecallUnsentLogs(); | 259 void RecallUnsentLogs(); |
| 265 // Convert pending_log_ to XML in pending_log_text_ for transmission. | 260 // Convert pending_log_ to XML in pending_log_text_ for transmission. |
| 266 void PreparePendingLogText(); | 261 void PreparePendingLogText(); |
| 267 | 262 |
| 268 // Convert pending_log_ to XML, compress it, and prepare to pass to server. | 263 // Convert pending_log_ to XML, compress it, and prepare to pass to server. |
| 269 // Upon return, current_fetch_ should be reset with its upload data set to | 264 // Upon return, current_fetch_ should be reset with its upload data set to |
| 270 // a compressed copy of the pending log. | 265 // a compressed copy of the pending log. |
| 271 void PrepareFetchWithPendingLog(); | 266 void PrepareFetchWithPendingLog(); |
| 272 | 267 |
| 273 // Discard pending_log_, and clear pending_log_text_. Called after processing | |
| 274 // of this log is complete. | |
| 275 void DiscardPendingLog(); | |
| 276 // Compress the report log in input using bzip2, store the result in output. | |
| 277 bool Bzip2Compress(const std::string& input, std::string* output); | |
| 278 // Implementation of URLFetcher::Delegate. Called after transmission | 268 // Implementation of URLFetcher::Delegate. Called after transmission |
| 279 // completes (either successfully or with failure). | 269 // completes (either successfully or with failure). |
| 280 virtual void OnURLFetchComplete(const URLFetcher* source, | 270 virtual void OnURLFetchComplete(const URLFetcher* source, |
| 281 const GURL& url, | 271 const GURL& url, |
| 282 const URLRequestStatus& status, | 272 const URLRequestStatus& status, |
| 283 int response_code, | 273 int response_code, |
| 284 const ResponseCookies& cookies, | 274 const ResponseCookies& cookies, |
| 285 const std::string& data); | 275 const std::string& data); |
| 286 | 276 |
| 287 // Called by OnURLFetchComplete to handle the case when the server returned | 277 // Called by OnURLFetchComplete to handle the case when the server returned |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 380 void RecordPluginChanges(PrefService* pref); | 370 void RecordPluginChanges(PrefService* pref); |
| 381 | 371 |
| 382 // Records state that should be periodically saved, like uptime and | 372 // Records state that should be periodically saved, like uptime and |
| 383 // buffered plugin stability statistics. | 373 // buffered plugin stability statistics. |
| 384 void RecordCurrentState(PrefService* pref); | 374 void RecordCurrentState(PrefService* pref); |
| 385 | 375 |
| 386 // Requests all renderers to send their histograms back for | 376 // Requests all renderers to send their histograms back for |
| 387 // collecting stats from renderers. | 377 // collecting stats from renderers. |
| 388 void CollectRendererHistograms(); | 378 void CollectRendererHistograms(); |
| 389 | 379 |
| 390 // Record complete list of histograms into the current log. | |
| 391 // Called when we close a log. | |
| 392 void RecordCurrentHistograms(); | |
| 393 | |
| 394 // Record a specific histogram . | |
| 395 void RecordHistogram(const Histogram& histogram); | |
| 396 | |
| 397 // Logs the initiation of a page load | 380 // Logs the initiation of a page load |
| 398 void LogLoadStarted(); | 381 void LogLoadStarted(); |
| 399 | 382 |
| 400 // Records a page load notification. | 383 // Records a page load notification. |
| 401 void LogLoadComplete(NotificationType type, | 384 void LogLoadComplete(NotificationType type, |
| 402 const NotificationSource& source, | 385 const NotificationSource& source, |
| 403 const NotificationDetails& details); | 386 const NotificationDetails& details); |
| 404 | 387 |
| 405 // Checks whether a notification can be logged. | 388 // Checks whether a notification can be logged. |
| 406 bool CanLogNotification(NotificationType type, | 389 bool CanLogNotification(NotificationType type, |
| (...skipping 27 matching lines...) Expand all Loading... |
| 434 | 417 |
| 435 // Chrome OS hardware class (e.g., hardware qualification ID). This | 418 // Chrome OS hardware class (e.g., hardware qualification ID). This |
| 436 // class identifies the configured system components such as CPU, | 419 // class identifies the configured system components such as CPU, |
| 437 // WiFi adapter, etc. For non Chrome OS hosts, this will be an | 420 // WiFi adapter, etc. For non Chrome OS hosts, this will be an |
| 438 // empty string. | 421 // empty string. |
| 439 std::string hardware_class_; | 422 std::string hardware_class_; |
| 440 | 423 |
| 441 // The list of plugins which was retrieved on the file thread. | 424 // The list of plugins which was retrieved on the file thread. |
| 442 std::vector<WebPluginInfo> plugins_; | 425 std::vector<WebPluginInfo> plugins_; |
| 443 | 426 |
| 444 // A log that we are currently transmiting, or about to try to transmit. | |
| 445 MetricsLog* pending_log_; | |
| 446 | |
| 447 // An alternate form of pending_log_. We persistently save this text version | |
| 448 // into prefs if we can't transmit it. As a result, sometimes all we have is | |
| 449 // the text version (recalled from a previous session). | |
| 450 std::string pending_log_text_; | |
| 451 | |
| 452 // The outstanding transmission appears as a URL Fetch operation. | 427 // The outstanding transmission appears as a URL Fetch operation. |
| 453 scoped_ptr<URLFetcher> current_fetch_; | 428 scoped_ptr<URLFetcher> current_fetch_; |
| 454 | 429 |
| 455 // The log that we are still appending to. | |
| 456 MetricsLog* current_log_; | |
| 457 | |
| 458 // The URL for the metrics server. | 430 // The URL for the metrics server. |
| 459 std::wstring server_url_; | 431 std::wstring server_url_; |
| 460 | 432 |
| 461 // The identifier that's sent to the server with the log reports. | 433 // The identifier that's sent to the server with the log reports. |
| 462 std::string client_id_; | 434 std::string client_id_; |
| 463 | 435 |
| 464 // Whether the MetricsService object has received any notifications since | 436 // Whether the MetricsService object has received any notifications since |
| 465 // the last time a transmission was sent. | 437 // the last time a transmission was sent. |
| 466 bool idle_since_last_transmission_; | 438 bool idle_since_last_transmission_; |
| 467 | 439 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 489 // ChildProcessStats documentation above for more details. | 461 // ChildProcessStats documentation above for more details. |
| 490 std::map<std::wstring, ChildProcessStats> child_process_stats_buffer_; | 462 std::map<std::wstring, ChildProcessStats> child_process_stats_buffer_; |
| 491 | 463 |
| 492 ScopedRunnableMethodFactory<MetricsService> log_sender_factory_; | 464 ScopedRunnableMethodFactory<MetricsService> log_sender_factory_; |
| 493 ScopedRunnableMethodFactory<MetricsService> state_saver_factory_; | 465 ScopedRunnableMethodFactory<MetricsService> state_saver_factory_; |
| 494 | 466 |
| 495 // Dictionary containing all the profile specific metrics. This is set | 467 // Dictionary containing all the profile specific metrics. This is set |
| 496 // at creation time from the prefs. | 468 // at creation time from the prefs. |
| 497 scoped_ptr<DictionaryValue> profile_dictionary_; | 469 scoped_ptr<DictionaryValue> profile_dictionary_; |
| 498 | 470 |
| 499 // For histograms, record what we've already logged (as a sample for each | |
| 500 // histogram) so that we can send only the delta with the next log. | |
| 501 MetricsService::LoggedSampleMap logged_samples_; | |
| 502 | |
| 503 // The interval between consecutive log transmissions (to avoid hogging the | 471 // The interval between consecutive log transmissions (to avoid hogging the |
| 504 // outbound network link). This is usually also the duration for which we | 472 // outbound network link). This is usually also the duration for which we |
| 505 // build up a log, but if other unsent-logs from previous sessions exist, we | 473 // build up a log, but if other unsent-logs from previous sessions exist, we |
| 506 // quickly transmit those unsent logs while we continue to build a log. | 474 // quickly transmit those unsent logs while we continue to build a log. |
| 507 base::TimeDelta interlog_duration_; | 475 base::TimeDelta interlog_duration_; |
| 508 | 476 |
| 509 // The maximum number of events which get transmitted in a log. This defaults | 477 // The maximum number of events which get transmitted in a log. This defaults |
| 510 // to a constant and otherwise is provided by the UMA server in the server | 478 // to a constant and otherwise is provided by the UMA server in the server |
| 511 // response data. | 479 // response data. |
| 512 int log_event_limit_; | 480 int log_event_limit_; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 527 #endif | 495 #endif |
| 528 | 496 |
| 529 FRIEND_TEST_ALL_PREFIXES(MetricsServiceTest, ClientIdGeneratesAllZeroes); | 497 FRIEND_TEST_ALL_PREFIXES(MetricsServiceTest, ClientIdGeneratesAllZeroes); |
| 530 FRIEND_TEST_ALL_PREFIXES(MetricsServiceTest, ClientIdGeneratesCorrectly); | 498 FRIEND_TEST_ALL_PREFIXES(MetricsServiceTest, ClientIdGeneratesCorrectly); |
| 531 FRIEND_TEST_ALL_PREFIXES(MetricsServiceTest, ClientIdCorrectlyFormatted); | 499 FRIEND_TEST_ALL_PREFIXES(MetricsServiceTest, ClientIdCorrectlyFormatted); |
| 532 | 500 |
| 533 DISALLOW_COPY_AND_ASSIGN(MetricsService); | 501 DISALLOW_COPY_AND_ASSIGN(MetricsService); |
| 534 }; | 502 }; |
| 535 | 503 |
| 536 #endif // CHROME_BROWSER_METRICS_METRICS_SERVICE_H_ | 504 #endif // CHROME_BROWSER_METRICS_METRICS_SERVICE_H_ |
| OLD | NEW |