[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__':
diff --git a/scripts/sysmon/loop.py b/scripts/sysmon/loop.py
new file mode 100644
index 0000000..e96dfe4
--- /dev/null
+++ b/scripts/sysmon/loop.py
@@ -0,0 +1,52 @@
+# Copyright 2016 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Sleep loop."""
+
+from __future__ import print_function
+
+import time
+
+from chromite.lib import cros_logging as logging
+
+logger = logging.getLogger(__name__)
+
+
+class SleepLoop(object):
+ """Sleep loop."""
+
+ def __init__(self, callback, interval=60):
+ """Initialize instance.
+
+ Args:
+ callback: Function to call on each loop.
+ interval: Time between loops in seconds.
+ """
+ self._callback = callback
+ self._interval = interval
+ self._cycles = 0
+
+ def loop_once(self):
+ """Do actions for a single loop."""
+ try:
+ self._callback(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()