OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 |
(...skipping 21 matching lines...) Expand all Loading... |
32 #include "components/metrics/metrics_service_observer.h" | 32 #include "components/metrics/metrics_service_observer.h" |
33 #include "components/variations/active_field_trials.h" | 33 #include "components/variations/active_field_trials.h" |
34 #include "content/public/browser/browser_child_process_observer.h" | 34 #include "content/public/browser/browser_child_process_observer.h" |
35 #include "content/public/browser/user_metrics.h" | 35 #include "content/public/browser/user_metrics.h" |
36 #include "net/url_request/url_fetcher_delegate.h" | 36 #include "net/url_request/url_fetcher_delegate.h" |
37 | 37 |
38 class GoogleUpdateMetricsProviderWin; | 38 class GoogleUpdateMetricsProviderWin; |
39 class MetricsReportingScheduler; | 39 class MetricsReportingScheduler; |
40 class PrefService; | 40 class PrefService; |
41 class PrefRegistrySimple; | 41 class PrefRegistrySimple; |
| 42 class PluginMetricsProvider; |
42 | 43 |
43 namespace base { | 44 namespace base { |
44 class DictionaryValue; | 45 class DictionaryValue; |
45 class HistogramSamples; | 46 class HistogramSamples; |
46 class MessageLoopProxy; | 47 class MessageLoopProxy; |
47 } | 48 } |
48 | 49 |
49 namespace variations { | 50 namespace variations { |
50 struct ActiveGroupId; | 51 struct ActiveGroupId; |
51 } | 52 } |
52 | 53 |
53 namespace content { | 54 namespace content { |
54 struct WebPluginInfo; | |
55 } | 55 } |
56 | 56 |
57 namespace metrics { | 57 namespace metrics { |
58 class MetricsServiceClient; | 58 class MetricsServiceClient; |
59 class MetricsStateManager; | 59 class MetricsStateManager; |
60 } | 60 } |
61 | 61 |
62 namespace net { | 62 namespace net { |
63 class URLFetcher; | 63 class URLFetcher; |
64 } | 64 } |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
164 // HistogramFlattener: | 164 // HistogramFlattener: |
165 virtual void RecordDelta(const base::HistogramBase& histogram, | 165 virtual void RecordDelta(const base::HistogramBase& histogram, |
166 const base::HistogramSamples& snapshot) OVERRIDE; | 166 const base::HistogramSamples& snapshot) OVERRIDE; |
167 virtual void InconsistencyDetected( | 167 virtual void InconsistencyDetected( |
168 base::HistogramBase::Inconsistency problem) OVERRIDE; | 168 base::HistogramBase::Inconsistency problem) OVERRIDE; |
169 virtual void UniqueInconsistencyDetected( | 169 virtual void UniqueInconsistencyDetected( |
170 base::HistogramBase::Inconsistency problem) OVERRIDE; | 170 base::HistogramBase::Inconsistency problem) OVERRIDE; |
171 virtual void InconsistencyDetectedInLoggedCount(int amount) OVERRIDE; | 171 virtual void InconsistencyDetectedInLoggedCount(int amount) OVERRIDE; |
172 | 172 |
173 // Implementation of content::BrowserChildProcessObserver | 173 // Implementation of content::BrowserChildProcessObserver |
174 virtual void BrowserChildProcessHostConnected( | |
175 const content::ChildProcessData& data) OVERRIDE; | |
176 virtual void BrowserChildProcessCrashed( | 174 virtual void BrowserChildProcessCrashed( |
177 const content::ChildProcessData& data) OVERRIDE; | 175 const content::ChildProcessData& data) OVERRIDE; |
178 virtual void BrowserChildProcessInstanceCreated( | |
179 const content::ChildProcessData& data) OVERRIDE; | |
180 | 176 |
181 // This should be called when the application is not idle, i.e. the user seems | 177 // This should be called when the application is not idle, i.e. the user seems |
182 // to be interacting with the application. | 178 // to be interacting with the application. |
183 void OnApplicationNotIdle(); | 179 void OnApplicationNotIdle(); |
184 | 180 |
185 // Invoked when we get a WM_SESSIONEND. This places a value in prefs that is | 181 // Invoked when we get a WM_SESSIONEND. This places a value in prefs that is |
186 // reset when RecordCompletedSessionEnd is invoked. | 182 // reset when RecordCompletedSessionEnd is invoked. |
187 void RecordStartOfSessionEnd(); | 183 void RecordStartOfSessionEnd(); |
188 | 184 |
189 // This should be called when the application is shutting down. It records | 185 // This should be called when the application is shutting down. It records |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 SENDING_INITIAL_METRICS_LOG, // Initial metrics log being sent. | 263 SENDING_INITIAL_METRICS_LOG, // Initial metrics log being sent. |
268 SENDING_OLD_LOGS, // Sending unsent logs from last session. | 264 SENDING_OLD_LOGS, // Sending unsent logs from last session. |
269 SENDING_CURRENT_LOGS, // Sending ongoing logs as they accrue. | 265 SENDING_CURRENT_LOGS, // Sending ongoing logs as they accrue. |
270 }; | 266 }; |
271 | 267 |
272 enum ShutdownCleanliness { | 268 enum ShutdownCleanliness { |
273 CLEANLY_SHUTDOWN = 0xdeadbeef, | 269 CLEANLY_SHUTDOWN = 0xdeadbeef, |
274 NEED_TO_SHUTDOWN = ~CLEANLY_SHUTDOWN | 270 NEED_TO_SHUTDOWN = ~CLEANLY_SHUTDOWN |
275 }; | 271 }; |
276 | 272 |
277 struct ChildProcessStats; | |
278 | |
279 typedef std::vector<SyntheticTrialGroup> SyntheticTrialGroups; | 273 typedef std::vector<SyntheticTrialGroup> SyntheticTrialGroups; |
280 | 274 |
281 // First part of the init task. Called on the FILE thread to load hardware | 275 // First part of the init task. Called on the FILE thread to load hardware |
282 // class information. | 276 // class information. |
283 static void InitTaskGetHardwareClass(base::WeakPtr<MetricsService> self, | 277 static void InitTaskGetHardwareClass(base::WeakPtr<MetricsService> self, |
284 base::MessageLoopProxy* target_loop); | 278 base::MessageLoopProxy* target_loop); |
285 | 279 |
286 // Callback from InitTaskGetHardwareClass() that continues the init task by | 280 // Callback from InitTaskGetHardwareClass() that continues the init task by |
287 // loading plugin information. | 281 // loading plugin information. |
288 void OnInitTaskGotHardwareClass(const std::string& hardware_class); | 282 void OnInitTaskGotHardwareClass(const std::string& hardware_class); |
289 | 283 |
290 // Callback from PluginService::GetPlugins() that continues the init task by | 284 // Called after the Plugin init task has been completed that continues the |
291 // launching a task to gather Google Update statistics. | 285 // init task by launching a task to gather Google Update statistics. |
292 void OnInitTaskGotPluginInfo( | 286 void OnInitTaskGotPluginInfo(); |
293 const std::vector<content::WebPluginInfo>& plugins); | |
294 | 287 |
295 // Called after GoogleUpdate init task has been completed that continues the | 288 // Called after GoogleUpdate init task has been completed that continues the |
296 // init task by loading profiler data. | 289 // init task by loading profiler data. |
297 void OnInitTaskGotGoogleUpdateData(); | 290 void OnInitTaskGotGoogleUpdateData(); |
298 | 291 |
299 void OnUserAction(const std::string& action); | 292 void OnUserAction(const std::string& action); |
300 | 293 |
301 // TrackingSynchronizerObserver: | 294 // TrackingSynchronizerObserver: |
302 virtual void ReceivedProfilerData( | 295 virtual void ReceivedProfilerData( |
303 const tracked_objects::ProcessDataSnapshot& process_data, | 296 const tracked_objects::ProcessDataSnapshot& process_data, |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
393 // Reads, increments and then sets the specified integer preference. | 386 // Reads, increments and then sets the specified integer preference. |
394 void IncrementPrefValue(const char* path); | 387 void IncrementPrefValue(const char* path); |
395 | 388 |
396 // Reads, increments and then sets the specified long preference that is | 389 // Reads, increments and then sets the specified long preference that is |
397 // stored as a string. | 390 // stored as a string. |
398 void IncrementLongPrefsValue(const char* path); | 391 void IncrementLongPrefsValue(const char* path); |
399 | 392 |
400 // Records that the browser was shut down cleanly. | 393 // Records that the browser was shut down cleanly. |
401 void LogCleanShutdown(); | 394 void LogCleanShutdown(); |
402 | 395 |
403 // Returns reference to ChildProcessStats corresponding to |data|. | |
404 ChildProcessStats& GetChildProcessStats( | |
405 const content::ChildProcessData& data); | |
406 | |
407 // Saves plugin-related updates from the in-object buffer to Local State | |
408 // for retrieval next time we send a Profile log (generally next launch). | |
409 void RecordPluginChanges(PrefService* pref); | |
410 | |
411 // Records state that should be periodically saved, like uptime and | 396 // Records state that should be periodically saved, like uptime and |
412 // buffered plugin stability statistics. | 397 // buffered plugin stability statistics. |
413 void RecordCurrentState(PrefService* pref); | 398 void RecordCurrentState(PrefService* pref); |
414 | 399 |
415 // Checks whether events should currently be logged. | 400 // Checks whether events should currently be logged. |
416 bool ShouldLogEvents(); | 401 bool ShouldLogEvents(); |
417 | 402 |
418 // Sets the value of the specified path in prefs and schedules a save. | 403 // Sets the value of the specified path in prefs and schedules a save. |
419 void RecordBooleanPrefValue(const char* path, bool value); | 404 void RecordBooleanPrefValue(const char* path, bool value); |
420 | 405 |
421 // Returns true if process of type |type| should be counted as a plugin | |
422 // process, and false otherwise. | |
423 static bool IsPluginProcess(int process_type); | |
424 | |
425 // Returns a list of synthetic field trials that were active for the entire | 406 // Returns a list of synthetic field trials that were active for the entire |
426 // duration of the current log. | 407 // duration of the current log. |
427 void GetCurrentSyntheticFieldTrials( | 408 void GetCurrentSyntheticFieldTrials( |
428 std::vector<variations::ActiveGroupId>* synthetic_trials); | 409 std::vector<variations::ActiveGroupId>* synthetic_trials); |
429 | 410 |
430 // Creates a new MetricsLog instance with the given |log_type|. | 411 // Creates a new MetricsLog instance with the given |log_type|. |
431 scoped_ptr<MetricsLog> CreateLog(MetricsLog::LogType log_type); | 412 scoped_ptr<MetricsLog> CreateLog(MetricsLog::LogType log_type); |
432 | 413 |
433 // Record complete list of histograms into the current log. | 414 // Record complete list of histograms into the current log. |
434 // Called when we close a log. | 415 // Called when we close a log. |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
473 | 454 |
474 // Whether the initial stability log has been recorded during startup. | 455 // Whether the initial stability log has been recorded during startup. |
475 bool has_initial_stability_log_; | 456 bool has_initial_stability_log_; |
476 | 457 |
477 // Chrome OS hardware class (e.g., hardware qualification ID). This | 458 // Chrome OS hardware class (e.g., hardware qualification ID). This |
478 // class identifies the configured system components such as CPU, | 459 // class identifies the configured system components such as CPU, |
479 // WiFi adapter, etc. For non Chrome OS hosts, this will be an | 460 // WiFi adapter, etc. For non Chrome OS hosts, this will be an |
480 // empty string. | 461 // empty string. |
481 std::string hardware_class_; | 462 std::string hardware_class_; |
482 | 463 |
483 // The list of plugins which was retrieved on the file thread. | 464 #if defined(ENABLE_PLUGINS) |
484 std::vector<content::WebPluginInfo> plugins_; | 465 PluginMetricsProvider* plugin_metrics_provider_; |
| 466 #endif |
485 | 467 |
486 #if defined(OS_WIN) | 468 #if defined(OS_WIN) |
487 GoogleUpdateMetricsProviderWin* google_update_metrics_provider_; | 469 GoogleUpdateMetricsProviderWin* google_update_metrics_provider_; |
488 #endif | 470 #endif |
489 | 471 |
490 // The initial metrics log, used to record startup metrics (histograms and | 472 // The initial metrics log, used to record startup metrics (histograms and |
491 // profiler data). Note that if a crash occurred in the previous session, an | 473 // profiler data). Note that if a crash occurred in the previous session, an |
492 // initial stability log may be sent before this. | 474 // initial stability log may be sent before this. |
493 scoped_ptr<MetricsLog> initial_metrics_log_; | 475 scoped_ptr<MetricsLog> initial_metrics_log_; |
494 | 476 |
495 // The outstanding transmission appears as a URL Fetch operation. | 477 // The outstanding transmission appears as a URL Fetch operation. |
496 scoped_ptr<net::URLFetcher> current_fetch_; | 478 scoped_ptr<net::URLFetcher> current_fetch_; |
497 | 479 |
498 // Whether the MetricsService object has received any notifications since | 480 // Whether the MetricsService object has received any notifications since |
499 // the last time a transmission was sent. | 481 // the last time a transmission was sent. |
500 bool idle_since_last_transmission_; | 482 bool idle_since_last_transmission_; |
501 | 483 |
502 // A number that identifies the how many times the app has been launched. | 484 // A number that identifies the how many times the app has been launched. |
503 int session_id_; | 485 int session_id_; |
504 | 486 |
505 // Maps WebContentses (corresponding to tabs) or Browsers (corresponding to | 487 // Maps WebContentses (corresponding to tabs) or Browsers (corresponding to |
506 // Windows) to a unique integer that we will use to identify them. | 488 // Windows) to a unique integer that we will use to identify them. |
507 // |next_window_id_| is used to track which IDs we have used so far. | 489 // |next_window_id_| is used to track which IDs we have used so far. |
508 typedef std::map<uintptr_t, int> WindowMap; | 490 typedef std::map<uintptr_t, int> WindowMap; |
509 WindowMap window_map_; | 491 WindowMap window_map_; |
510 int next_window_id_; | 492 int next_window_id_; |
511 | 493 |
512 // Buffer of child process notifications for quick access. | |
513 std::map<base::string16, ChildProcessStats> child_process_stats_buffer_; | |
514 | |
515 // Weak pointers factory used to post task on different threads. All weak | 494 // Weak pointers factory used to post task on different threads. All weak |
516 // pointers managed by this factory have the same lifetime as MetricsService. | 495 // pointers managed by this factory have the same lifetime as MetricsService. |
517 base::WeakPtrFactory<MetricsService> self_ptr_factory_; | 496 base::WeakPtrFactory<MetricsService> self_ptr_factory_; |
518 | 497 |
519 // Weak pointers factory used for saving state. All weak pointers managed by | 498 // Weak pointers factory used for saving state. All weak pointers managed by |
520 // this factory are invalidated in ScheduleNextStateSave. | 499 // this factory are invalidated in ScheduleNextStateSave. |
521 base::WeakPtrFactory<MetricsService> state_saver_factory_; | 500 base::WeakPtrFactory<MetricsService> state_saver_factory_; |
522 | 501 |
523 // The scheduler for determining when uploads should happen. | 502 // The scheduler for determining when uploads should happen. |
524 scoped_ptr<MetricsReportingScheduler> scheduler_; | 503 scoped_ptr<MetricsReportingScheduler> scheduler_; |
(...skipping 28 matching lines...) Expand all Loading... |
553 FRIEND_TEST_ALL_PREFIXES(MetricsServiceTest, IsPluginProcess); | 532 FRIEND_TEST_ALL_PREFIXES(MetricsServiceTest, IsPluginProcess); |
554 FRIEND_TEST_ALL_PREFIXES(MetricsServiceTest, MetricsServiceObserver); | 533 FRIEND_TEST_ALL_PREFIXES(MetricsServiceTest, MetricsServiceObserver); |
555 FRIEND_TEST_ALL_PREFIXES(MetricsServiceTest, | 534 FRIEND_TEST_ALL_PREFIXES(MetricsServiceTest, |
556 PermutedEntropyCacheClearedWhenLowEntropyReset); | 535 PermutedEntropyCacheClearedWhenLowEntropyReset); |
557 FRIEND_TEST_ALL_PREFIXES(MetricsServiceTest, RegisterSyntheticTrial); | 536 FRIEND_TEST_ALL_PREFIXES(MetricsServiceTest, RegisterSyntheticTrial); |
558 | 537 |
559 DISALLOW_COPY_AND_ASSIGN(MetricsService); | 538 DISALLOW_COPY_AND_ASSIGN(MetricsService); |
560 }; | 539 }; |
561 | 540 |
562 #endif // CHROME_BROWSER_METRICS_METRICS_SERVICE_H_ | 541 #endif // CHROME_BROWSER_METRICS_METRICS_SERVICE_H_ |
OLD | NEW |