Клиент
Я бы начал с того, чтобы несколько упростить этот код:
import psutil
STATS_URL = 'http://localhost:5000/'
SERVER_NAME="test_local_server"
def get_health():
print('generating health report')
cpu_percent = psutil.cpu_percent(interval=2.0)
cpu_times = psutil.cpu_times()
disk_usage = psutil.disk_usage("/")
net_io_counters = psutil.net_io_counters()
virtual_memory = psutil.virtual_memory()
# The keys in this dict should match the db cols
report = dict (
sever_name = SERVER_NAME
ctime = cpu_times.__str__(),
disk_usages = disk_usage.__str__(),
net = net_io_counters.__str__(),
mem = virtual_memory.__str__(),
cpupercent = cpu_percent,
cpu_total = cpu_times.user + cpu_times.system,
bytes_sent = net_io_counters.bytes_sent,
bytes_received = net_io_counters.bytes_recv,
packets_sent = net_io_counters.packets_sent,
packets_received = net_io_counters.packets_recv,
memory_Free = virtual_memory.free,
)
return report
Эта get_health
функция создает и возвращает report
словарь. Обратите внимание, что для некоторых возвращаемых значений из функций psutil
я использовал встроенный метод __str__
. Это гарантирует, что дружественный тип будет вставлен в базу данных.
Если вы хотите проверить типы самостоятельно, вы можете сделать что-то вроде:
for item in report:
print (item, type(report[item]), report[item])
Далее запустите эту функцию в al oop, с желаемой задержкой между запросами:
if __name__=='__main__':
import time
import requests
print(f'starting health report stream for server :\t{SERVER_NAME}')
while True:
report = get_health()
r = requests.post(STATS_URL, json=report)
print (r, r.json())
time.sleep(1)
Обратите внимание, что для аргумента json
используется значение request.post
, которое автоматически устанавливает правильный тип содержимого, который Flask 'request.get_json
функция ожидает.
Сервер
Это довольно легко получить:
from flask import Flask, request
app = Flask(__name__)
@app.route('/', methods=['POST'])
def index():
incoming_report = request.get_json()
add_to_db(incoming_report) # We'll build this in a sec.
return {'message': 'success'}
Теперь вы можете работать с incoming_report
, который является словарем.
Это также отправляет сообщение об успехе обратно клиенту, поэтому на клиенте вы увидите выход:
starting health report stream for server : test_local_server
generating health report
<Response [200]> {'message': 'success'}
# Repeats until killed
База данных
, и мне нужно передать значения словарь в столбцы, которые являются ключами словаря в моей базе данных
Теперь, когда у вас есть словарь incoming_report
, будет легко добавить его в вашу базу данных, если вы используете ORM.
Что-то вроде этот ответ Шоу Я позволю вам просто распаковать этот словарь. Таким образом, предполагая, что ваша модель называется Report
, вы можете просто сделать что-то вроде:
def add_to_db(d):
report = Report(**d)
db.session.add(report)
db.session.commit()
Обратите внимание, что это может использовать некоторую проверку и аутентификацию, если ваше развертывание требует этого.