Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 14, 2017 12:40:53

threediceceelo
Зарегистрирован: 2017-01-14
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Мониторинг с вывод сообщения по условию

Приветствую, столкнулся со следующим вопросом - есть необходимость каждые 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

Отредактировано threediceceelo (Янв. 14, 2017 12:42:52)

Офлайн

#2 Янв. 14, 2017 13:13:06

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9873
Репутация: +  853  -
Профиль   Отправить e-mail  

Мониторинг с вывод сообщения по условию

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
Это конечный автомат (найдёшь на вики).



Отредактировано py.user.next (Янв. 14, 2017 13:15:10)

Офлайн

#3 Янв. 15, 2017 11:39:45

threediceceelo
Зарегистрирован: 2017-01-14
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Мониторинг с вывод сообщения по условию

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)

Отредактировано threediceceelo (Янв. 15, 2017 11:56:46)

Офлайн

#4 Янв. 15, 2017 14:02:28

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9873
Репутация: +  853  -
Профиль   Отправить e-mail  

Мониторинг с вывод сообщения по условию

threediceceelo
Не уверен до конца ли я правильно понял конструкцию
Не, иди на вики и читай до понимания
wiki. пример конечного автомата
wiki. конечный автомат

threediceceelo
Сообщения нужно выводить единожды в случае изменения состояния, а не при каждом прогоне цикла.
Как раз для этого и используются разные состояния конечного автомата. В одном он будет помнить, что что-то изменилось, а в другом - нет. И для этого тебе не хватит флажка. Вот эти флажки, если они и нужны, то они должны проверяться внутри текущего состояния конечного автомата. А вот состояния у него ты уже вводишь такие что “автомат что-то заметил”, “автомат ничего не заметил”, “автомат что-то понял”, “автомат закончил что-то делать и вернулся к прежнему состоянию”. Если у флажка может быть два состояния (true/false) и ты по ним можешь делать одно или другое, то у конечного автомата могут быть тысячи состояний (true/false/true1/false1/true2/false2 и так далее) и в каждом он что-то понимает определённое. Поэтому флажков твоих тут не хватает, а одного конечного автомата хватит на всё и даже больше.



Отредактировано py.user.next (Янв. 15, 2017 14:04:59)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version