blob: 2c32d910b8725bad1d6b0fb6c3024fce2f98a239 [file] [log] [blame]
Mike Frysingere58c0e22017-10-04 15:43:30 -04001# -*- coding: utf-8 -*-
Allen Li02915572017-07-12 18:05:45 -07002# Copyright 2016 The Chromium OS Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6"""Send system monitoring data to the timeseries monitoring API."""
7
8from __future__ import absolute_import
9from __future__ import print_function
10
11import random
12import time
13
14from chromite.lib import commandline
15from chromite.lib import cros_logging as logging
16from chromite.lib import metrics
17from chromite.lib import ts_mon_config
18from infra_libs.ts_mon.common import interface
19
20from chromite.scripts.sysmon import git_metrics
21from chromite.scripts.sysmon import loop
22from chromite.scripts.sysmon import net_metrics
23from chromite.scripts.sysmon import osinfo_metrics
24from chromite.scripts.sysmon import proc_metrics
25from chromite.scripts.sysmon import prod_metrics
26from chromite.scripts.sysmon import puppet_metrics
27from chromite.scripts.sysmon import system_metrics
28
29logger = logging.getLogger(__name__)
30
31
32class _MetricCollector(object):
33 """Metric collector class."""
34
35 def __init__(self, collect_prod_hosts=False):
36 self._collect_osinfo = _TimedCallback(
37 callback=osinfo_metrics.collect_os_info,
38 interval=60 * 60)
39 if collect_prod_hosts:
40 logger.info(u'Enabling prod host metric collection.')
41 self._collect_prod_hosts = _TimedCallback(
42 callback=prod_metrics.collect_prod_hosts,
43 interval=10 * 60)
44 else:
45 self._collect_prod_hosts = lambda: None
46
47 def __call__(self):
48 """Collect metrics."""
49 system_metrics.collect_uptime()
50 system_metrics.collect_cpu_info()
51 system_metrics.collect_disk_info()
52 system_metrics.collect_mem_info()
53 net_metrics.collect_net_info()
54 proc_metrics.collect_proc_info()
55 system_metrics.collect_load_avg()
56 puppet_metrics.collect_puppet_summary()
57 git_metrics.collect_git_metrics()
58 self._collect_prod_hosts()
59 self._collect_osinfo()
60 system_metrics.collect_unix_time() # must be just before flush
61 metrics.Flush()
62
63
64class _TimedCallback(object):
65 """Limits callback to one call in a given interval."""
66
67 def __init__(self, callback, interval):
68 """Initialize instance.
69
70 Args:
71 callback: function to call
72 interval: Number of seconds between allowed calls
73 """
74 self._callback = callback
75 self._interval = interval
76 self._last_called = time.time() - interval
77
78 def __call__(self):
79 if time.time() >= self._next_call:
80 self._callback()
81 self._last_called = time.time()
82
83 @property
84 def _next_call(self):
85 return self._last_called + self._interval
86
87
88def main():
89 parser = commandline.ArgumentParser(
90 description=__doc__,
91 default_log_level='DEBUG')
92 parser.add_argument(
93 '--interval',
94 default=60,
95 type=int,
96 help='time (in seconds) between sampling system metrics')
97 parser.add_argument(
98 '--collect-prod-hosts',
99 action='store_true',
100 help='Enable collection of prod host metrics, like roles')
101 opts = parser.parse_args()
102 opts.Freeze()
103
104 # Wait a random amount of time before starting the loop in case sysmon
105 # is started at exactly the same time on all machines.
106 time.sleep(random.uniform(0, opts.interval))
107
108 # This call returns a context manager that doesn't do anything, so we
109 # ignore the return value.
110 ts_mon_config.SetupTsMonGlobalState('sysmon', auto_flush=False)
111 # The default prefix is '/chrome/infra/'.
112 interface.state.metric_name_prefix = (interface.state.metric_name_prefix
113 + 'chromeos/sysmon/')
114
115 collector = _MetricCollector(collect_prod_hosts=opts.collect_prod_hosts)
116 loop.SleepLoop(callback=collector,
117 interval=opts.interval).loop_forever()