Найти - Пользователи
Полная версия: Мониторинг с вывод сообщения по условию
Начало » Data Mining » Мониторинг с вывод сообщения по условию
1
threediceceelo
Приветствую, столкнулся со следующим вопросом - есть необходимость каждые n минут парсить json api и мониторить состояние хостов. В случае их активности\неактивности выводить соответствующее сообщение. С парсигном разобрался, а вот с правильным выводом сообщений возникли проблемы. Сообщения нужно выводить единожды в случае изменения состояния, а не при каждом прогоне цикла. И если для одного хоста у меня получилось это реализовать, то для перебора нескольких, моих знаний не хватило. Был бы весьма благодарен за помощь в решении вопроса.
 import json
import urllib.request
import time
hostnameList = ['host1','host2','host3']
while True:
    for host in hostnameList:
        apidata = urllib.request.urlopen("http://localhost/jsonapi").read().decode('utf8')
        alive_status = json.loads(apidata)["hosts"][(host)]["alive"]
        if alive_status == True:
            print (str(host) + ' is alive. ')
        else:
            print (str(host) + ' is dead')
    time.sleep(10)

Условия для одного хоста:
 if alive_status == True:
    if aliveMessageStatus == False:
        print ('alive')
        aliveMessageStatus = True
        deadMessageStatus = False
if alive_status == False:
    if deadMessageStatus == False:
        print ('dead')
        deadMessageStatus = True
        aliveMessageStatus = False

py.user.next
threediceceelo
Сообщения нужно выводить единожды в случае изменения состояния, а не при каждом прогоне цикла.
Вот общий шаблон
  
state = 'start'
 
while True:
    if state == 'start':
        do1()
        state = 'continue'
    elif state == 'continue':
        res = do2()
        if res = 1:
            state == 'condition':
    elif state == 'condition':
        res = do3()
        if res = 1:
            state = 'continue'
        else:
            state = 'exit'
    elif state == 'exit':
        break
Это конечный автомат (найдёшь на вики).
threediceceelo
py.user.next, спасибо. Не уверен до конца ли я правильно понял конструкцию и возможно это делается совсем иначе, но что получилось работает, но для одного хоста. Как это прикрутить для мониторинга нескольких пока не понял. А точнее не понято как привязать aliveMessageSent = False и deadMessageSent = False к каждому из хостов.

 import json
import urllib.request
import time
aliveMessageSent = False
deadMessageSent = False
while True:
    apidata = urllib.request.urlopen("http://localhost/jsonapi").read().decode('utf8')
    alive_status = json.loads(apidata)["hosts"]['host1']["alive"]
    if alive_status == True:
        if aliveMessageSent == True:
            state = 'wait'
        else:
            print ('Host is alive.')
            aliveMessageSent = True
            deadMessageSent = False
    elif alive_status == False:
        if deadMessageSent == True:
            state = 'wait'
        else:
            print ('Host is dead.')
            deadMessageSent = True
            aliveMessageSent = False
    elif state == 'wait':
        time.sleep(20)
py.user.next
threediceceelo
Не уверен до конца ли я правильно понял конструкцию
Не, иди на вики и читай до понимания
wiki. пример конечного автомата
wiki. конечный автомат

threediceceelo
Сообщения нужно выводить единожды в случае изменения состояния, а не при каждом прогоне цикла.
Как раз для этого и используются разные состояния конечного автомата. В одном он будет помнить, что что-то изменилось, а в другом - нет. И для этого тебе не хватит флажка. Вот эти флажки, если они и нужны, то они должны проверяться внутри текущего состояния конечного автомата. А вот состояния у него ты уже вводишь такие что “автомат что-то заметил”, “автомат ничего не заметил”, “автомат что-то понял”, “автомат закончил что-то делать и вернулся к прежнему состоянию”. Если у флажка может быть два состояния (true/false) и ты по ним можешь делать одно или другое, то у конечного автомата могут быть тысячи состояний (true/false/true1/false1/true2/false2 и так далее) и в каждом он что-то понимает определённое. Поэтому флажков твоих тут не хватает, а одного конечного автомата хватит на всё и даже больше.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB