confd: add system resource usage to ietf-system.yang

This commit adds resource usage: memory, loadavg, and filesystem usage
by augmenting ietf-system:/system-state.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
Joachim Wiberg
2025-10-31 13:26:03 +01:00
parent 8b10cce172
commit 08c9c97823
5 changed files with 206 additions and 53 deletions
+69
View File
@@ -292,6 +292,74 @@ def add_clock(out):
clock["current-datetime"] = str(clock_now)
insert(out, "clock", clock)
def add_resource_usage(out):
"""Add system resource usage (memory, load average, filesystem) to system-state"""
resource = {}
# Memory usage
try:
meminfo = HOST.read("/proc/meminfo")
if not meminfo:
return
mem_info = {}
for line in meminfo.splitlines():
parts = line.split(":")
if len(parts) == 2:
key = parts[0].strip()
value = parts[1].strip()
if key in ["MemTotal", "MemFree", "MemAvailable"]:
# Store in KiB (as provided by /proc/meminfo, mislabeled as kB)
mem_info[key] = int(value.split()[0])
if mem_info:
memory = {}
if "MemTotal" in mem_info:
memory["total"] = str(mem_info["MemTotal"])
if "MemFree" in mem_info:
memory["free"] = str(mem_info["MemFree"])
if "MemAvailable" in mem_info:
memory["available"] = str(mem_info["MemAvailable"])
resource["memory"] = memory
except (FileNotFoundError, ValueError):
pass
# Load average
try:
loadavg = HOST.read("/proc/loadavg")
load_parts = loadavg.strip().split()
if len(load_parts) >= 3:
load = {
"load-1min": load_parts[0],
"load-5min": load_parts[1],
"load-15min": load_parts[2]
}
resource["load-average"] = load
except (FileNotFoundError, ValueError):
pass
# Filesystem usage
filesystems = []
for mount in ["/", "/var", "/cfg"]:
try:
result = HOST.run_multiline(["df", "-k", mount], [])
if len(result) > 1:
parts = result[1].split()
if len(parts) >= 4:
filesystems.append({
"mount-point": mount,
"size": str(parts[1]),
"used": str(parts[2]),
"available": str(parts[3])
})
except (subprocess.CalledProcessError, ValueError, IndexError):
pass
if filesystems:
resource["filesystem"] = filesystems
if resource:
insert(out, "infix-system:resource-usage", resource)
def operational():
out = {
"ietf-system:system": {
@@ -310,5 +378,6 @@ def operational():
add_clock(out_state)
add_platform(out_state)
add_services(out_state)
add_resource_usage(out_state)
return out