Instalar Downdetector no Zabbix com Grafana

Criada por Danilo Tomich, Modificado em Thu, 10 Aug 2023 na (o) 03:44 PM por Danilo Tomich

Instalar downdetector no Zabbix
Versão do Zabbix: 6 e Debian 11

Levando em consideração que já tenha o zabbix instalado no Debian, vamos seguir com a instalação do Downdetector!


Precisamos ter no servidor do zabbix essas dependências instaladas!


Python 3
beautifulsoup4 
cloudscraper 
requests
openssl 1.1.1

Instale no seus servidor 
apt install python3-pip
pip3 install bs4
pip3 install requests
pip3 install cloudscraper
Se tiver o pip3 já instalado, so baixar as dependências!
pip3 install requirements.txt


Vamos criar o script no seguinte caminho:

nano /usr/lib/zabbix/externalscripts/downdetector.py


Em seguida coloque todo esse código abaixo no arquivo downdetector.py

#!/usr/bin/python3
#########################################
#                                       #
# Author: Gabriel Padilha               #
# Email: gabrielvargaspadilha@gmail.com #
#                                       #
#########################################
import sys
import ssl
import re
import random
from bs4 import BeautifulSoup
if ssl.OPENSSL_VERSION_INFO[0] < 1 or ssl.OPENSSL_VERSION_INFO[1] < 1 or ssl.OPENSSL_VERSION_INFO[2] < 1:
    user_agent_list = [
        # Chrome
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 '
        'Safari/537.36',
        'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 '
        'Safari/537.36',
        'Mozilla/5.0 (Windows NT 5.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 '
        'Safari/537.36',
        'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 '
        'Safari/537.36',
        'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36',
        'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 '
        'Safari/537.36',
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 '
        'Safari/537.36',
        'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 '
        'Safari/537.36',
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 '
        'Safari/537.36',
        'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 '
        'Safari/537.36',
        # Firefox
        'Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)',
        'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko',
        'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)',
        'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko',
        'Mozilla/5.0 (Windows NT 6.2; WOW64; Trident/7.0; rv:11.0) like Gecko',
        'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko',
        'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0)',
        'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko',
        'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)',
        'Mozilla/5.0 (Windows NT 6.1; Win64; x64; Trident/7.0; rv:11.0) like Gecko',
        'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)',
        'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)',
        'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; '
        '.NET CLR 3.5.30729) '
    ]
    import requests
    craw = "requests"
else:
    import cloudscraper
    craw = "cloudscraper"

PARAMS = {
    'Relatórios de usuários indicam que não há problemas': 'success',
    'Relatórios de usuários indicam potenciais problemas': 'warning',
    'Relatórios de usuários indicam problemas': 'danger'
}

def request(dd_site):
    url = "https://downdetector.com.br/fora-do-ar/{}/".format(dd_site)
    if not craw:
        print(0)
        exit()
    elif craw == "cloudscraper":
        scraper = cloudscraper.create_scraper()
        return scraper.get(url)
    else:
        return requests.get(url, headers={'User-Agent': random.choice(user_agent_list)})


def parse_result(status_text):
    status_text = status_text.strip()
    if status_text == 'success':
        status_number = 1
    elif status_text == 'warning':
        status_number = 2
    elif status_text == 'danger':
        status_number = 3
    else:
        status_number = 0
    print(status_number)
    exit()

if __name__ == '__main__':
    if len(sys.argv) < 2:
        print("Informe o site que gostaria de verificar")
        sys.exit(1)
    site = sys.argv[1]

    response = request(site)

    if response.status_code != 200:
        print(0)
        exit()

    try:
        bs = BeautifulSoup(response.text, 'html.parser')
        dataParse = bs.find("div", {"class": "entry-title"})
        status = dataParse.text.strip()
        result = None
        if not status:
            raise ValueError('')
        for param in PARAMS:
            if re.compile(r"{}.*".format(param)).match(status):
                result = PARAMS[param]
        if not result:
            raise ValueError('')
        parse_result(result)
    except Exception as err:
        failover = re.compile(".*status: '(.*)',.*", re.MULTILINE)
        failover_status = failover.findall(response.text).pop()
        parse_result(failover_status)

