Collect some disk statistics.

Change-Id: Id30f4b7e5d121f2632592ebacf47a18ea1d89fec

BUG=chromium-os:12171
TEST=ran on target and observed that stats are generated

Review URL: http://codereview.chromium.org/6486021
diff --git a/metrics/metrics_daemon.h b/metrics/metrics_daemon.h
index 5f2e786..dd61322 100644
--- a/metrics/metrics_daemon.h
+++ b/metrics/metrics_daemon.h
@@ -29,7 +29,8 @@
   ~MetricsDaemon();
 
   // Initializes.
-  void Init(bool testing, MetricsLibraryInterface* metrics_lib);
+  void Init(bool testing, MetricsLibraryInterface* metrics_lib,
+            const char* diskstats_path);
 
   // Does all the work. If |run_as_daemon| is true, daemonizes by
   // forking.
@@ -52,6 +53,7 @@
   FRIEND_TEST(MetricsDaemonTest, ProcessUserCrash);
   FRIEND_TEST(MetricsDaemonTest, ReportCrashesDailyFrequency);
   FRIEND_TEST(MetricsDaemonTest, ReportDailyUse);
+  FRIEND_TEST(MetricsDaemonTest, ReportDiskStats);
   FRIEND_TEST(MetricsDaemonTest, ReportKernelCrashInterval);
   FRIEND_TEST(MetricsDaemonTest, ReportUncleanShutdownInterval);
   FRIEND_TEST(MetricsDaemonTest, ReportUserCrashInterval);
@@ -77,6 +79,12 @@
     kNumberSessionStates
   };
 
+  // State for disk stats collector callback.
+  enum DiskStatsState {
+    kDiskStatsShort,    // short wait before short interval collection
+    kDiskStatsLong,     // final wait before new collection
+  };
+
   // Data record for aggregating daily usage.
   class UseRecord {
    public:
@@ -111,6 +119,15 @@
   static const char kMetricUserCrashesDailyName[];
   static const char kMetricUserCrashesWeeklyName[];
   static const char kMetricUserCrashIntervalName[];
+  static const char kMetricReadSectorsLongName[];
+  static const char kMetricReadSectorsShortName[];
+  static const char kMetricWriteSectorsLongName[];
+  static const char kMetricWriteSectorsShortName[];
+  static const int kMetricDiskStatsShortInterval;
+  static const int kMetricDiskStatsLongInterval;
+  static const int kMetricSectorsIOMax;
+  static const int kMetricSectorsBuckets;
+  static const char kMetricsDiskStatsPath[];
 
   // D-Bus message match strings.
   static const char* kDBusMatches_[];
@@ -217,6 +234,22 @@
   void SendMetric(const std::string& name, int sample,
                   int min, int max, int nbuckets);
 
+  // Initializes disk stats reporting.
+  void DiskStatsReporterInit();
+
+  // Schedules a callback for the next disk stats collection.
+  void ScheduleDiskStatsCallback(int wait);
+
+  // Reads cumulative disk statistics from sysfs.
+  void DiskStatsReadStats(long int* read_sectors, long int* write_sectors);
+
+  // Reports disk statistics (static version for glib).  Arguments are a glib
+  // artifact.
+  static gboolean DiskStatsCallbackStatic(void* handle);
+
+  // Reports disk statistics.
+  void DiskStatsCallback();
+
   // Test mode.
   bool testing_;
 
@@ -265,6 +298,13 @@
 
   // Scheduled daily use monitor source (see ScheduleUseMonitor).
   GSource* usemon_source_;
+
+  // Contains the most recent disk stats.
+  long int read_sectors_;
+  long int write_sectors_;
+
+  DiskStatsState diskstats_state_;
+  const char* diskstats_path_;
 };
 
 #endif  // METRICS_DAEMON_H_