monitor server

This commit is contained in:
SonTV 2023-04-18 11:58:13 +07:00
parent 2149a1e198
commit 2b724c0579
2 changed files with 193 additions and 0 deletions

3
hosts.txt Normal file
View File

@ -0,0 +1,3 @@
ubuntu
ubuntu1
ubuntu2

190
run_monitor.py Normal file
View File

@ -0,0 +1,190 @@
import os
import re
from time import sleep
from datetime import datetime
import time
import requests
import json
import schedule
from paho.mqtt import client as mqtt_client
import random
broker = 'broker.beetai.com'
port = 21883
topic = "v1/servers/server_test/telemetry"
client_id = f'python-mqtt-{random.randint(0, 1000)}'
name_server = 'Server Richy'
service = 'docker'
now = datetime.now()
def connect_mqtt():
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT Broker!")
else:
print("Failed to connect, return code %d\n", rc)
client = mqtt_client.Client(client_id)
# client.username_pw_set(username, password)
client.on_connect = on_connect
client.connect(broker, port)
return client
def publish(client):
while True:
memory, memory_usage, swap_usage = get_memory()
cpu_usage = get_cpu()
mac_address = get_mac_address()
boot_storage, boot_storage_usage = get_disk()
storage, storage_usage = get_storage()
ip_private, ip_public = get_IP()
uptime = get_uptime()
service_state = monitor_docker()
time.sleep(5)
params = {
"server_id": "server_test",
"mac_address": mac_address[0],
"cpu_usage": str(cpu_usage),
"memory": str(round(memory/1024/1024, 1 )),
"memory_usage": str(memory_usage),
"boot_storage": boot_storage[0],
"boot_storage_usage": boot_storage_usage,
"storage": storage[0],
"storage_usage": storage_usage,
"ip_private": ip_private[0],
"ip_public": ip_public[0],
"service_state": service_state,
"temperature": "",
"up_time": str(uptime)
}
json_params = json.dumps(params)
print("json_params: ", json_params)
msg = json.dumps(params)
result = client.publish(topic, msg)
# result: [0, 1]
status = result[0]
if status == 0:
print(f"Send `{msg}` to topic `{topic}`")
else:
print(f"Failed to send message to topic {topic}")
def run():
client = connect_mqtt()
client.loop_start()
publish(client)
def get_mac_address():
mac_address = os.popen('cat /sys/class/net/enp2s0/address').read().split('\n')
return mac_address
def get_IP():
ip_private = os.popen('hostname -I').read().split(" ")
ip_public = os.popen('wget -qO- http://ipecho.net/plain | xargs echo').read().split('\n')
return ip_private, ip_public
def get_uptime():
output = os.popen('uptime').read().split(" ")
# print("output: ", output)
_uptime = output[3]
# print("_uptime:", _uptime)
uptime_unit = output[4].split(",")
if uptime_unit[0] == 'days':
uptime = int(_uptime) * 24
# print(uptime)
else:
return uptime
return uptime
def check_stt_service():
status = os.popen('sudo service' + ' ' + service + ' ' + 'status | grep running | wc -l')
stt = status.read()
return stt
def monitor_docker():
lines = readfile()
status_service = check_stt_service().split("\n")[0]
print('Service docker status = ' + status_service)
service_state=[]
if status_service == '1':
for line in lines:
print(line.strip())
l = line.strip().split('_')
lts = ''.join([str(e) for e in l])
try:
o = os.popen('sudo docker inspect' + ' ' + line.strip())
data = json.loads(o.read())
try:
stt = data[0]['State']['Health']['Status']
if stt == 'healthy':
print('docker inspect service ' + line.strip() + ' = ' + stt)
pass
else:
print('docker inspect service ' + line.strip() + ' = ' + stt)
service_state.append(line.strip() + ':' + stt)
except:
stt = data[0]['State']['Status']
if stt == 'running':
print(stt)
pass
else:
print('docker inspect service ' + line.strip() + ' = ' + stt)
service_state.append(line.strip() + ':' + stt)
except:
print('Do not inspect service ' + line.strip())
service_state.append(line.strip() + ':' + stt)
else:
print(status_service)
# print(', '.join(service_state))
return ', '.join(service_state)
def get_memory():
cmd = 'cat /proc/meminfo'
i = os.popen(cmd).read()
mem = i.split()
memTotal = float(mem[1])
memAvailable = float(mem[7])
memUsed = round((memTotal - memAvailable) * 100 / memTotal)
swapTotal = float(mem[43])
swapFree = float(mem[46])
swapUsed = round((swapTotal-swapFree) * 100 /swapTotal)
return memTotal ,memUsed, swapUsed
def get_cpu():
t = time.localtime()
dtime = (str(t.tm_hour) + ':' + str(t.tm_min) + ':' + str(t.tm_sec) + ' ' + str(t.tm_mday) + '/' + str(t.tm_mon) + '/' + str(t.tm_year))
cmd = 'grep "cpu " /proc/stat'
output = os.popen(cmd)
cpu = output.read().strip().split(' ')
user = float(cpu[2])
system = float(cpu[4])
idle = float(cpu[5])
cpu_used = round((user + system)*100 / (user + system + idle), 1)
return cpu_used
def get_disk():
cmd = 'df -h | grep /dev/sda5'
output = os.popen(cmd).read().split(" ")
# print("output: ", output)
d_used = output[13].split("%")
# print("d_used: ", d_used)
boot_storage = output[7].split("G")
boot_storage_usage = d_used[0]
return boot_storage, boot_storage_usage
def get_storage():
cmd = 'df -h | grep /dev/sda5'
output = os.popen(cmd).read().split(" ")
d_used = output[13].split("%")
storage = output[7].split("G")
storage_usage = d_used[0]
return storage, storage_usage
def readfile():
try:
file = open('hosts.txt', 'r')
Lines = file.readlines()
return Lines
finally:
file.close()
if __name__ == '__main__':
run()