53 Converts metrics to csv and writes them to a file.
56 metrics (list): List of metrics dictionaries.
57 filename (str): Name of the file to write the metrics to.
61 start_time = metrics[0][
"timestamp"]
62 for metric
in metrics:
63 elapsed_time = (metric[
"timestamp"] - start_time).total_seconds()
64 metric[
"time"] = elapsed_time
67 with open(filename,
"w", newline=
"")
as csvfile:
68 fieldnames = metrics[0].keys()
69 writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
71 writer.writerows(metrics)
75 for proc
in psutil.process_iter([
"pid",
"name"]):
77 proc.cpu_percent(interval=
None)
78 except (psutil.NoSuchProcess, psutil.AccessDenied):
83 for proc
in psutil.process_iter([
"pid",
"name"]):
85 cpu = proc.cpu_percent(interval=
None)
86 mem = proc.memory_info().rss / (1024 * 1024)
87 processes.append((cpu, mem, proc.info[
"pid"], proc.info[
"name"]))
88 except (psutil.NoSuchProcess, psutil.AccessDenied):
92 processes.sort(key=
lambda x: x[0], reverse=
True)
94 return processes[:top_n]
116 Callback function that publishes CPU core usage, memory usage and CPU temperature.
121 cpu_core_usage_msg = Float32MultiArray()
122 cpu_core_usage_msg.data = stats[
"cpu_core_usage"]
125 processes_usage_msg = ProcessUsageArray()
126 processes_usage_msg.header.stamp = self.get_clock().now().to_msg()
127 processes_usage_msg.process_usages = []
128 for cpu, mem, pid, name
in processes:
129 process_usage = ProcessUsage()
130 process_usage.header.stamp = processes_usage_msg.header.stamp
131 process_usage.usage = cpu
132 process_usage.memory = mem
133 process_usage.process_name = name
134 processes_usage_msg.process_usages.append(process_usage)
138 memory_msg = Float32()
139 memory_msg.data = stats[
"memory_usage"]
142 temperature_msg = Float32()
143 temperature_msg.data = stats[
"cpu_temperature"]
147 "timestamp": datetime.datetime.now(),
148 "memory_usage": stats[
"memory_usage"],
149 "cpu_temperature": stats[
"cpu_temperature"],
153 metrics[f
"cpu_core_{i+1}_usage"] = (
154 stats[
"cpu_core_usage"][i]
if i < len(stats[
"cpu_core_usage"])
else 0