Vamos criar agora o script de descoberta:
Crie o arquivo:

nano /usr/lib/zabbix/externalscripts/downdetectorDiscovery.py


Em seguida coloque o código abaixo no arquivo downdetectorDiscovery.py

#!/usr/bin/python3
import os
import sys
import json
FILE = "/usr/lib/zabbix/externalscripts/downdetectorlist.list"

if not os.path.isfile(FILE):
    print("File not found")
    sys.exit()

file = open(FILE, "r")

data = {
    "data": []
}

for line in file.readlines():
    line_data = line.rstrip().split(';')
    if line_data[0] == '1':
        dic = {"{#SITE_ID}": line_data[1], "{#SITE_NOME}": line_data[2]}
        data['data'].append(dic)

print(json.dumps(data))

Vamos criar agora a lista dos sites:

nano /usr/lib/zabbix/externalscripts/downdetectorlist.list


E cole todo o código abaixo no arquivo:

0;alelo;Alelo
0;algar;Algar
0;alog;Alog
0;amazon;Amazon
1;amazon-prime-instant-video;Amazon Prime Video
1;aws-amazon-web-services;Amazon Web Services
0;america-net;America Net
0;anthem;Anthem
0;anydesk;Anydesk
0;apex-legends;Apex Legends
0;app-store;App Store
0;apple-store;Apple Store
0;avianca;Avianca
0;voeazul;Azul
0;bcb;Banco Central do Brasil
0;banco-do-brasil;Banco do Brasil
0;banco-inter;Banco Inter
0;banco-itau;Banco Itaú
0;banco-safra;Banco Safra
0;banco-santander;Banco Santander
0;banestes;Banestes
0;banrisul;Banrisul
0;battlefield;Battlefield
0;betfair;Betfair
0;binance;Binance
0;bing;Bing
0;battle-net;Blizzard Battle.net
0;bradesco;Bradesco
0;brisanet;Brisanet
0;buscape;Buscapé
0;c6-bank;C6 Bank
0;cabo-telecom;Cabo Telecom
0;cabonnet;Cabonnet
1;caixa;Caixa Econômica Federal
0;call-of-duty;Call of Duty
0;claro;Claro
0;clash-of-clans;Clash of Clans
0;clash-royale;Clash Royale
0;clear-corretora;Clear
0;cloudflare;Cloudflare
0;clusterweb;Clusterweb
0;copeltelecom;Copel Telecom
0;correios;Correios
0;counter-strike;Counter-Strike
0;cedit-suisse;Credit Suisse
0;crunchyroll;Crunchyroll
0;dataprev;Dataprev
0;dead-by-daylight;Dead By Daylight
0;deezer;Deezer
0;destiny;Destiny
0;discord;Discord
0;dota-2;Dota 2
0;dropbox;Dropbox
0;ea;EA
0;ebay;eBay
0;ecac;eCAC
0;embratel;Embratel
0;enem;Enem
0;epic-games-store;Epic Games Store
0;escape-from-tarkov;Escape from Tarkov
0;esocial;eSocial
0;faceapp;Faceapp
1;facebook;Facebook
1;facebook-messenger;Facebook Messenger
0;facetime;Facetime
0;feedly;Feedly
0;fifa;Fifa
0;for-honor;For Honor
0;fortnite;Fortnite
0;free-fire;Free Fire
0;garena;Garena
0;getnet;Getnet
0;github;GitHub
0;globo;Globo
0;globoplay;Globoplay
1;gmail;Gmail
0;go-daddy;Go Daddy
0;gol;Gol
0;google;Google
0;google-cloud;Google Cloud
0;google-drive;Google Drive
0;google-play;Google Play
0;gta5;GTA 5
0;global-village-telecom;GVT
0;hbo-go;HBO
0;hostgator;Hostgator
0;hostnet-br;Hostnet
0;hsbc;HSBC
0;icloud;iCloud
0;icq;ICQ
0;ifood;iFood
0;imessage;iMessage
0;instagram;Instagram
0;iti;ITI
0;itmnetworks;ITMNetworks
0;itunes;iTunes
0;jurassic-world-alive;Jurassic World Alive
0;kik;Kik
0;kinghost;KingHost
0;kraken;Kraken
0;league-of-legends;League of Legends
0;ligue-telecom;Ligue Telecom
0;line;Line
0;linkedin;LinkedIn
0;locaweb;Locaweb
0;mandic;Mandic
0;mercado-bitcoin;Mercado Bitcoin
1;mercado-livre;Mercado Livre
0;windows-azure;Microsoft Azure
0;teams;Microsoft Teams
0;multiplay;Multiplay
0;net;NET
1;netflix;Netflix
0;neverwinter;Neverwinter
0;nextel;Nextel
0;nota-fiscal-eletronica;Nota fiscal eletrônica
0;nubank;Nubank
0;office-365;Office 365
0;oi;Oi
0;olx;OLX
0;onedrive;OneDrive
0;origin;Origin
0;outlook;Outlook
0;overwatch;Overwatch
0;pagseguro;PagSeguro
0;path-of-exile;Path of Exile
0;paypal;Paypal
0;pinterest;Pinterest
0;playbattlegrounds;Player Unknown&#39;s Battlegrounds
0;playstation-network;Playstation Network
0;pokemon-go;Pokémon Go
0;policia-federal;Polícia Federal
0;porto-segura-conecta;Porto Seguro Conecta
0;qconcursos;QConcursos
0;rainbow-six;Rainbow Six
0;receite-federal;Receita Federal
0;red-dead-redemption;Red Dead Redemption
0;reddit;Reddit
0;roblox;Roblox
0;rocket-league;Rocket League
0;salesforcecom;Salesforce
0;sefaz;Sefaz
0;sercomtel;Sercomtel
0;sicoob;Sicoob
0;sicredi;Sicredi
0;sisu;SiSU
0;sky;SKY
0;skype;Skype
0;slack;Slack
0;snapchat;Snapchat
1;spotify;Spotify
0;steam;Steam
0;submarino;Submarino
0;superdigital;SuperDigital
0;teamviewer;Teamviewer
1;telegram;Telegram
0;terra;Terra
0;tim;TIM
0;tinder;Tinder
0;tribunal-superior-eleitoral;Tribunal Superior Eleitoral
0;twitch;Twitch
0;twitter;Twitter
0;uber;Uber
0;uber-eats;Uber Eats
0;udemy;Udemy
0;umbler;Umbler
0;uol;UOL
0;uolhost;UOLHost
0;uplay;Uplay PC
0;viber;Viber
0;vimeo;Vimeo
0;vivo;Vivo
0;vono;Vono
0;warframe;Warframe
0;waze;Waze
0;wechat;WeChat
1;whatsapp;Whatsapp
0;wikipedia;Wikipedia
0;world-of-warcraft;World of Warcraft
0;xbox-live;Xbox Live
0;xp-investimentos;XP Investimentos
0;yahoo;Yahoo
0;yahoo-mail;Yahoo Mail
1;youtube;Youtube
0;zello;Zello


Vamos dar permissão agora nesses arquivos que criamos!

chmod a+x /usr/lib/zabbix/externalscripts/downdetector*



Podemos fazer um teste se esta respondendo o site.
Vamos ver se o site vivo esta "vivo"!

/usr/lib/zabbix/externalscripts/downdetector.py vivo

Repare que na imagem abaixo me deu um resultado "1"


Sendo:
0 - SITE INATIVO
1 - SITE ATIVO

Agora basta importar os Templates no zabbix.
São 3:

zbx_export_hosts.xml
zbx_export_templates.xml
zbx_export_valuemaps.xml

LINK DE DOWNLOAD DO ARQUIVO




Depois que importar os arquivos no seu ZABBIX, o mesmo deve aparecer informações parecidas com a imagem abaixo:


E pronto! 

Só aguardar que vai começar a coletar dados! 

Vou deixar abaixo um Template para grafana Parecido com esse:



Este artigo foi útil?

Que bom!

Obrigado pelo seu feedback

Desculpe! Não conseguimos ajudar você

Obrigado pelo seu feedback

Deixe-nos saber como podemos melhorar este artigo!

Selecione pelo menos um dos motivos

Feedback enviado

Agradecemos seu esforço e tentaremos corrigir o artigo