3
from landscape.lib.monitor import CoverageMonitor
4
from landscape.lib.sysstats import MemoryStats
6
from landscape.accumulate import Accumulator
7
from landscape.monitor.monitor import MonitorPlugin
10
class MemoryInfo(MonitorPlugin):
11
"""Plugin captures information about free memory and free swap."""
13
persist_name = "memory-info"
14
# Prevent the Plugin base-class from scheduling looping calls.
17
def __init__(self, interval=15, monitor_interval=60*60,
18
source_filename="/proc/meminfo", create_time=time.time):
19
self._interval = interval
20
self._monitor_interval = monitor_interval
21
self._source_filename = source_filename
22
self._memory_info = []
23
self._create_time = create_time
25
def register(self, registry):
26
super(MemoryInfo, self).register(registry)
27
self._accumulate = Accumulator(self._persist, self.registry.step_size)
28
self.registry.reactor.call_every(self._interval, self.run)
29
self._monitor = CoverageMonitor(self._interval, 0.8,
30
"memory/swap snapshot",
31
create_time=self._create_time)
32
self.registry.reactor.call_every(self._monitor_interval,
34
self.registry.reactor.call_on("stop", self._monitor.log, priority=2000)
35
self.call_on_accepted("memory-info", self.send_message, True)
37
def create_message(self):
38
memory_info = self._memory_info
39
self._memory_info = []
40
return {"type": "memory-info", "memory-info": memory_info}
42
def send_message(self, urgent=False):
43
message = self.create_message()
44
if len(message["memory-info"]):
45
self.registry.broker.send_message(message, urgent=urgent)
47
def exchange(self, urgent=False):
48
self.registry.broker.call_if_accepted("memory-info",
49
self.send_message, urgent)
53
new_timestamp = int(self._create_time())
54
memstats = MemoryStats(self._source_filename)
55
memory_step_data = self._accumulate(new_timestamp, memstats.free_memory,
57
swap_step_data = self._accumulate(new_timestamp, memstats.free_swap,
60
if memory_step_data and swap_step_data:
61
timestamp = memory_step_data[0]
62
free_memory = int(memory_step_data[1])
63
free_swap = int(swap_step_data[1])
64
self._memory_info.append((timestamp, free_memory, free_swap))