xref: /dpdk/usertools/telemetry-endpoints/cpu.py (revision d94ebd627a86dfbc0ccf8d7d3802196c55d826cf)
1*d94ebd62SRobin Jarry# SPDX-License-Identifier: BSD-3-Clause
2*d94ebd62SRobin Jarry# Copyright (c) 2023 Robin Jarry
3*d94ebd62SRobin Jarry
4*d94ebd62SRobin JarryCPU_TOTAL = "total_cycles"
5*d94ebd62SRobin JarryCPU_BUSY = "busy_cycles"
6*d94ebd62SRobin Jarry
7*d94ebd62SRobin Jarry
8*d94ebd62SRobin Jarrydef info() -> "dict[Name, tuple[Description, Type]]":
9*d94ebd62SRobin Jarry    return {
10*d94ebd62SRobin Jarry        CPU_TOTAL: ("Total number of CPU cycles.", "counter"),
11*d94ebd62SRobin Jarry        CPU_BUSY: ("Number of busy CPU cycles.", "counter"),
12*d94ebd62SRobin Jarry    }
13*d94ebd62SRobin Jarry
14*d94ebd62SRobin Jarry
15*d94ebd62SRobin Jarrydef metrics(sock: "TelemetrySocket") -> "list[tuple[Name, Value, Labels]]":
16*d94ebd62SRobin Jarry    out = []
17*d94ebd62SRobin Jarry    for lcore_id in sock.cmd("/eal/lcore/list"):
18*d94ebd62SRobin Jarry        lcore = sock.cmd("/eal/lcore/info", lcore_id)
19*d94ebd62SRobin Jarry        cpu = ",".join(str(c) for c in lcore.get("cpuset", []))
20*d94ebd62SRobin Jarry        total = lcore.get("total_cycles")
21*d94ebd62SRobin Jarry        busy = lcore.get("busy_cycles", 0)
22*d94ebd62SRobin Jarry        if not (cpu and total):
23*d94ebd62SRobin Jarry            continue
24*d94ebd62SRobin Jarry        labels = {"cpu": cpu, "numa": lcore.get("socket", 0)}
25*d94ebd62SRobin Jarry        out += [
26*d94ebd62SRobin Jarry            (CPU_TOTAL, total, labels),
27*d94ebd62SRobin Jarry            (CPU_BUSY, busy, labels),
28*d94ebd62SRobin Jarry        ]
29*d94ebd62SRobin Jarry    return out
30