[sysmon] Move loop class to its own module

BUG=chromium:655796
TEST=Run sysmon

Change-Id: I2f2cd98abd0f5697a062eb81792df2febd9b2010
Reviewed-on: https://chromium-review.googlesource.com/421098
Commit-Ready: Allen Li <ayatane@chromium.org>
Tested-by: Allen Li <ayatane@chromium.org>
Reviewed-by: Aviv Keshet <akeshet@chromium.org>
diff --git a/scripts/sysmon/__main__.py b/scripts/sysmon/__main__.py
index 1673e2a..a1095a9 100644
--- a/scripts/sysmon/__main__.py
+++ b/scripts/sysmon/__main__.py
@@ -17,6 +17,7 @@
 from chromite.lib import ts_mon_config
 from chromite.scripts.sysmon import puppet_metrics
 from chromite.scripts.sysmon import system_metrics
+from chromite.scripts.sysmon import loop
 from infra_libs.ts_mon.common import interface
 
 DEFAULT_LOG_LEVEL = 'DEBUG'
@@ -25,45 +26,6 @@
 logger = logging.getLogger(__name__)
 
 
-class _MainLoop(object):
-  """Main loop for sysmon."""
-
-  def __init__(self, loop_func, interval=60):
-    """Initialize instance.
-
-    Args:
-      loop_func: Function to call on each loop.
-      interval: Time between loops in seconds.
-    """
-    self._loop_func = loop_func
-    self._interval = interval
-    self._cycles = 0
-
-  def loop_once(self):
-    """Do actions for a single loop."""
-    try:
-      self._loop_func(self._cycles)
-    except Exception:
-      logger.exception('Error during loop.')
-
-  def loop_forever(self):
-    while True:
-      self.loop_once()
-      _force_sleep(self._interval)
-      self._cycles = (self._cycles + 1) % 60
-
-
-def _force_sleep(secs):
-  """Force sleep for at least the given number of seconds."""
-  now = time.time()
-  finished_time = now + secs
-  while now < finished_time:
-    remaining = finished_time - now
-    logger.debug('Sleeping for %d, %d remaining', secs, remaining)
-    time.sleep(remaining)
-    now = time.time()
-
-
 def collect_metrics(cycles):
   system_metrics.get_uptime()
   system_metrics.get_cpu_info()
@@ -105,9 +67,8 @@
   interface.state.metric_name_prefix = (interface.state.metric_name_prefix
                                         + 'chromeos/sysmon/')
 
-  mainloop = _MainLoop(loop_func=collect_metrics,
-                       interval=opts.interval)
-  mainloop.loop_forever()
+  loop.SleepLoop(callback=collect_metrics,
+                 interval=opts.interval).loop_forever()
 
 
 if __name__ == '__main__':