Add system monitoring script.
This commit is contained in:
parent
331e79a838
commit
0569dd62da
1 changed files with 158 additions and 0 deletions
158
monitoring.py
Executable file
158
monitoring.py
Executable file
|
@ -0,0 +1,158 @@
|
||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import requests
|
||||||
|
import psutil
|
||||||
|
import time
|
||||||
|
|
||||||
|
|
||||||
|
# CPU usage threshold in percent
|
||||||
|
CPU_THRESHOLD = 30
|
||||||
|
# Memory usage threshold in GB
|
||||||
|
MEMORY_THRESHOLD = 3
|
||||||
|
# Disk usage threshold in GB
|
||||||
|
DISK_LOCAL_THRESHOLD = 30
|
||||||
|
DISK_SMB_THRESHOLD = 200
|
||||||
|
|
||||||
|
# Time in seconds between each check
|
||||||
|
MONITORING_INTERVAL = 30
|
||||||
|
|
||||||
|
# Discord Webhook URL
|
||||||
|
WEBHOOK_URL = os.environ["WEBHOOK_URL"]
|
||||||
|
# Minimum delay in seconds between alerts for a resource
|
||||||
|
WEBHOOK_INTERVAL = 600
|
||||||
|
|
||||||
|
|
||||||
|
def send_webhook(title, description):
|
||||||
|
print(f'Sending Webhook with title "{title}".')
|
||||||
|
data = {
|
||||||
|
"username": "System Monitoring",
|
||||||
|
"embeds": [
|
||||||
|
{
|
||||||
|
"title": title,
|
||||||
|
"description": description,
|
||||||
|
"timestamp": datetime.datetime.now(datetime.UTC).isoformat(),
|
||||||
|
}
|
||||||
|
],
|
||||||
|
}
|
||||||
|
requests.post(
|
||||||
|
WEBHOOK_URL, data=json.dumps(data), headers={"Content-Type": "application/json"}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def check_cpu():
|
||||||
|
cpu_percent = psutil.cpu_percent(interval=None)
|
||||||
|
|
||||||
|
if (
|
||||||
|
round(cpu_percent) > CPU_THRESHOLD
|
||||||
|
and (time.time() - check_cpu.last_alert) > WEBHOOK_INTERVAL
|
||||||
|
):
|
||||||
|
check_cpu.last_alert = time.time()
|
||||||
|
send_webhook(
|
||||||
|
"CPU Usage Alert",
|
||||||
|
f"Average CPU usage over last {MONITORING_INTERVAL} seconds is past threshold of {CPU_THRESHOLD}%.\nCurrent usage: {cpu_percent}%.",
|
||||||
|
)
|
||||||
|
|
||||||
|
return f"{cpu_percent}%"
|
||||||
|
|
||||||
|
|
||||||
|
check_cpu.last_alert = 0
|
||||||
|
|
||||||
|
|
||||||
|
def check_memory():
|
||||||
|
memory_info = psutil.virtual_memory()
|
||||||
|
|
||||||
|
memory_used_bytes = memory_info.used
|
||||||
|
memory_total_bytes = memory_info.total
|
||||||
|
|
||||||
|
memory_used_gb = round(memory_used_bytes / (1024 * 1024 * 1024), 2)
|
||||||
|
memory_total_gb = round(memory_total_bytes / (1024 * 1024 * 1024), 2)
|
||||||
|
|
||||||
|
if (
|
||||||
|
memory_used_gb > MEMORY_THRESHOLD
|
||||||
|
and (time.time() - check_memory.last_alert) > WEBHOOK_INTERVAL
|
||||||
|
):
|
||||||
|
check_memory.last_alert = time.time()
|
||||||
|
send_webhook(
|
||||||
|
"Memory Usage Alert",
|
||||||
|
f"Memory usage is past threshold of {MEMORY_THRESHOLD} GB.\nCurrent usage: {memory_used_gb} GB / {memory_total_gb} GB.",
|
||||||
|
)
|
||||||
|
|
||||||
|
return f"{memory_used_gb} GB / {memory_total_gb} GB"
|
||||||
|
|
||||||
|
|
||||||
|
check_memory.last_alert = 0
|
||||||
|
|
||||||
|
|
||||||
|
def check_local_disk():
|
||||||
|
disk_info = psutil.disk_usage("/")
|
||||||
|
|
||||||
|
disk_used_bytes = disk_info.used
|
||||||
|
disk_total_bytes = disk_info.total
|
||||||
|
|
||||||
|
disk_used_gb = round(disk_used_bytes / (1024 * 1024 * 1024), 2)
|
||||||
|
disk_total_gb = round(disk_total_bytes / (1024 * 1024 * 1024), 2)
|
||||||
|
|
||||||
|
if (
|
||||||
|
disk_used_gb > DISK_LOCAL_THRESHOLD
|
||||||
|
and (time.time() - check_local_disk.last_alert) > WEBHOOK_INTERVAL
|
||||||
|
):
|
||||||
|
check_local_disk.last_alert = time.time()
|
||||||
|
send_webhook(
|
||||||
|
"Local Disk Usage Alert",
|
||||||
|
f"Local disk used space is past threshold of {DISK_LOCAL_THRESHOLD} GB.\nCurrent used space: {disk_used_gb} GB / {disk_total_gb} GB.",
|
||||||
|
)
|
||||||
|
|
||||||
|
return f"{disk_used_gb} GB / {disk_total_gb} GB"
|
||||||
|
|
||||||
|
|
||||||
|
check_local_disk.last_alert = 0
|
||||||
|
|
||||||
|
|
||||||
|
def check_smb_disk():
|
||||||
|
disk_info = psutil.disk_usage("/mnt/storagebox")
|
||||||
|
|
||||||
|
disk_used_bytes = disk_info.used
|
||||||
|
disk_total_bytes = disk_info.total
|
||||||
|
|
||||||
|
disk_used_gb = round(disk_used_bytes / (1024 * 1024 * 1024), 2)
|
||||||
|
disk_total_gb = round(disk_total_bytes / (1024 * 1024 * 1024), 2)
|
||||||
|
|
||||||
|
if (
|
||||||
|
disk_used_gb > DISK_SMB_THRESHOLD
|
||||||
|
and (time.time() - check_smb_disk.last_alert) > WEBHOOK_INTERVAL
|
||||||
|
):
|
||||||
|
check_smb_disk.last_alert = time.time()
|
||||||
|
send_webhook(
|
||||||
|
"SMB Disk Usage Alert",
|
||||||
|
f"SMB disk used space is past threshold of {DISK_SMB_THRESHOLD} GB.\nCurrent used space: {disk_used_gb} GB / {disk_total_gb} GB.",
|
||||||
|
)
|
||||||
|
|
||||||
|
return f"{disk_used_gb} GB / {disk_total_gb} GB"
|
||||||
|
|
||||||
|
|
||||||
|
check_smb_disk.last_alert = 0
|
||||||
|
|
||||||
|
|
||||||
|
def monitor():
|
||||||
|
print(f"Refreshing every {MONITORING_INTERVAL} seconds.")
|
||||||
|
|
||||||
|
while True:
|
||||||
|
cpu_usage = check_cpu()
|
||||||
|
memory_usage = check_memory()
|
||||||
|
disk_local_usage = check_local_disk()
|
||||||
|
disk_smb_usage = check_smb_disk()
|
||||||
|
|
||||||
|
print(
|
||||||
|
f"CPU usage: {cpu_usage}, Memory usage: {memory_usage}, Disk usage: Local = {disk_local_usage}, SMB = {disk_smb_usage}\r",
|
||||||
|
end="\r",
|
||||||
|
)
|
||||||
|
|
||||||
|
time.sleep(MONITORING_INTERVAL)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
monitor()
|
||||||
|
|
Loading…
Reference in a new issue