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