| Index: metrics_daemon.cc
|
| diff --git a/metrics_daemon.cc b/metrics_daemon.cc
|
| index 70c0748d5facbc60125e3d6e8d0f3787c9be4291..e93c9a8181d81cb576f27f49e42f067e8256041e 100644
|
| --- a/metrics_daemon.cc
|
| +++ b/metrics_daemon.cc
|
| @@ -5,11 +5,11 @@
|
| #include "metrics_daemon.h"
|
|
|
| #include <dbus/dbus-glib-lowlevel.h>
|
| -#include <sys/file.h>
|
|
|
| -#include <base/eintr_wrapper.h>
|
| #include <base/logging.h>
|
|
|
| +#include "counter.h"
|
| +
|
| using base::Time;
|
| using base::TimeDelta;
|
| using base::TimeTicks;
|
| @@ -89,6 +89,16 @@ const char* MetricsDaemon::kSessionStates_[] = {
|
| #include "session_states.h"
|
| };
|
|
|
| +MetricsDaemon::MetricsDaemon()
|
| + : network_state_(kUnknownNetworkState),
|
| + power_state_(kUnknownPowerState),
|
| + session_state_(kUnknownSessionState),
|
| + user_active_(false),
|
| + usemon_interval_(0),
|
| + usemon_source_(NULL) {}
|
| +
|
| +MetricsDaemon::~MetricsDaemon() {}
|
| +
|
| void MetricsDaemon::Run(bool run_as_daemon) {
|
| if (!run_as_daemon || daemon(0, 0) == 0) {
|
| Loop();
|
| @@ -99,7 +109,8 @@ void MetricsDaemon::Init(bool testing, MetricsLibraryInterface* metrics_lib) {
|
| testing_ = testing;
|
| DCHECK(metrics_lib != NULL);
|
| metrics_lib_ = metrics_lib;
|
| - daily_use_record_file_ = kDailyUseRecordFile;
|
| + daily_use_.reset(new chromeos_metrics::TaggedCounter());
|
| + daily_use_->Init(kDailyUseRecordFile, &DailyUseReporter, this);
|
|
|
| // Don't setup D-Bus and GLib in test mode.
|
| if (testing)
|
| @@ -283,7 +294,7 @@ void MetricsDaemon::SetUserActiveState(bool active, Time now) {
|
| }
|
| TimeDelta since_epoch = now - Time();
|
| int day = since_epoch.InDays();
|
| - LogDailyUseRecord(day, seconds);
|
| + daily_use_->Update(day, seconds);
|
|
|
| // Schedules a use monitor on inactive->active transitions and
|
| // unschedules it on active->inactive transitions.
|
| @@ -298,70 +309,6 @@ void MetricsDaemon::SetUserActiveState(bool active, Time now) {
|
| user_active_last_ = now;
|
| }
|
|
|
| -void MetricsDaemon::LogDailyUseRecord(int day, int seconds) {
|
| - // If there's no new active use today and the last record in the
|
| - // usage aggregation file is today, there's nothing to do.
|
| - if (seconds == 0 && day == daily_use_day_last_)
|
| - return;
|
| -
|
| - DLOG(INFO) << "day: " << day << " usage: " << seconds << " seconds";
|
| - int fd = HANDLE_EINTR(open(daily_use_record_file_,
|
| - O_RDWR | O_CREAT,
|
| - S_IRUSR | S_IWUSR));
|
| - if (fd < 0) {
|
| - PLOG(WARNING) << "Unable to open the daily use file";
|
| - return;
|
| - }
|
| -
|
| - bool same_day = false;
|
| - UseRecord record;
|
| - if (HANDLE_EINTR(read(fd, &record, sizeof(record))) == sizeof(record)) {
|
| - if (record.day_ == day) {
|
| - // If there's an existing record for today, aggregates the usage
|
| - // time.
|
| - same_day = true;
|
| - record.seconds_ += seconds;
|
| - } else {
|
| - // If there's an existing record for a day in the past, rounds
|
| - // the usage to the nearest minute and sends it to UMA.
|
| - int minutes =
|
| - (record.seconds_ + kSecondsPerMinute / 2) / kSecondsPerMinute;
|
| - SendMetric(kMetricDailyUseTimeName, minutes,
|
| - kMetricDailyUseTimeMin,
|
| - kMetricDailyUseTimeMax,
|
| - kMetricDailyUseTimeBuckets);
|
| -
|
| - // Truncates the usage file to ensure that no duplicate usage is
|
| - // sent to UMA.
|
| - PLOG_IF(WARNING, HANDLE_EINTR(ftruncate(fd, 0)) != 0);
|
| - }
|
| - }
|
| -
|
| - // Updates the use record in the daily usage file if there's new
|
| - // usage today.
|
| - if (seconds > 0) {
|
| - if (!same_day) {
|
| - record.day_ = day;
|
| - record.seconds_ = seconds;
|
| - }
|
| - // else an already existing record for the same day will be
|
| - // overwritten with updated usage below.
|
| -
|
| - PLOG_IF(WARNING, HANDLE_EINTR(lseek(fd, 0, SEEK_SET)) != 0);
|
| - PLOG_IF(WARNING,
|
| - HANDLE_EINTR(write(fd, &record, sizeof(record))) !=
|
| - sizeof(record));
|
| - }
|
| -
|
| - HANDLE_EINTR(close(fd));
|
| -
|
| - // Remembers the day of the use record in the usage aggregation file
|
| - // to reduce file I/O. This is not really useful now but potentially
|
| - // allows frequent LogDailyUseRecord calls with no unnecessary I/O
|
| - // overhead.
|
| - daily_use_day_last_ = day;
|
| -}
|
| -
|
| // static
|
| gboolean MetricsDaemon::UseMonitorStatic(gpointer data) {
|
| return static_cast<MetricsDaemon*>(data)->UseMonitor() ? TRUE : FALSE;
|
| @@ -422,6 +369,16 @@ void MetricsDaemon::UnscheduleUseMonitor() {
|
| usemon_interval_ = 0;
|
| }
|
|
|
| +// static
|
| +void MetricsDaemon::DailyUseReporter(void* handle, int tag, int count) {
|
| + MetricsDaemon* daemon = static_cast<MetricsDaemon*>(handle);
|
| + int minutes = (count + kSecondsPerMinute / 2) / kSecondsPerMinute;
|
| + daemon->SendMetric(kMetricDailyUseTimeName, minutes,
|
| + kMetricDailyUseTimeMin,
|
| + kMetricDailyUseTimeMax,
|
| + kMetricDailyUseTimeBuckets);
|
| +}
|
| +
|
| void MetricsDaemon::SendMetric(const std::string& name, int sample,
|
| int min, int max, int nbuckets) {
|
| DLOG(INFO) << "received metric: " << name << " " << sample << " "
|
|
|