Algum tempo atrás, quando eu era um usuário de ADSL em minha casa, tive muitos problemas com minha conexão à Internet. Eu estava com preguiça de mudar para uma conexão de fibra.
Finalmente eu mudei, mas enquanto isso a minha empresa de Internet estava resolvendo um incidente, e eu comecei a hackar um pouco um script simples e sujo que monitora minha velocidade de conexão (apenas por diversão e para praticar com InfluxDB e Grafana).
Hoje, eu perdi meu script rápido e sujo (por favor, Gonzalo, mantenha um backup de trabalho do cartão SD do seu servidor Raspberry Pi sempre atualizado! Às vezes, ele trava). É simples: “dd if = / dev / disk3 of = pi3.img” e eu quero reconstruí-lo. Dessa vez, eu quero usar o Docker (apenas por diversão).
Para monitorar a largura de banda, precisamos apenas usar a API speedtest-cli. Podemos usar essa API a partir da linha de comando e, como é uma biblioteca Python, podemos criar um script Python que a use.
import datetime
import logging
import os
import speedtest
import time
from dotenv import load_dotenv
from influxdb import InfluxDBClient
logging.basicConfig(level=logging.INFO)
current_dir = os.path.dirname(os.path.abspath(__file__))
load_dotenv(dotenv_path="{}/.env".format(current_dir))
influxdb_host = os.getenv("INFLUXDB_HOST")
influxdb_port = os.getenv("INFLUXDB_PORT")
influxdb_database = os.getenv("INFLUXDB_DATABASE")
def persists(measurement, fields, time):
logging.info("{} {} {}".format(time, measurement, fields))
influx_client.write_points([{
"measurement": measurement,
"time": time,
"fields": fields
}])
influx_client = InfluxDBClient(host=influxdb_host, port=influxdb_port, database=influxdb_database)
def get_speed():
logging.info("Calculating speed ...")
s = speedtest.Speedtest()
s.get_best_server()
s.download()
s.upload()
return s.results.dict()
def loop(sleep):
current_time = datetime.datetime.utcnow().isoformat()
speed = get_speed()
persists(measurement='download', fields={"value": speed['download']}, time=current_time)
persists(measurement='upload', fields={"value": speed['upload']}, time=current_time)
persists(measurement='ping', fields={"value": speed['ping']}, time=current_time)
time.sleep(sleep)
while True:
loop(sleep=60 * 60) # each hour
Agora precisamos criar o arquivo de docker-composer para orquestrar a infraestrutura. A coisa mais complicada aqui é, talvez, configurar o Grafana dentro dos arquivos do Docker em vez de abrir o navegador, criar o datasource e construir o painel manualmente.
Depois de algumas horas navegando nos repositórios do GitHub, finalmente criei exatamente o que eu precisava para este artigo. Basicamente, é um ponto de entrada personalizado para o meu host Grafana que cria o datasource e o painel (por meio da API do Grafana).
version: '3'
services:
check:
image: gonzalo123.check
restart: always
volumes:
- ./src/beat:/code/src
depends_on:
- influxdb
build:
context: ./src
dockerfile: .docker/Dockerfile-check
networks:
- app-network
command: /bin/sh start.sh
influxdb:
image: influxdb:latest
restart: always
environment:
- INFLUXDB_INIT_PWD="${INFLUXDB_PASS}"
- PRE_CREATE_DB="${INFLUXDB_DB}"
volumes:
- influxdb-data:/data
networks:
- app-network
grafana:
image: grafana/grafana:latest
restart: always
ports:
- "3000:3000"
depends_on:
- influxdb
volumes:
- grafana-db:/var/lib/grafana
- grafana-log:/var/log/grafana
- grafana-conf:/etc/grafana
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
grafana-db:
driver: local
grafana-log:
driver: local
grafana-conf:
driver: local
influxdb-data:
driver: local
E isso é tudo. Minha conexão à Internet foi supervisionada novamente.
O projeto está disponível no meu GitHub.
***
Gonzalo Ayuso faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela Redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: https://gonzalo123.com/2018/11/26/monitoring-the-bandwidth-with-grafana-influxdb-and-docker/