Index: metrics_daemon.cc |
diff --git a/metrics_daemon.cc b/metrics_daemon.cc |
index 0171fdec952fa650587d60e3b9b9f55f988e28c6..4d50cb5e5147c5686959807f82991d90637f19de 100644 |
--- a/metrics_daemon.cc |
+++ b/metrics_daemon.cc |
@@ -4,10 +4,11 @@ |
#include "metrics_daemon.h" |
-#include <dbus/dbus-glib-lowlevel.h> |
+#include <string.h> |
#include <base/file_util.h> |
#include <base/logging.h> |
+#include <dbus/dbus-glib-lowlevel.h> |
#include "counter.h" |
@@ -43,7 +44,7 @@ const char kKernelCrashDetectedFile[] = "/tmp/kernel-crash-detected"; |
static const char kUncleanShutdownDetectedFile[] = |
"/tmp/unclean-shutdown-detected"; |
-// static metrics parameters. |
+// static metrics parameters |
const char MetricsDaemon::kMetricDailyUseTimeName[] = |
"Logging.DailyUseTime"; |
const int MetricsDaemon::kMetricDailyUseTimeMin = 1; |
@@ -73,16 +74,26 @@ const int MetricsDaemon::kMetricCrashIntervalBuckets = 50; |
// crash frequency metrics |
const char MetricsDaemon::kMetricAnyCrashesDailyName[] = |
"Logging.AnyCrashesDaily"; |
+const char MetricsDaemon::kMetricAnyCrashesWeeklyName[] = |
+ "Logging.AnyCrashesWeekly"; |
const char MetricsDaemon::kMetricKernelCrashesDailyName[] = |
"Logging.KernelCrashesDaily"; |
+const char MetricsDaemon::kMetricKernelCrashesWeeklyName[] = |
+ "Logging.KernelCrashesWeekly"; |
const char MetricsDaemon::kMetricUncleanShutdownsDailyName[] = |
"Logging.UncleanShutdownsDaily"; |
+const char MetricsDaemon::kMetricUncleanShutdownsWeeklyName[] = |
+ "Logging.UncleanShutdownsWeekly"; |
const char MetricsDaemon::kMetricUserCrashesDailyName[] = |
"Logging.UserCrashesDaily"; |
-const char MetricsDaemon::kMetricCrashesDailyMin = 1; |
-const char MetricsDaemon::kMetricCrashesDailyMax = 100; |
-const char MetricsDaemon::kMetricCrashesDailyBuckets = 50; |
+const char MetricsDaemon::kMetricUserCrashesWeeklyName[] = |
+ "Logging.UserCrashesWeekly"; |
+const char MetricsDaemon::kMetricCrashFrequencyMin = 1; |
+const char MetricsDaemon::kMetricCrashFrequencyMax = 100; |
+const char MetricsDaemon::kMetricCrashFrequencyBuckets = 50; |
+// persistent metrics path |
+const char MetricsDaemon::kMetricsPath[] = "/var/log/metrics"; |
// static |
@@ -182,7 +193,17 @@ MetricsDaemon::MetricsDaemon() |
usemon_interval_(0), |
usemon_source_(NULL) {} |
-MetricsDaemon::~MetricsDaemon() {} |
+MetricsDaemon::~MetricsDaemon() { |
+ DeleteFrequencyCounters(); |
+} |
+ |
+void MetricsDaemon::DeleteFrequencyCounters() { |
+ for (FrequencyCounters::iterator i = frequency_counters_.begin(); |
+ i != frequency_counters_.end(); ++i) { |
+ delete i->second; |
+ i->second = NULL; |
+ } |
+} |
void MetricsDaemon::Run(bool run_as_daemon) { |
if (run_as_daemon && daemon(0, 0) != 0) |
@@ -199,64 +220,72 @@ void MetricsDaemon::Run(bool run_as_daemon) { |
Loop(); |
} |
+FilePath MetricsDaemon::GetHistogramPath(const char* histogram_name) { |
+ return FilePath(kMetricsPath).Append(histogram_name); |
+} |
+ |
+void MetricsDaemon::ConfigureCrashIntervalReporter( |
+ const char* histogram_name, |
+ scoped_ptr<chromeos_metrics::TaggedCounterReporter>* reporter) { |
+ reporter->reset(new chromeos_metrics::TaggedCounterReporter()); |
+ FilePath file_path = GetHistogramPath(histogram_name); |
+ (*reporter)->Init(file_path.value().c_str(), |
+ histogram_name, |
+ kMetricCrashIntervalMin, |
+ kMetricCrashIntervalMax, |
+ kMetricCrashIntervalBuckets); |
+} |
+ |
+void MetricsDaemon::ConfigureCrashFrequencyReporter( |
+ const char* histogram_name) { |
+ scoped_ptr<chromeos_metrics::TaggedCounterReporter> reporter( |
+ new chromeos_metrics::TaggedCounterReporter()); |
+ FilePath file_path = GetHistogramPath(histogram_name); |
+ reporter->Init(file_path.value().c_str(), |
+ histogram_name, |
+ kMetricCrashFrequencyMin, |
+ kMetricCrashFrequencyMax, |
+ kMetricCrashFrequencyBuckets); |
+ scoped_ptr<chromeos_metrics::FrequencyCounter> new_counter( |
+ new chromeos_metrics::FrequencyCounter()); |
+ time_t cycle_duration = strstr(histogram_name, "Weekly") != NULL ? |
+ chromeos_metrics::kSecondsPerWeek : |
+ chromeos_metrics::kSecondsPerDay; |
+ new_counter->Init( |
+ static_cast<chromeos_metrics::TaggedCounterInterface*>( |
+ reporter.release()), |
+ cycle_duration); |
+ frequency_counters_[histogram_name] = new_counter.release(); |
+} |
+ |
void MetricsDaemon::Init(bool testing, MetricsLibraryInterface* metrics_lib) { |
testing_ = testing; |
DCHECK(metrics_lib != NULL); |
metrics_lib_ = metrics_lib; |
+ chromeos_metrics::TaggedCounterReporter:: |
+ SetMetricsLibraryInterface(metrics_lib); |
static const char kDailyUseRecordFile[] = "/var/log/metrics/daily-usage"; |
daily_use_.reset(new chromeos_metrics::TaggedCounter()); |
daily_use_->Init(kDailyUseRecordFile, &ReportDailyUse, this); |
- static const char kUserCrashIntervalRecordFile[] = |
- "/var/log/metrics/user-crash-interval"; |
- user_crash_interval_.reset(new chromeos_metrics::TaggedCounter()); |
- user_crash_interval_->Init(kUserCrashIntervalRecordFile, |
- &ReportUserCrashInterval, this); |
- |
- static const char kKernelCrashIntervalRecordFile[] = |
- "/var/log/metrics/kernel-crash-interval"; |
- kernel_crash_interval_.reset(new chromeos_metrics::TaggedCounter()); |
- kernel_crash_interval_->Init(kKernelCrashIntervalRecordFile, |
- &ReportKernelCrashInterval, this); |
- |
- static const char kUncleanShutdownDetectedFile[] = |
- "/var/log/metrics/unclean-shutdown-interval"; |
- unclean_shutdown_interval_.reset(new chromeos_metrics::TaggedCounter()); |
- unclean_shutdown_interval_->Init(kUncleanShutdownDetectedFile, |
- &ReportUncleanShutdownInterval, this); |
- |
- static const char kUserCrashesDailyRecordFile[] = |
- "/var/log/metrics/user-crashes-daily"; |
- user_crashes_daily_.reset(new chromeos_metrics::FrequencyCounter()); |
- user_crashes_daily_->Init(kUserCrashesDailyRecordFile, |
- &ReportUserCrashesDaily, |
- this, |
- chromeos_metrics::kSecondsPerDay); |
- |
- static const char kKernelCrashesDailyRecordFile[] = |
- "/var/log/metrics/kernel-crashes-daily"; |
- kernel_crashes_daily_.reset(new chromeos_metrics::FrequencyCounter()); |
- kernel_crashes_daily_->Init(kKernelCrashesDailyRecordFile, |
- &ReportKernelCrashesDaily, |
- this, |
- chromeos_metrics::kSecondsPerDay); |
- |
- static const char kUncleanShutdownsDailyRecordFile[] = |
- "/var/log/metrics/unclean-shutdowns-daily"; |
- unclean_shutdowns_daily_.reset(new chromeos_metrics::FrequencyCounter()); |
- unclean_shutdowns_daily_->Init(kUncleanShutdownsDailyRecordFile, |
- &ReportUncleanShutdownsDaily, |
- this, |
- chromeos_metrics::kSecondsPerDay); |
- |
- static const char kAnyCrashesUserCrashDailyRecordFile[] = |
- "/var/log/metrics/any-crashes-daily"; |
- any_crashes_daily_.reset(new chromeos_metrics::FrequencyCounter()); |
- any_crashes_daily_->Init(kAnyCrashesUserCrashDailyRecordFile, |
- &ReportAnyCrashesDaily, |
- this, |
- chromeos_metrics::kSecondsPerDay); |
+ ConfigureCrashIntervalReporter(kMetricKernelCrashIntervalName, |
+ &kernel_crash_interval_); |
+ ConfigureCrashIntervalReporter(kMetricUncleanShutdownIntervalName, |
+ &unclean_shutdown_interval_); |
+ ConfigureCrashIntervalReporter(kMetricUserCrashIntervalName, |
+ &user_crash_interval_); |
+ |
+ DeleteFrequencyCounters(); |
+ ConfigureCrashFrequencyReporter(kMetricAnyCrashesDailyName); |
+ ConfigureCrashFrequencyReporter(kMetricAnyCrashesDailyName); |
+ ConfigureCrashFrequencyReporter(kMetricAnyCrashesWeeklyName); |
+ ConfigureCrashFrequencyReporter(kMetricKernelCrashesDailyName); |
+ ConfigureCrashFrequencyReporter(kMetricKernelCrashesWeeklyName); |
+ ConfigureCrashFrequencyReporter(kMetricUncleanShutdownsDailyName); |
+ ConfigureCrashFrequencyReporter(kMetricUncleanShutdownsWeeklyName); |
+ ConfigureCrashFrequencyReporter(kMetricUserCrashesDailyName); |
+ ConfigureCrashFrequencyReporter(kMetricUserCrashesWeeklyName); |
// Don't setup D-Bus and GLib in test mode. |
if (testing) |
@@ -453,6 +482,12 @@ void MetricsDaemon::SetUserActiveState(bool active, Time now) { |
user_crash_interval_->Update(0, seconds); |
kernel_crash_interval_->Update(0, seconds); |
+ // Flush finished cycles of all frequency counters. |
+ for (FrequencyCounters::iterator i = frequency_counters_.begin(); |
+ i != frequency_counters_.end(); ++i) { |
+ i->second->FlushFinishedCycles(); |
+ } |
+ |
// Schedules a use monitor on inactive->active transitions and |
// unschedules it on active->inactive transitions. |
if (!user_active_ && active) |
@@ -473,8 +508,10 @@ void MetricsDaemon::ProcessUserCrash() { |
// Reports the active use time since the last crash and resets it. |
user_crash_interval_->Flush(); |
- user_crashes_daily_->Update(1); |
- any_crashes_daily_->Update(1); |
+ frequency_counters_[kMetricUserCrashesDailyName]->Update(1); |
+ frequency_counters_[kMetricUserCrashesWeeklyName]->Update(1); |
+ frequency_counters_[kMetricAnyCrashesDailyName]->Update(1); |
+ frequency_counters_[kMetricAnyCrashesWeeklyName]->Update(1); |
} |
void MetricsDaemon::ProcessKernelCrash() { |
@@ -484,8 +521,10 @@ void MetricsDaemon::ProcessKernelCrash() { |
// Reports the active use time since the last crash and resets it. |
kernel_crash_interval_->Flush(); |
- kernel_crashes_daily_->Update(1); |
- any_crashes_daily_->Update(1); |
+ frequency_counters_[kMetricKernelCrashesDailyName]->Update(1); |
+ frequency_counters_[kMetricKernelCrashesWeeklyName]->Update(1); |
+ frequency_counters_[kMetricAnyCrashesDailyName]->Update(1); |
+ frequency_counters_[kMetricAnyCrashesWeeklyName]->Update(1); |
} |
void MetricsDaemon::ProcessUncleanShutdown() { |
@@ -495,8 +534,10 @@ void MetricsDaemon::ProcessUncleanShutdown() { |
// Reports the active use time since the last crash and resets it. |
unclean_shutdown_interval_->Flush(); |
- unclean_shutdowns_daily_->Update(1); |
- any_crashes_daily_->Update(1); |
+ frequency_counters_[kMetricUncleanShutdownsDailyName]->Update(1); |
+ frequency_counters_[kMetricUncleanShutdownsWeeklyName]->Update(1); |
+ frequency_counters_[kMetricAnyCrashesDailyName]->Update(1); |
+ frequency_counters_[kMetricAnyCrashesWeeklyName]->Update(1); |
} |
bool MetricsDaemon::CheckSystemCrash(const std::string& crash_file) { |
@@ -584,69 +625,6 @@ void MetricsDaemon::ReportDailyUse(void* handle, int tag, int count) { |
kMetricDailyUseTimeBuckets); |
} |
-// static |
-void MetricsDaemon::ReportCrashInterval(const char* histogram_name, |
- void* handle, int count) { |
- MetricsDaemon* daemon = static_cast<MetricsDaemon*>(handle); |
- daemon->SendMetric(histogram_name, count, |
- kMetricCrashIntervalMin, |
- kMetricCrashIntervalMax, |
- kMetricCrashIntervalBuckets); |
-} |
- |
-// static |
-void MetricsDaemon::ReportUserCrashInterval(void* handle, |
- int tag, int count) { |
- ReportCrashInterval(kMetricUserCrashIntervalName, handle, count); |
-} |
- |
-// static |
-void MetricsDaemon::ReportKernelCrashInterval(void* handle, |
- int tag, int count) { |
- ReportCrashInterval(kMetricKernelCrashIntervalName, handle, count); |
-} |
- |
-// static |
-void MetricsDaemon::ReportUncleanShutdownInterval(void* handle, |
- int tag, int count) { |
- ReportCrashInterval(kMetricUncleanShutdownIntervalName, handle, count); |
-} |
- |
-// static |
-void MetricsDaemon::ReportCrashesDailyFrequency(const char* histogram_name, |
- void* handle, |
- int count) { |
- MetricsDaemon* daemon = static_cast<MetricsDaemon*>(handle); |
- daemon->SendMetric(histogram_name, count, |
- kMetricCrashesDailyMin, |
- kMetricCrashesDailyMax, |
- kMetricCrashesDailyBuckets); |
-} |
- |
-// static |
-void MetricsDaemon::ReportUserCrashesDaily(void* handle, |
- int tag, int count) { |
- ReportCrashesDailyFrequency(kMetricUserCrashesDailyName, handle, count); |
-} |
- |
-// static |
-void MetricsDaemon::ReportKernelCrashesDaily(void* handle, |
- int tag, int count) { |
- ReportCrashesDailyFrequency(kMetricKernelCrashesDailyName, handle, count); |
-} |
- |
-// static |
-void MetricsDaemon::ReportUncleanShutdownsDaily(void* handle, |
- int tag, int count) { |
- ReportCrashesDailyFrequency(kMetricUncleanShutdownsDailyName, handle, count); |
-} |
- |
-// static |
-void MetricsDaemon::ReportAnyCrashesDaily(void* handle, int tag, int count) { |
- ReportCrashesDailyFrequency(kMetricAnyCrashesDailyName, handle, count); |
-} |
- |
- |
void MetricsDaemon::SendMetric(const string& name, int sample, |
int min, int max, int nbuckets) { |
DLOG(INFO) << "received metric: " << name << " " << sample << " " |