Заметил что маркетинговый отдел любого хостера — более переживает за качество услуги, чем IT-отдел! И даже отвечают в Twitter’е и даже там же обещают что-то улучшить… Это с одной стороны, а с другой когда мой сайт лежит, не понять как это случилось и когда — лезу в Twitter пытаюсь понять — это метеорит упал на M9 или кривые руки опять! Так что решил помочь себе и маркетологам сделать автоматическое информирование сразу в Twitter когда сайт умирает. Буду делать на Node-Red это adult аналог Scratch! Картинка для лучшего понимания:
Отталкивался буду от этой замечательно статьи dev.to/webhookrelay/creating-your-own-health-check-monitor-with-node-red-51fn, но сделал почти все по другому!
Node-Red у меня запушен, вам его тоже надо поставить вот хотябы как тут в начале описано IoT по-взрослому: на ESP8266 по MQTT через Mosquitto в Node-RED!. Запускать его буду на Orange Pi Plus
Сразу выкатываю готовое решение, опрашиваем сайт, если он 5 минут отвечает ошибкой, твитем и наоброт!
Картинка надеюсь понятнее:
Код
[{"id":"3de70177.6f5dce","type":"tab","label":"Flow 2","disabled":false,"info":""},{"id":"c38790b7.a3975","type":"inject","z":"3de70177.6f5dce","name":"1 min","topic":"","payload":"","payloadType":"date","repeat":"60","crontab":"","once":false,"onceDelay":0.1,"x":170,"y":600,"wires":[["3f78434e.8b637c"]]},{"id":"3f78434e.8b637c","type":"http request","z":"3de70177.6f5dce","name":"itcooky.com","method":"GET","ret":"txt","url":"https://itcooky.com/test.html","tls":"","x":330,"y":600,"wires":[["ceebbb5c.62eaf8","f87f78c5.18fa88"]]},{"id":"ceebbb5c.62eaf8","type":"switch","z":"3de70177.6f5dce","name":"not 200 respons","property":"statusCode","propertyType":"msg","rules":[{"t":"neq","v":"200","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":500,"y":620,"wires":[["ea702142.5db75"]]},{"id":"f87f78c5.18fa88","type":"switch","z":"3de70177.6f5dce","name":"found word on web","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"good","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":510,"y":580,"wires":[["178958c1.6fbce7"]]},{"id":"93035dbe.000c6","type":"function","z":"3de70177.6f5dce","name":"web up","func":"\nreturn {\n payload: ` ${msg.responseUrl} its OK`\n}","outputs":1,"noerr":0,"x":1080,"y":500,"wires":[["d01ee6d3.843018"]]},{"id":"330afeba.4f7082","type":"function","z":"3de70177.6f5dce","name":"web down","func":"\nreturn {\n payload: ` ${msg.responseUrl} it is DOWN at`\n}","outputs":1,"noerr":0,"x":1080,"y":700,"wires":[["c245ac03.ce738"]]},{"id":"454d2f34.514b8","type":"inject","z":"3de70177.6f5dce","name":"","topic":"","payload":"","payloadType":"date","repeat":"1","crontab":"","once":false,"onceDelay":0.1,"x":190,"y":380,"wires":[["fed3dc57.4834b"]]},{"id":"fed3dc57.4834b","type":"moment","z":"3de70177.6f5dce","name":"","topic":"","input":"","inputType":"msg","inTz":"Europe/Moscow","adjAmount":"0","adjType":"hours","adjDir":"add","format":"date","locale":"en_US","output":"time","outputType":"flow","outTz":"Europe/Moscow","x":380,"y":380,"wires":[[]]},{"id":"3b35c8fb.f5e9d8","type":"file","z":"3de70177.6f5dce","name":"Write www.log","filename":"/root/iot_data/www.log","appendNewline":true,"createDir":false,"overwriteFile":"false","x":1540,"y":580,"wires":[[]]},{"id":"f3cb04e1.0ca058","type":"function","z":"3de70177.6f5dce","name":"Add time to data","func":"var timenow=flow.get('time');\nmsg.payload = msg.payload + ' ' + timenow + ' #itcookycomstatus';\nreturn msg;","outputs":1,"noerr":0,"x":1340,"y":600,"wires":[["3b35c8fb.f5e9d8","e208bc85.2ac83"]]},{"id":"d01ee6d3.843018","type":"trigger","z":"3de70177.6f5dce","op1":"","op2":"","op1type":"pay","op2type":"pay","duration":"0","extend":true,"units":"min","reset":"reset","bytopic":"all","name":"","x":1300,"y":500,"wires":[["f3cb04e1.0ca058"]]},{"id":"c245ac03.ce738","type":"trigger","z":"3de70177.6f5dce","op1":"","op2":"","op1type":"pay","op2type":"pay","duration":"0","extend":true,"units":"min","reset":"reset","bytopic":"all","name":"","x":1300,"y":700,"wires":[["f3cb04e1.0ca058"]]},{"id":"707304cf.d7390c","type":"function","z":"3de70177.6f5dce","name":"send reset","func":"\nreturn {\n payload: `reset`\n}","outputs":1,"noerr":0,"x":1090,"y":620,"wires":[["d01ee6d3.843018"]]},{"id":"a8927f54.37138","type":"function","z":"3de70177.6f5dce","name":"send reset","func":"\nreturn {\n payload: `reset`\n}","outputs":1,"noerr":0,"x":1090,"y":560,"wires":[["c245ac03.ce738"]]},{"id":"ea702142.5db75","type":"counter","z":"3de70177.6f5dce","name":"count to 10","init":"0","step":"1","lower":"0","upper":"10","mode":"increment","outputs":1,"x":630,"y":740,"wires":[["4a9cb8c8.819ab8"]]},{"id":"ae37990e.ebade8","type":"switch","z":"3de70177.6f5dce","name":"if its 5","property":"count","propertyType":"msg","rules":[{"t":"eq","v":"5","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":930,"y":740,"wires":[["330afeba.4f7082","707304cf.d7390c"]]},{"id":"d9fd593b.9b8998","type":"function","z":"3de70177.6f5dce","name":"reset counter","func":"msg.reset = true; return msg","outputs":1,"noerr":0,"x":830,"y":520,"wires":[["ea702142.5db75"]]},{"id":"178958c1.6fbce7","type":"counter","z":"3de70177.6f5dce","name":"count to 10","init":"0","step":"1","lower":"0","upper":"10","mode":"increment","outputs":1,"x":610,"y":460,"wires":[["173d5018.b4d1d"]]},{"id":"88d5dc8d.ba9eb","type":"function","z":"3de70177.6f5dce","name":"reset counter","func":"msg.reset = true; return msg","outputs":1,"noerr":0,"x":790,"y":660,"wires":[["178958c1.6fbce7"]]},{"id":"3252995a.ea5296","type":"switch","z":"3de70177.6f5dce","name":"if its 5","property":"count","propertyType":"msg","rules":[{"t":"eq","v":"5","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":930,"y":460,"wires":[["93035dbe.000c6","a8927f54.37138"]]},{"id":"173d5018.b4d1d","type":"switch","z":"3de70177.6f5dce","name":"it its > 0","property":"count","propertyType":"msg","rules":[{"t":"gt","v":"0","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":780,"y":460,"wires":[["d9fd593b.9b8998","3252995a.ea5296"]]},{"id":"4a9cb8c8.819ab8","type":"switch","z":"3de70177.6f5dce","name":"it its > 0","property":"count","propertyType":"msg","rules":[{"t":"gt","v":"0","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":780,"y":740,"wires":[["ae37990e.ebade8","88d5dc8d.ba9eb"]]},{"id":"e208bc85.2ac83","type":"twitter out","z":"3de70177.6f5dce","name":"Tweet","x":1510,"y":620,"wires":[]}]
Кирпичи 0
Они формируют переменную с временем. Кирпич слева пинает кирпич справа каждую секунду.
Второй кирпич накладывает формат данных и засовывает его в глобального для этого потока переменную flow.time — она всплывет в кирпиче 7
Осторожно это не стандартный кирпич moment по-моему я его ставил отдельно
Кирпич 1
Слева перед ним стоит кирпич который пинает его каждую минут! Для изменения интервала меняйте every
Это кирпич http он тут(когда его кирпич слева пинает) запрашивает https://itcooky.com/test.html и передает дальше ответ
Кирпичи 2
Это кирпичи switch они пропускают дальше поток при подходящем условии
Нижний кирпич not 200 respons срабатывает если ответ на запрос страницы пришел без кода 200(все ОК)
Верхний кирпич ищет на странице слово good если оно есть значит это именно моя страница а не заглушка например
Кирпичи 3
Это не стандартный кирпич counter eго надо ставить отдельно. Тут он считает от 0 до 10, и получает от кирпича 5 сигнал сбросить счет в ноль! Каждый раз увеличивая щнаечние он посылает это значение дальше и одновременно обнуляет соседний счетчки чтобы если статус изменится он считал с нуля.
Кирпичи 3.1
Этот кирпич предотврашает зацикливание, елси обнулят счетчики без него то счетчкики начинают обнулять другдруга в лупе(loop)!
Кирпичи 4
Это обычный switch срабатывает когда счетчик передают ему 5-ку. После этого считается что сработал сигнал сайт не работает(или работает) при этом — передается сообщение об этом дальше и обнуляется тригер вариантс работает(или неработает) чтобы
он был готов сработать при изменения статус, при поучении подряд 5 сообщений о том что сайт не работает
Кирпичи 5
Это кирпич function он формирует сообщение которе в состояние обнулить счетчик
Кирпичи 6
Это просто function которая собирает текст сообщения, чтобы передать дальше
Кирпичи 7
Это чудесный кирпич, он тоже просто формирует текст и посылает слово reset когда срабатывает один из кирпичей 4. Это важно потому что дальше кирпич 8 это trigger который тут срабатывает так — пропускает первое сообщение и блокирует все следующие пока на него не приходит сигнал отмены reset. Это нужно для того чтобы — поменялся статус сайта одно сообщение об этом ушло в твиттер, триггер заблокировался и больше не пропускает через себя такие сообщения — потом статус опять поменялся и вместе с новым текстом на предыдущий триггер ушел сигнал о разблокировки триггера. Это позволяет не посылать кучу одинаковых сообщений и выдерживать 5 сообщений для изменения статуса.
Кирпичи 8
Это они trigger‘ы, описанные выше
Кстати сработавший триггер помечается, сейчас на фото на рядом с верхним триггером маленький синий квадратик
Кирпичи 9
Это тоже просто function формирует текст берет пришедшее сообщение msg.payload и добавляет время — переменную flow.time и еще какого-то текста в »
Кирпичи 10
Этот кирпич пишет сообщения, которые до него доходят в файл www.log
Кирпичи 11
Это кирпич твитит. В настройках у него там четыре API ключа — взял теже что и для Twiter через WordPress видимо каждый раз отдельный не нужен!
После нажатия Deploy, все начинает работать. Симулирую нужные условиея удалением файла test.html и его воостанавлением с текстом good — работает!
UPDATE: Улучшаем мониторинг, избавляемся от лишних сообщений!
Проходят лишние сообщения:
— при первом запуске проходят сообщения — сайт работает
— если у сервера с системой монимторинга проблемы с интернетом, то после их исчезновения тоже проходит сообщение — сайт работает
Добавляю в схему пару кирпичей
Схема текстом:
[{"id":"5ae667a8.990c28","type":"tab","label":"Flow 3","disabled":false,"info":""},{"id":"d86f0b01.fc1078","type":"inject","z":"5ae667a8.990c28","name":"1 min","topic":"","payload":"","payloadType":"date","repeat":"60","crontab":"","once":false,"onceDelay":0.1,"x":270,"y":820,"wires":[["b992cd67.2391f"]]},{"id":"9a8d7311.e507a","type":"http request","z":"5ae667a8.990c28","name":"itcooky.com","method":"GET","ret":"txt","url":"https://itcooky.com","tls":"","x":430,"y":900,"wires":[["925113a1.d444b","2f4d784f.f2ebe8"]]},{"id":"925113a1.d444b","type":"switch","z":"5ae667a8.990c28","name":"not 200 respons","property":"statusCode","propertyType":"msg","rules":[{"t":"neq","v":"200","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":600,"y":920,"wires":[["9cd19e03.225d6"]]},{"id":"2f4d784f.f2ebe8","type":"switch","z":"5ae667a8.990c28","name":"found word on web","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"ca-pub-8951271257139515","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":610,"y":880,"wires":[["436faffb.4b885"]]},{"id":"d46f96d3.12d7d8","type":"function","z":"5ae667a8.990c28","name":"web up","func":"\nreturn {\n payload: ` ${msg.responseUrl} its OK`\n}","outputs":1,"noerr":0,"x":1180,"y":800,"wires":[["efb7ffad.fda06"]]},{"id":"be5c108b.3eab5","type":"function","z":"5ae667a8.990c28","name":"web down","func":"\nreturn {\n payload: ` ${msg.responseUrl} it is DOWN at`\n}","outputs":1,"noerr":0,"x":1180,"y":1000,"wires":[["9267dbd8.407258"]]},{"id":"1a284ae1.1dcac5","type":"inject","z":"5ae667a8.990c28","name":"","topic":"","payload":"","payloadType":"date","repeat":"1","crontab":"","once":false,"onceDelay":0.1,"x":290,"y":680,"wires":[["f7482ea6.8105b"]]},{"id":"f7482ea6.8105b","type":"moment","z":"5ae667a8.990c28","name":"","topic":"","input":"","inputType":"msg","inTz":"Europe/Moscow","adjAmount":"0","adjType":"hours","adjDir":"add","format":"date","locale":"en_US","output":"time","outputType":"flow","outTz":"Europe/Moscow","x":480,"y":680,"wires":[[]]},{"id":"af783a84.80d858","type":"file","z":"5ae667a8.990c28","name":"Write www.log","filename":"/root/iot_data/www.log","appendNewline":true,"createDir":false,"overwriteFile":"false","x":1660,"y":820,"wires":[[]]},{"id":"9639759c.7c6198","type":"function","z":"5ae667a8.990c28","name":"Add time to data","func":"var timenow=flow.get('time');\nmsg.payload = msg.payload + ' ' + timenow + ' #itcookycomstatus #RUVDS https://itcooky.com/?p=5624';\nreturn msg;","outputs":1,"noerr":0,"x":1700,"y":900,"wires":[["af783a84.80d858","3957fc42.0c4ab4"]]},{"id":"efb7ffad.fda06","type":"trigger","z":"5ae667a8.990c28","op1":"","op2":"","op1type":"pay","op2type":"pay","duration":"0","extend":true,"units":"min","reset":"reset","bytopic":"all","name":"","x":1400,"y":800,"wires":[["3579b0a7.3e3bf"]]},{"id":"9267dbd8.407258","type":"trigger","z":"5ae667a8.990c28","op1":"","op2":"","op1type":"pay","op2type":"pay","duration":"0","extend":true,"units":"min","reset":"reset","bytopic":"all","name":"","x":1400,"y":1000,"wires":[["3579b0a7.3e3bf"]]},{"id":"dba48d4d.0d8b6","type":"function","z":"5ae667a8.990c28","name":"send reset","func":"\nreturn {\n payload: `reset`\n}","outputs":1,"noerr":0,"x":1190,"y":920,"wires":[["efb7ffad.fda06"]]},{"id":"462aca20.8d45d4","type":"function","z":"5ae667a8.990c28","name":"send reset","func":"\nreturn {\n payload: `reset`\n}","outputs":1,"noerr":0,"x":1190,"y":860,"wires":[["9267dbd8.407258"]]},{"id":"9cd19e03.225d6","type":"counter","z":"5ae667a8.990c28","name":"count to 10","init":"0","step":"1","lower":"0","upper":"10","mode":"increment","outputs":1,"x":730,"y":1040,"wires":[["3ca7e769.d56e28"]]},{"id":"8bf834a2.7a2388","type":"switch","z":"5ae667a8.990c28","name":"if its 5","property":"count","propertyType":"msg","rules":[{"t":"eq","v":"5","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":1030,"y":1040,"wires":[["be5c108b.3eab5","dba48d4d.0d8b6"]]},{"id":"35d0b846.bc61e8","type":"function","z":"5ae667a8.990c28","name":"reset counter","func":"msg.reset = true; return msg","outputs":1,"noerr":0,"x":930,"y":820,"wires":[["9cd19e03.225d6"]]},{"id":"436faffb.4b885","type":"counter","z":"5ae667a8.990c28","name":"count to 10","init":"0","step":"1","lower":"0","upper":"10","mode":"increment","outputs":1,"x":710,"y":760,"wires":[["748e6fa9.a3619"]]},{"id":"5ca50054.d7b44","type":"function","z":"5ae667a8.990c28","name":"reset counter","func":"msg.reset = true; return msg","outputs":1,"noerr":0,"x":890,"y":960,"wires":[["436faffb.4b885"]]},{"id":"fca0c7c6.d82e68","type":"switch","z":"5ae667a8.990c28","name":"if its 5","property":"count","propertyType":"msg","rules":[{"t":"eq","v":"5","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":1030,"y":760,"wires":[["d46f96d3.12d7d8","462aca20.8d45d4"]]},{"id":"748e6fa9.a3619","type":"switch","z":"5ae667a8.990c28","name":"it its > 0","property":"count","propertyType":"msg","rules":[{"t":"gt","v":"0","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":880,"y":760,"wires":[["35d0b846.bc61e8","fca0c7c6.d82e68"]]},{"id":"3ca7e769.d56e28","type":"switch","z":"5ae667a8.990c28","name":"it its > 0","property":"count","propertyType":"msg","rules":[{"t":"gt","v":"0","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":880,"y":1040,"wires":[["8bf834a2.7a2388","5ca50054.d7b44"]]},{"id":"2cb243e5.13928c","type":"inject","z":"5ae667a8.990c28","name":"","topic":"","payload":"Started!","payloadType":"str","repeat":"","crontab":"","once":true,"onceDelay":"","x":280,"y":540,"wires":[["efb7ffad.fda06"]]},{"id":"3579b0a7.3e3bf","type":"switch","z":"5ae667a8.990c28","name":"not a on start web up message","property":"payload","propertyType":"msg","rules":[{"t":"neq","v":"Started!","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":1470,"y":900,"wires":[["9639759c.7c6198"]]},{"id":"b992cd67.2391f","type":"http request","z":"5ae667a8.990c28","name":"google.com","method":"GET","ret":"txt","url":"https://www.google.com/","tls":"","x":310,"y":1020,"wires":[["2e2214d1.0eda6c"]]},{"id":"2e2214d1.0eda6c","type":"switch","z":"5ae667a8.990c28","name":"Check if my Internet is up","property":"statusCode","propertyType":"msg","rules":[{"t":"eq","v":"200","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":330,"y":1080,"wires":[["9a8d7311.e507a"]]},{"id":"3957fc42.0c4ab4","type":"twitter out","z":"5ae667a8.990c28","name":"Tweet","x":1700,"y":1000,"wires":[]}]
В этой схеме я запрашиваю сайт, а не конкретный файл, и в качестве текста ищю гугл индентифкатар — смысл этого в том что например, кончаются деньги и хотсер начинает показывать свою заглушку — заплати деньги, мониторинг при этом может думать, что сайт все еще работает нормально!
Кирпич 1
Просто посылает разок сообщение Start! на старте скрипта
Кирпич 1.1
Сообщение прилетает на тригер, он заводится, его пропускает, а следующие нет. Кирпич 1.1 получает это сообщение смотрит что-там, если только текст Start! то дальше не пропускает — так избавляемся от твитов при старте скрипта
Кирпич 2
Опрашивает сайт google.com если он жив должен отдавать статус 200
Кирпич 2.1
Принимает ответ, елси он не 200 дальше не пускает — значит у нас что-то с интернетом, или гугл лег — но скорее всего это у нас что-то!
UPDATE: Добавляем подсчет минут простая сайта!
Тоже полезная штука, чтобы знать солько именно был простой, когда он начался видно по дате твитта — и тут надо учитывать, что сообщение о проблемах приходит после трех подтверждений(3 мин), а о начале работы полсе 5.
Кирпич 1
Это счетчик, он подключен к крипичам со статусом сайта. И к резет, когда от него приходит сигнал он сбрасывается на 3
Кирпич 2
Это функция которая пишет значение счетчика кирпича 1 в переменную downmin
Кирпич 3
Это кирпич посылает резет на кирпич один, когда срабатывает отсылка сообщения о том что сайт неработает. Так как сайт считает нерабочим полсе 3 минту простоя, то кирпич 1 скидывается в значение 3
Кирпич 4
И меняется кирпич с текстом твита
var timenow=flow.get('time'); var downtimenow=flow.get('downmin')-5; msg.payload = msg.payload + ' ' + timenow + '. Downtime: ' + downtimenow + ' #itcookycomstatus'; return msg;
Здесь считаем сколько реально сайт неработал, отнимает 5 — количество хороших статусов через которые отсылается твитт что сайт заработал
Добавить комментарий