DevSecOps

17 dez, 2018

Monitorando a largura de banda com Grafana, InfluxDB e Docker

Publicidade

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/