blob: 028525a3d8c8e50a74022239dad71da2d24817f0 [file] [log] [blame]
Darin Petkov65b01462010-04-14 13:32:20 -07001// Copyright (c) 2010 The Chromium OS 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 METRICS_DAEMON_H_
6#define METRICS_DAEMON_H_
7
Darin Petkov703ec972010-04-27 11:02:18 -07008#include <dbus/dbus.h>
Darin Petkov41e06232010-05-03 16:45:37 -07009#include <glib.h>
Darin Petkov65b01462010-04-14 13:32:20 -070010#include <time.h>
11
Darin Petkov2ccef012010-05-05 16:06:37 -070012#include <gtest/gtest_prod.h> // for FRIEND_TEST
13
Darin Petkov65b01462010-04-14 13:32:20 -070014class MetricsDaemon {
15
16 public:
17 MetricsDaemon()
Darin Petkov2ccef012010-05-05 16:06:37 -070018 : daily_use_record_file_(NULL),
19 network_state_(kUnknownNetworkState),
Darin Petkov41e06232010-05-03 16:45:37 -070020 network_state_last_(0),
21 power_state_(kUnknownPowerState),
22 screensaver_state_(kUnknownScreenSaverState),
23 session_state_(kUnknownSessionState),
24 user_active_(false),
25 user_active_last_(0),
26 daily_use_day_last_(0),
27 usemon_interval_(0),
28 usemon_source_(NULL) {}
Darin Petkov65b01462010-04-14 13:32:20 -070029 ~MetricsDaemon() {}
30
Darin Petkov703ec972010-04-27 11:02:18 -070031 // Does all the work. If |run_as_daemon| is true, daemonizes by
Darin Petkov2ccef012010-05-05 16:06:37 -070032 // forking.
33 void Run(bool run_as_daemon);
Darin Petkov65b01462010-04-14 13:32:20 -070034
35 private:
Darin Petkov2ccef012010-05-05 16:06:37 -070036 friend class MetricsDaemonTest;
37 FRIEND_TEST(MetricsDaemonTest, LogDailyUseRecord);
38 FRIEND_TEST(MetricsDaemonTest, LookupNetworkState);
39 FRIEND_TEST(MetricsDaemonTest, LookupPowerState);
40 FRIEND_TEST(MetricsDaemonTest, LookupScreenSaverState);
41 FRIEND_TEST(MetricsDaemonTest, LookupSessionState);
42 FRIEND_TEST(MetricsDaemonTest, NetStateChanged);
43 FRIEND_TEST(MetricsDaemonTest, PowerStateChanged);
44 FRIEND_TEST(MetricsDaemonTest, PublishMetric);
45 FRIEND_TEST(MetricsDaemonTest, ScreenSaverStateChanged);
46 FRIEND_TEST(MetricsDaemonTest, SessionStateChanged);
47 FRIEND_TEST(MetricsDaemonTest, SetUserActiveState);
48
Darin Petkov703ec972010-04-27 11:02:18 -070049 // The network states (see network_states.h).
50 enum NetworkState {
51 kUnknownNetworkState = -1, // Initial/unknown network state.
Darin Petkov65b01462010-04-14 13:32:20 -070052#define STATE(name, capname) kNetworkState ## capname,
53#include "network_states.h"
54 kNumberNetworkStates
Darin Petkov703ec972010-04-27 11:02:18 -070055 };
Darin Petkov65b01462010-04-14 13:32:20 -070056
Darin Petkov703ec972010-04-27 11:02:18 -070057 // The power states (see power_states.h).
58 enum PowerState {
59 kUnknownPowerState = -1, // Initial/unknown power state.
60#define STATE(name, capname) kPowerState ## capname,
61#include "power_states.h"
62 kNumberPowerStates
63 };
Darin Petkov65b01462010-04-14 13:32:20 -070064
Darin Petkov41e06232010-05-03 16:45:37 -070065 // The screen-saver states (see screensaver_states.h).
66 enum ScreenSaverState {
67 kUnknownScreenSaverState = -1, // Initial/unknown screen-saver state.
68#define STATE(name, capname) kScreenSaverState ## capname,
69#include "screensaver_states.h"
70 kNumberScreenSaverStates
71 };
72
73 // The user session states (see session_states.h).
74 enum SessionState {
75 kUnknownSessionState = -1, // Initial/unknown user session state.
76#define STATE(name, capname) kSessionState ## capname,
77#include "session_states.h"
78 kNumberSessionStates
79 };
80
81 // Data record for aggregating daily usage.
82 class UseRecord {
83 public:
84 UseRecord() : day_(0), seconds_(0) {}
85 int day_;
86 int seconds_;
87 };
88
Darin Petkov2ccef012010-05-05 16:06:37 -070089 // Metric parameters.
90 static const char kMetricDailyUseTimeName[];
91 static const int kMetricDailyUseTimeMin;
92 static const int kMetricDailyUseTimeMax;
93 static const int kMetricDailyUseTimeBuckets;
94 static const char kMetricTimeToNetworkDropName[];
95 static const int kMetricTimeToNetworkDropMin;
96 static const int kMetricTimeToNetworkDropMax;
97 static const int kMetricTimeToNetworkDropBuckets;
98
Darin Petkov41e06232010-05-03 16:45:37 -070099 // D-Bus message match strings.
100 static const char* kDBusMatches_[];
101
102 // Array of network states.
103 static const char* kNetworkStates_[kNumberNetworkStates];
104
105 // Array of power states.
106 static const char* kPowerStates_[kNumberPowerStates];
107
108 // Array of screen-saver states.
109 static const char* kScreenSaverStates_[kNumberScreenSaverStates];
110
111 // Array of user session states.
112 static const char* kSessionStates_[kNumberSessionStates];
113
Darin Petkov65b01462010-04-14 13:32:20 -0700114 // Initializes.
115 void Init(bool testing);
116
117 // Creates the event loop and enters it.
118 void Loop();
119
Darin Petkov703ec972010-04-27 11:02:18 -0700120 // D-Bus filter callback.
121 static DBusHandlerResult MessageFilter(DBusConnection* connection,
122 DBusMessage* message,
123 void* user_data);
Darin Petkov65b01462010-04-14 13:32:20 -0700124
Darin Petkov703ec972010-04-27 11:02:18 -0700125 // Processes network state change.
Darin Petkov41e06232010-05-03 16:45:37 -0700126 void NetStateChanged(const char* state_name, time_t now);
Darin Petkov65b01462010-04-14 13:32:20 -0700127
Darin Petkov703ec972010-04-27 11:02:18 -0700128 // Given the state name, returns the state id.
129 NetworkState LookupNetworkState(const char* state_name);
Darin Petkov65b01462010-04-14 13:32:20 -0700130
Darin Petkov703ec972010-04-27 11:02:18 -0700131 // Processes power state change.
Darin Petkov41e06232010-05-03 16:45:37 -0700132 void PowerStateChanged(const char* state_name, time_t now);
Darin Petkov703ec972010-04-27 11:02:18 -0700133
134 // Given the state name, returns the state id.
135 PowerState LookupPowerState(const char* state_name);
Darin Petkov65b01462010-04-14 13:32:20 -0700136
Darin Petkov41e06232010-05-03 16:45:37 -0700137 // Processes screen-saver state change.
138 void ScreenSaverStateChanged(const char* state_name, time_t now);
139
140 // Given the state name, returns the state id.
141 ScreenSaverState LookupScreenSaverState(const char* state_name);
142
143 // Processes user session state change.
144 void SessionStateChanged(const char* state_name, time_t now);
145
146 // Given the state name, returns the state id.
147 SessionState LookupSessionState(const char* state_name);
148
149 // Updates the user-active state to |active| and logs the usage data
150 // since the last update. If the user has just become active,
151 // reschedule the daily use monitor for more frequent updates --
152 // this is followed by an exponential back-off (see UseMonitor).
153 void SetUserActiveState(bool active, time_t now);
154
155 // Updates the daily usage file, if necessary, by adding |seconds|
156 // of active use to the |day| since Epoch. If there's usage data for
157 // day in the past in the usage file, that data is sent to UMA and
158 // removed from the file. If there's already usage data for |day| in
159 // the usage file, the |seconds| are accumulated.
160 void LogDailyUseRecord(int day, int seconds);
161
162 // Callbacks for the daily use monitor. The daily use monitor uses
163 // LogDailyUseRecord to aggregate current usage data and send it to
164 // UMA, if necessary. It also reschedules itself using an
165 // exponentially bigger interval (up to a certain maximum) -- so
166 // usage is monitored less frequently with longer active use.
167 static gboolean UseMonitorStatic(gpointer data);
168 bool UseMonitor();
169
170 // Schedules or reschedules a daily use monitor for |interval|
171 // seconds from now. |backoff| mode is used by the use monitor to
172 // reschedule itself. If there's a monitor scheduled already and
173 // |backoff| is false, unschedules it first. Doesn't schedule a
174 // monitor for more than kUseMonitorIntervalMax seconds in the
175 // future (see metrics_daemon.cc). Returns true if a new use monitor
176 // was scheduled, false otherwise (note that if |backoff| is false a
177 // new use monitor will always be scheduled).
178 bool ScheduleUseMonitor(int interval, bool backoff);
179
180 // Unschedules a scheduled use monitor, if any.
181 void UnscheduleUseMonitor();
182
Darin Petkovc2526a12010-04-21 14:24:04 -0700183 // Sends a stat to Chrome for transport to UMA (or prints it for
184 // testing). See MetricsLibrary::SendToChrome in metrics_library.h
185 // for a description of the arguments.
186 void PublishMetric(const char* name, int sample,
187 int min, int max, int nbuckets);
Darin Petkov65b01462010-04-14 13:32:20 -0700188
Darin Petkov2ccef012010-05-05 16:06:37 -0700189 // Test mode.
Darin Petkov41e06232010-05-03 16:45:37 -0700190 bool testing_;
Darin Petkov65b01462010-04-14 13:32:20 -0700191
Darin Petkov2ccef012010-05-05 16:06:37 -0700192 const char* daily_use_record_file_;
193
Darin Petkov41e06232010-05-03 16:45:37 -0700194 // Current network state.
195 NetworkState network_state_;
Darin Petkov65b01462010-04-14 13:32:20 -0700196
Darin Petkov41e06232010-05-03 16:45:37 -0700197 // Timestamps last network state update.
198 time_t network_state_last_;
Darin Petkov65b01462010-04-14 13:32:20 -0700199
Darin Petkov41e06232010-05-03 16:45:37 -0700200 // Current power state.
201 PowerState power_state_;
202
203 // Current screen-saver state.
204 ScreenSaverState screensaver_state_;
205
206 // Current user session state.
207 SessionState session_state_;
208
209 // Is the user currently active: power is on, user session has
210 // started, screen is not locked.
211 bool user_active_;
212
213 // Timestamps last user active update.
214 time_t user_active_last_;
215
216 // Last stored daily use day (since epoch).
217 int daily_use_day_last_;
218
219 // Sleep period until the next daily usage aggregation performed by
220 // the daily use monitor (see ScheduleUseMonitor).
221 int usemon_interval_;
222
223 // Scheduled daily use monitor source (see ScheduleUseMonitor).
224 GSource* usemon_source_;
Darin Petkov65b01462010-04-14 13:32:20 -0700225};
226
227#endif // METRICS_DAEMON_H_