from pymonitor import Metric import re memline_pattern = re.compile(r'^(?P[^\\:]+)\:\s+(?P[0-9]+)(\s(?P[a-zA-Z]+))?') computed_fields = { "mempctused": lambda items: round((items["memtotal"] - items["memfree"]) / items["memtotal"], 5), "mempctfree": lambda items: 1 - round((items["memtotal"] - items["memfree"]) / items["memtotal"], 5), "mempctused_nocache": lambda items: round((items["memtotal"] - items["memfree"] - items["cached"]) / items["memtotal"], 5), "mempctfree_nocache": lambda items: 1 - round((items["memtotal"] - items["memfree"] - items["cached"]) / items["memtotal"], 5), "swappctused": lambda items: round((items["swaptotal"] - items["swapfree"]) / items["swaptotal"] if items["swaptotal"] > 0 else 0.0, 5), "swappctfree": lambda items: 1 - round((items["swaptotal"] - items["swapfree"]) / items["swaptotal"] if items["swaptotal"] > 0 else 0.0, 5) } def meminfo(whitelist=[]): if not whitelist: whitelist = ["swaptotal", "swapfree", "swapcached", "memtotal", "memfree", "cached", "active", "inactive", ] result = {} with open("/proc/meminfo", "r") as f: for line in f.read().strip().split("\n"): matches = memline_pattern.match(line) value = int(matches.group("value")) unit = matches.group("unit") if unit: if unit == "kB": value *= 1024 else: raise Exception("Unknown unit") name = ''.join(c for c in matches.group("key").lower() if 96 < ord(c) < 123) if name in whitelist: result[name] = value for key in computed_fields: result[key] = computed_fields[key](result) yield Metric(result) mapping = { "swaptotal": {"type": "long"}, "swapfree": {"type": "long"}, "swapcached": {"type": "long"}, "memtotal": {"type": "long"}, "memfree": {"type": "long"}, "memavailable": {"type": "long"}, "cached": {"type": "long"}, "active": {"type": "long"}, "inactive": {"type": "long"}, "mempctused": {"type": "double"}, "mempctfree": {"type": "double"}, "mempctused_nocache": {"type": "double"}, "mempctfree_nocache": {"type": "double"}, "swappctused": {"type": "double"}, "swappctfree": {"type": "double"} } if __name__ == '__main__': for item in meminfo(): print(item)