external_metrics.h revision 72a454cd3513ac24fbdd0e0cb9ad70b86a99b801
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
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_CHROMEOS_EXTERNAL_METRICS_H_
6#define CHROME_BROWSER_CHROMEOS_EXTERNAL_METRICS_H_
7#pragma once
8
9#include "base/basictypes.h"
10#include "base/compiler_specific.h"
11#include "base/file_path.h"
12#include "base/gtest_prod_util.h"
13#include "base/hash_tables.h"
14#include "base/task.h"
15
16namespace chromeos {
17
18// ExternalMetrics is a service that Chrome offers to Chrome OS to upload
19// metrics to the UMA server on its behalf.  Chrome periodically reads the
20// content of a well-know file, and parses it into name-value pairs, each
21// representing a Chrome OS metrics event. The events are logged using the
22// normal UMA mechanism. The file is then truncated to zero size. Chrome uses
23// flock() to synchronize accesses to the file.
24class ExternalMetrics : public base::RefCountedThreadSafe<ExternalMetrics> {
25  FRIEND_TEST_ALL_PREFIXES(ExternalMetricsTest, ParseExternalMetricsFile);
26  friend class base::RefCountedThreadSafe<ExternalMetrics>;
27
28 public:
29  ExternalMetrics();
30
31  // Begins the external data collection.  This service is started and stopped
32  // by the chrome metrics service.  Calls to RecordAction originate in the
33  // File thread but are executed in the UI thread.
34  void Start();
35
36 private:
37  // There is one function with this type for each action.
38  typedef void (*RecordFunctionType)();
39
40  typedef void (*RecorderType)(const char*, const char*);  // For testing only.
41
42  // The max length of a message (name-value pair, plus header)
43  static const int kMetricsMessageMaxLength = 1024;  // be generous
44
45  ~ExternalMetrics() {}
46
47  // Passes an action event to the UMA service on the UI thread.
48  void RecordActionUI(std::string action_string);
49
50  // Passes an action event to the UMA service.
51  void RecordAction(const char* action_name);
52
53  // Records an external crash of the given string description to
54  // UMA service on the UI thread.
55  void RecordCrashUI(const std::string& crash_kind);
56
57  // Records an external crash of the given string description.
58  void RecordCrash(const std::string& crash_kind);
59
60  // Passes an histogram event to the UMA service.  |histogram_data| is in the
61  // form <histogram-name> <sample> <min> <max> <buckets_count>.
62  void RecordHistogram(const char* histogram_data);
63
64  // Passes a linear histogram event to the UMA service.  |histogram_data| is
65  // in the form <histogram-name> <sample> <max>.
66  void RecordLinearHistogram(const char* histogram_data);
67
68  // Collects external events from metrics log file.  This is run at periodic
69  // intervals.
70  void CollectEvents();
71
72  // Calls CollectEvents and reschedules a future collection.
73  void CollectEventsAndReschedule();
74
75  // Schedules a metrics event collection in the future.
76  void ScheduleCollector();
77
78  // Maps histogram or action names to recorder structs.
79  base::hash_map<std::string, RecordFunctionType> action_recorders_;
80
81  // Set containing known user actions.
82  base::hash_set<std::string> valid_user_actions_;
83
84  // Used for testing only.
85  RecorderType test_recorder_;
86  FilePath test_path_;
87  DISALLOW_COPY_AND_ASSIGN(ExternalMetrics);
88};
89
90}  // namespace chromeos
91
92#endif  // CHROME_BROWSER_CHROMEOS_EXTERNAL_METRICS_H_
93