Recentemente tenho brincado com o Nameko, framework do Python para construir microsserviços, e hoje quero atualizar um pequeno projeto de estimação que tenho em minha casa para monitorar a largura de banda da minha conexão com a internet. Quero usar um microsserviço nameko usando o ponto de entrada Timer.
Este é o worker:
from nameko.timer import timer
import datetime
import logging
import os
import speedtest
from dotenv import load_dotenv
from influxdb import InfluxDBClient
current_dir = os.path.dirname(os.path.abspath(__file__))
load_dotenv(dotenv_path="{}/.env".format(current_dir))
class SpeedService:
name = "speed"
def __init__(self):
self.influx_client = InfluxDBClient(
host=os.getenv("INFLUXDB_HOST"),
port=os.getenv("INFLUXDB_PORT"),
database=os.getenv("INFLUXDB_DATABASE")
)
@timer(interval=3600)
def speedTest(self):
logging.info("speedTest")
current_time = datetime.datetime.utcnow().isoformat()
speed = self.get_speed()
self.persists(measurement='download', fields={"value": speed['download']}, time=current_time)
self.persists(measurement='upload', fields={"value": speed['upload']}, time=current_time)
self.persists(measurement='ping', fields={"value": speed['ping']}, time=current_time)
def persists(self, measurement, fields, time):
logging.info("{} {} {}".format(time, measurement, fields))
self.influx_client.write_points([{
"measurement": measurement,
"time": time,
"fields": fields
}])
@staticmethod
def get_speed():
logging.info("Calculating speed ...")
s = speedtest.Speedtest()
s.get_best_server()
s.download()
s.upload()
return s.results.dict()
Preciso adaptar meu arquivo docker-compose para incluir o servidor RabbitMQ (o Nameko precisa de um broker de mensagem RabbitMQ).
version: '3'
services:
speed.worker:
container_name: speed.worker
image: speed/worker
restart: always
build:
context: ./src/speed.worker
dockerfile: .docker/Dockerfile-worker
command: /bin/bash run.sh
rabbit:
container_name: speed.rabbit
image: rabbitmq:3-management
restart: always
ports:
- "15672:15672"
- "5672:5672"
environment:
RABBITMQ_ERLANG_COOKIE:
RABBITMQ_DEFAULT_VHOST: /
RABBITMQ_DEFAULT_USER: ${RABBITMQ_DEFAULT_USER}
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_DEFAULT_PASS}
influxdb:
container_name: speed.influxdb
image: influxdb:latest
restart: always
environment:
- INFLUXDB_DB=${INFLUXDB_DB}
- INFLUXDB_ADMIN_USER=${INFLUXDB_ADMIN_USER}
- INFLUXDB_ADMIN_PASSWORD=${INFLUXDB_ADMIN_PASSWORD}
- INFLUXDB_HTTP_AUTH_ENABLED=${INFLUXDB_HTTP_AUTH_ENABLED}
volumes:
- influxdb-data:/data
grafana:
container_name: speed.grafana
build:
context: ./src/grafana
dockerfile: .docker/Dockerfile-grafana
restart: always
environment:
- GF_SECURITY_ADMIN_USER=${GF_SECURITY_ADMIN_USER}
- GF_SECURITY_ADMIN_PASSWORD=${GF_SECURITY_ADMIN_PASSWORD}
- GF_USERS_DEFAULT_THEME=${GF_USERS_DEFAULT_THEME}
- GF_USERS_ALLOW_SIGN_UP=${GF_USERS_ALLOW_SIGN_UP}
- GF_USERS_ALLOW_ORG_CREATE=${GF_USERS_ALLOW_ORG_CREATE}
- GF_AUTH_ANONYMOUS_ENABLED=${GF_AUTH_ANONYMOUS_ENABLED}
ports:
- "3000:3000"
depends_on:
- influxdb
volumes:
influxdb-data:
driver: local
E isso é tudo. Mais engenharia para controlar minha conexão com a Internet? Talvez. Mas é assim que eu aprendo coisas novas.
O código-fonte 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/2019/02/04/monitoring-the-bandwidth-part-2-now-with-python-nameko-microservice/