Skip to content

Latency measurement with Influx + Grafana in a Docker environment

Notifications You must be signed in to change notification settings

planet-espresso/pyLateMon

Repository files navigation

Docker Based Latency Monitor

Docker container(s) which tracks latency of one or many hosts and reports to InfluxDBv2.

Description

This docker container is able to track the latency of one or many targets and reports all data to a given InfluxDBv2.

It´s based on python3 an makes usage of following python libraries:

  • pythonping
  • influxdb_client
  • threading
  • sys
  • os
  • datetime
  • configparser
  • time

You can use it in standalone or full stack mode.

Standalone:

  • Just the latency-monitor container which sends data to an external InfluxDB2 Server

Full Stack:

  • Traefik container as Proxy (full TLS support)
  • InfluxDB2 container, fully setup and ready to take data
  • Grafana container, fully setup and connected (but without dashboards)
  • latency-monitor container sending data to the InfluxDB2 container

Requirements

  • Docker (CE)
  • Docker-Compose
  • InfluxDB Version >= 2
  • pythonping needs root privileges so same for the container

Configuration (GENERAL)

Configuration can be passed via ENV OR configuration file.

In case of using the ENV option you are just able to monitor ONE target for more targets please use the configuration file.

Also some influx connection options are just configurable via config file but normally they are not needed.

Behaviour

Per default the used python influxdb connector will cache all replies and sends them bundled every 30 seconds to the Influx DB.

Actually the latency-monitor container is build on demand, a dockerhub image is on the roadmap...

You can find everything under ./Docker_Build/ and in the python program itself latency_monitor.py


ENV Variables

Name Example Usage Option/Must Type Default
INFLUX_URL http://10.0.0.1:8086 InfluxDB Host must URL ---
INFLUX_TOKEN eWOcp-MCv2YPlER7wc...0zRNnrIoTqZAg== InfluxDB API Token must String ---
INFLUX_BUCKET latency InfluxDB Bucket must String ---
INFLUX_ORG MyOrg InfluxDB Organization must String ---
TARGET_HOST 8.8.8.8 Monitored Host (IP/FQDN) must FQDN or IP ---
TARGET_TIMEOUT 0.5 ping timeout in sec. optional Float >0 1
TARGET_TIMER 3 ping frequency in sec. optional Int >1 5
TARGET_LOCATION Google decript. location optional String unknown

Config File

Instead of using the ENV variables you can use a config file.

Keep in mind it´s a OR decision not a AND

See ./latency-monitor/config-template.ini

ENV wins over file

Docker-Compose Style

uncomment:

# - ./latency-monitor/config.ini:/app/config.ini:ro # UNCOMMENT IF NEEDED

Docker-CLI Style

docker latency-monitor -v ./latency-monitor/config.ini:/app/config.ini:ro


Configuration (Standalone)

1st thing to do is creating the docker-compose.yml from docker-compose-standalone.yml:

cp docker-compose-standalone.yml docker-compose.yml

Variables

Below paragraph:

####################################################
# LATENCY-MONITOR
####################################################

in the .env file (env needs to be renamed to .env) configure following variables:

  • YOUR_ORGANIZATION
  • YOUR_BUCKET_NAME
  • YOUR_ADMIN_TOKEN
  • YOUR_MONITORED_TARGET
  • YOUR_MONITORED_TARGET_TIMEOUT
  • YOUR_MONITORED_TARGET_TIMER
  • YOUR_MONITORED_TARGET_LOCATION

Lets go

docker-compose up -d latency-monitor

should do the job



Configuration (Full-Stack)

Easy peasy automatic mode

Have a look at ./setup-full_stack.sh

Just create a valid .env File by:

cp env .env

and edit it to your needs.

After everyting within .env is in order just do:

./setup-full_stack.sh

Everything should be right in place now.

Just the certificates are missing look here

Now run it and mybe pick a example dashboard for grafana from here

BACKUPS FILES ???

The script will backup following files if found:

  • ./docker-compose.yml
  • ./grafana/provisioning/datasources/grafana-datasource.yml


WTF manual mode

REALLY???

You need to set all on your own:

Variables

You need to configure Variables in following files to make the compose work:

  • file
    • VARIABLE1
    • VARIABLE2
    • VARIABLE3

  • docker-compose.yml (generated from docker-compose-full_stack.yml)
    • PLACE_YOUR_FQDN_HERE (3 times)

  • .env (env needs to be renamed to .env)
    • YOUR_PATH_TO_CONTAINER_STATIC_DATA
    • YOUR_ADMIN_USER
    • YOUR_ADMIN_PASSWORD
    • YOUR_ORGANIZATION
    • YOUR_BUCKET_NAME
    • YOUR_ADMIN_TOKEN
    • YOUR_MONITORED_TARGET
    • YOUR_MONITORED_TARGET_TIMEOUT
    • YOUR_MONITORED_TARGET_TIMER
    • YOUR_MONITORED_TARGET_LOCATION

  • grafana/provisioning/datasources/grafana-datasource.yml (generated from grafana/grafana-datasource-template.yml)
    • YOUR_ADMIN_TOKEN
    • YOUR_ORGANIZATION
    • YOUR_BUCKET_NAME

File Permissions

Because we are configuring grafana for permanent data storing and grafana actually runs with UID + GID: 472:472 it´s necessary to change permisson of die permanent storage directory we have configured.

The directory build from the following config part of grafana within the docker-compose.yml:

${MyPath}/grafana/var_lib

MyPath was configured earlier in the .env file.

so let´s assume the following:

MyPath = /opt/docker/containers/

then you have to do the following

chown -R 472:472 /opt/docker/containers/grafana/var_lib

Everything should be right in place now.

Just the certificates are missing look here

Now just start over and maybe pick an example dashboard for grafana from here



Certificate

Traefik will act as a proxy and ensures the usage of TLS so it needs your certificate and key file.

within the docker-compose.yml you will find:

      - ./traefik/mycert.crt:/certs/cert.crt:ro
      - ./traefik/mycert.key:/certs/privkey.key:ro

so please place your certificate file as ./traefik/mycert.crt and the key file as ./traefik/mycert.key.

Thats it

Grafana Dashboard Examples

Within the local path ./examples/grafana/ you can find example .json files which can be imported to grafana as dashboards to give you a first point to start with.



Authors

Contributors names and contact info

Version History

  • v0.4a

    • fixed tag recognition for buildprocess
  • v0.4

    • moved from self build iamge to dockerhub
  • v0.3a

    • ping timeout added
    • cleanup
  • v0.3

    • setup-script fixed and backup added
    • fixed latency value problem (was sometimes string instead of float)
    • cleanup
  • v0.2b

    • cleanup
  • v0.2a

    • fixed some missing variables
    • fixe a missing integer declaration in latency-monitor
    • added automatic config creation for full-stack
    • cleanups
  • v0.1

    • Initial Release

License

free to use