monitor server
This commit is contained in:
parent
2149a1e198
commit
2b724c0579
190
run_monitor.py
Normal file
190
run_monitor.py
Normal 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()
|
Loading…
Reference in New Issue
Block a user