162 lines
5.5 KiB
Python
162 lines
5.5 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import psutil
|
|
import time
|
|
from datetime import datetime
|
|
from typing import Dict, Any
|
|
|
|
def collect_metrics() -> Dict[str, Any]:
|
|
"""Collect system metrics and return them in the required format."""
|
|
# Get system metrics
|
|
boot_time = datetime.fromtimestamp(psutil.boot_time())
|
|
load_avg = psutil.getloadavg()
|
|
memory = psutil.virtual_memory()
|
|
swap = psutil.swap_memory()
|
|
cpu_percent = psutil.cpu_percent(interval=1)
|
|
|
|
# Convert bytes to GB
|
|
def to_gb(bytes_value: int) -> float:
|
|
return round(bytes_value / (1024**3), 2)
|
|
|
|
return {
|
|
"version": "1.0",
|
|
"entities": [
|
|
{
|
|
"name": "Last Boot",
|
|
"sensor_id": "last_boot",
|
|
"state_class": "total",
|
|
"device_class": "timestamp",
|
|
"unit_of_measurement": "",
|
|
"value": boot_time.astimezone().isoformat(),
|
|
"icon": "mdi:clock-time-four",
|
|
"attributes": {
|
|
"friendly_name": "Last Boot Time"
|
|
}
|
|
},
|
|
{
|
|
"name": "Load Average (15m)",
|
|
"sensor_id": "load_15m",
|
|
"state_class": "measurement",
|
|
"unit_of_measurement": "",
|
|
"device_class": "power_factor",
|
|
"value": str(round(load_avg[2], 1)),
|
|
"icon": "mdi:gauge",
|
|
"attributes": {
|
|
"friendly_name": "System Load (15m)"
|
|
}
|
|
},
|
|
{
|
|
"name": "Load Average (5m)",
|
|
"sensor_id": "load_5m",
|
|
"state_class": "measurement",
|
|
"unit_of_measurement": "",
|
|
"device_class": "power_factor",
|
|
"value": str(round(load_avg[1], 1)),
|
|
"icon": "mdi:gauge",
|
|
"attributes": {
|
|
"friendly_name": "System Load (5m)"
|
|
}
|
|
},
|
|
{
|
|
"name": "Load Average (1m)",
|
|
"sensor_id": "load_1m",
|
|
"state_class": "measurement",
|
|
"unit_of_measurement": "",
|
|
"device_class": "power_factor",
|
|
"value": str(round(load_avg[0], 1)),
|
|
"icon": "mdi:gauge",
|
|
"attributes": {
|
|
"friendly_name": "System Load (1m)"
|
|
}
|
|
},
|
|
{
|
|
"name": "Memory Free",
|
|
"sensor_id": "memory_free",
|
|
"state_class": "measurement",
|
|
"unit_of_measurement": "GB",
|
|
"device_class": "data_size",
|
|
"value": str(to_gb(memory.available)),
|
|
"icon": "mdi:memory",
|
|
"attributes": {
|
|
"friendly_name": "Available Memory"
|
|
}
|
|
},
|
|
{
|
|
"name": "Memory Used",
|
|
"sensor_id": "memory_used",
|
|
"state_class": "measurement",
|
|
"unit_of_measurement": "GB",
|
|
"device_class": "data_size",
|
|
"value": str(to_gb(memory.used)),
|
|
"icon": "mdi:memory",
|
|
"attributes": {
|
|
"friendly_name": "Used Memory"
|
|
}
|
|
},
|
|
{
|
|
"name": "Memory Usage",
|
|
"sensor_id": "memory_usage",
|
|
"state_class": "measurement",
|
|
"unit_of_measurement": "%",
|
|
"device_class": "power_factor",
|
|
"value": str(memory.percent),
|
|
"icon": "mdi:memory",
|
|
"attributes": {
|
|
"friendly_name": "Memory Usage"
|
|
}
|
|
},
|
|
{
|
|
"name": "CPU Usage",
|
|
"sensor_id": "cpu_usage",
|
|
"state_class": "measurement",
|
|
"unit_of_measurement": "%",
|
|
"device_class": "power_factor",
|
|
"value": str(cpu_percent),
|
|
"icon": "mdi:cpu-64-bit",
|
|
"attributes": {
|
|
"friendly_name": "CPU Usage"
|
|
}
|
|
},
|
|
{
|
|
"name": "Swap Free",
|
|
"sensor_id": "swap_free",
|
|
"state_class": "measurement",
|
|
"unit_of_measurement": "GB",
|
|
"device_class": "data_size",
|
|
"value": str(to_gb(swap.free)),
|
|
"icon": "mdi:harddisk",
|
|
"attributes": {
|
|
"friendly_name": "Free Swap"
|
|
}
|
|
},
|
|
{
|
|
"name": "Swap Used",
|
|
"sensor_id": "swap_used",
|
|
"state_class": "measurement",
|
|
"unit_of_measurement": "GB",
|
|
"device_class": "data_size",
|
|
"value": str(to_gb(swap.used)),
|
|
"icon": "mdi:harddisk",
|
|
"attributes": {
|
|
"friendly_name": "Used Swap"
|
|
}
|
|
},
|
|
{
|
|
"name": "Swap Usage",
|
|
"sensor_id": "swap_usage",
|
|
"state_class": "measurement",
|
|
"unit_of_measurement": "%",
|
|
"device_class": "power_factor",
|
|
"value": str(swap.percent),
|
|
"icon": "mdi:harddisk",
|
|
"attributes": {
|
|
"friendly_name": "Swap Usage"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
|
|
if __name__ == "__main__":
|
|
# Example usage
|
|
metrics = collect_metrics()
|
|
print(metrics) |