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