1*d94ebd62SRobin Jarry# SPDX-License-Identifier: BSD-3-Clause 2*d94ebd62SRobin Jarry# Copyright (c) 2023 Robin Jarry 3*d94ebd62SRobin Jarry 4*d94ebd62SRobin JarryMEM_TOTAL = "total_bytes" 5*d94ebd62SRobin JarryMEM_USED = "used_bytes" 6*d94ebd62SRobin Jarry 7*d94ebd62SRobin Jarry 8*d94ebd62SRobin Jarrydef info() -> "dict[Name, tuple[Description, Type]]": 9*d94ebd62SRobin Jarry return { 10*d94ebd62SRobin Jarry MEM_TOTAL: ("The total size of reserved memory in bytes.", "gauge"), 11*d94ebd62SRobin Jarry MEM_USED: ("The currently used memory in bytes.", "gauge"), 12*d94ebd62SRobin Jarry } 13*d94ebd62SRobin Jarry 14*d94ebd62SRobin Jarry 15*d94ebd62SRobin Jarrydef metrics(sock: "TelemetrySocket") -> "list[tuple[Name, Value, Labels]]": 16*d94ebd62SRobin Jarry zones = {} 17*d94ebd62SRobin Jarry used = 0 18*d94ebd62SRobin Jarry for zone in sock.cmd("/eal/memzone_list") or []: 19*d94ebd62SRobin Jarry z = sock.cmd("/eal/memzone_info", zone) 20*d94ebd62SRobin Jarry start = int(z["Hugepage_base"], 16) 21*d94ebd62SRobin Jarry end = start + (z["Hugepage_size"] * z["Hugepage_used"]) 22*d94ebd62SRobin Jarry used += z["Length"] 23*d94ebd62SRobin Jarry for s, e in list(zones.items()): 24*d94ebd62SRobin Jarry if s < start < e < end: 25*d94ebd62SRobin Jarry zones[s] = end 26*d94ebd62SRobin Jarry break 27*d94ebd62SRobin Jarry if start < s < end < e: 28*d94ebd62SRobin Jarry del zones[s] 29*d94ebd62SRobin Jarry zones[start] = e 30*d94ebd62SRobin Jarry break 31*d94ebd62SRobin Jarry else: 32*d94ebd62SRobin Jarry zones[start] = end 33*d94ebd62SRobin Jarry 34*d94ebd62SRobin Jarry return [ 35*d94ebd62SRobin Jarry (MEM_TOTAL, sum(end - start for (start, end) in zones.items()), {}), 36*d94ebd62SRobin Jarry (MEM_USED, max(0, used), {}), 37*d94ebd62SRobin Jarry ] 38