Hermes
Demo Coming Soon
Screenshots and a live demo will be available at alpha release.
About This Project
Project Overview
Hermes is a Python application that periodically runs internet speed tests and automatically exports results to multiple destinations. Built with observability in mind, it ships data to CSV files, Prometheus metrics endpoints, and Loki log aggregation — giving you a full picture of your connection's performance over time through a clean browser-based UI.
Technical Implementation
- Modular Exporter Architecture: Plugin-style exporter classes (CSV, Prometheus, Loki) all implement a shared
BaseExporterinterface, making it easy to add new destinations. - Result Dispatcher: A central
ResultDispatcherfans out eachSpeedResultto all registered exporters, keeping business logic cleanly separated from delivery. - Observability Stack: Native integration with Prometheus (Gauge metrics via
/metrics) and Loki (HTTP log push in JSON) for real-time monitoring and alerting. - Browser UI: A Streamlit-powered frontend lets you trigger on-demand speed tests and view historical results without touching the command line.
- Structured Data Model: A
SpeedResultdataclass serves as the shared data contract between the runner and all exporters, ensuring consistency across outputs.
Development Journey
Hermes started as a simple script to log internet speeds to a CSV file. It evolved into a fully modular observability tool as the need grew to integrate with existing monitoring infrastructure. The architecture was progressively refined — separating the speed test runner, result model, dispatcher, and exporters into distinct layers — following clean separation-of-concerns principles. A Streamlit UI was later added to make it accessible without requiring direct terminal access.
Key Features
- Scheduled and on-demand speed test execution
- Multi-destination export: CSV, Prometheus, and Loki/OTel
- Clean exporter plugin architecture for easy extensibility
- Browser-based UI for triggering tests and viewing results
- Structured logging and result modeling via dataclasses