4
from landscape.accumulate import Accumulator
5
from landscape.lib.monitor import CoverageMonitor
6
from landscape.monitor.monitor import MonitorPlugin
9
class LoadAverage(MonitorPlugin):
10
"""Plugin captures information about load average."""
12
persist_name = "load-average"
13
# Prevent the Plugin base-class from scheduling looping calls.
16
def __init__(self, interval=15, monitor_interval=60*60,
17
create_time=time.time, get_load_average=os.getloadavg):
18
self._interval = interval
19
self._monitor_interval = monitor_interval
20
self._create_time = create_time
21
self._load_averages = []
22
self._get_load_average = get_load_average
24
def register(self, registry):
25
super(LoadAverage, self).register(registry)
26
self._accumulate = Accumulator(self._persist, registry.step_size)
28
self.registry.reactor.call_every(self._interval, self.run)
30
self._monitor = CoverageMonitor(self._interval, 0.8,
31
"load average snapshot",
32
create_time=self._create_time)
33
self.registry.reactor.call_every(self._monitor_interval,
35
self.registry.reactor.call_on("stop", self._monitor.log, priority=2000)
36
self.call_on_accepted("load-average", self.send_message, True)
38
def create_message(self):
39
load_averages = self._load_averages
40
self._load_averages = []
41
return {"type": "load-average", "load-averages": load_averages}
43
def exchange(self, urgent=False):
44
self.registry.broker.call_if_accepted("load-average",
45
self.send_message, urgent)
47
def send_message(self, urgent=False):
48
message = self.create_message()
49
if len(message["load-averages"]):
50
self.registry.broker.send_message(message, urgent=urgent)
53
self.registry.broker.call_if_accepted("load-average", self.send_message)
57
new_timestamp = int(self._create_time())
58
new_load_average = self._get_load_average()[0]
59
step_data = self._accumulate(new_timestamp, new_load_average,
62
self._load_averages.append(step_data)