From 24c34a6f78fab2fff954ae326cbacd8ee010ef9e Mon Sep 17 00:00:00 2001 From: "Ryan C. Creasey" Date: Thu, 30 Mar 2017 04:54:42 +0000 Subject: [PATCH 1/4] Adding raspberry pi changes. --- data/.gitignore | 2 ++ db/Dockerfile | 12 +++++++++++- docker-compose.yml | 14 +++++++------- probe/Dockerfile | 5 ++++- probe/probe.sh | 2 +- web/Dockerfile | 2 +- 6 files changed, 26 insertions(+), 11 deletions(-) create mode 100644 data/.gitignore diff --git a/data/.gitignore b/data/.gitignore new file mode 100644 index 0000000..b789db7 --- /dev/null +++ b/data/.gitignore @@ -0,0 +1,2 @@ +db +web diff --git a/db/Dockerfile b/db/Dockerfile index b091fab..633a3fc 100644 --- a/db/Dockerfile +++ b/db/Dockerfile @@ -1,3 +1,13 @@ -FROM influxdb:1.1.4 +FROM hypriot/rpi-influxdb +MAINTAINER Ryan Creasey + +ENV ADMIN_USER admin +ENV INFLUXDB_INIT_PWD speedtest +ENV PRE_CREATE_DB speedtest COPY influxdb.conf /etc/influxdb/influxdb.conf + +EXPOSE 8083 +EXPOSE 8086 + +VOLUME ["/data"] diff --git a/docker-compose.yml b/docker-compose.yml index f283f8b..3480e3b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,27 +3,27 @@ version: "2" services: db: build: ./db - image: speedtest-meter:db + image: rcreasey/speedtest-meter:db-rpi ports: - 8083:8083 - 8086:8086 - # volumes: - # - ./data/db:/var/lib/influxdb + volumes: + - ./data/db:/var/lib/influxdb probe: build: ./probe - image: speedtest-meter:probe + image: rcreasey/speedtest-meter:probe-rpi links: - db depends_on: - db web: build: ./web - image: speedtest-meter:web + image: rcreasey/speedtest-meter:web-rpi links: - db depends_on: - db ports: - 80:3000 - # volumes: - # - ./data/web:/var/lib/grafana + volumes: + - ./data/web:/var/lib/grafana diff --git a/probe/Dockerfile b/probe/Dockerfile index 2e23db3..d9865d9 100644 --- a/probe/Dockerfile +++ b/probe/Dockerfile @@ -1,4 +1,5 @@ -FROM ubuntu:trusty +FROM resin/rpi-raspbian:jessie +MAINTAINER Ryan Creasey RUN apt-get update && apt-get install -y curl python python-pip RUN mkdir /app @@ -13,3 +14,5 @@ COPY probe.sh /app/probe.sh RUN chmod +x /app/probe.sh CMD bash -c /app/probe.sh + +ENV TEST_INTERVAL 300 diff --git a/probe/probe.sh b/probe/probe.sh index 711a8ef..0ec4ac8 100644 --- a/probe/probe.sh +++ b/probe/probe.sh @@ -3,5 +3,5 @@ while true do python probe.py - sleep 300 + sleep $TEST_INTERVAL done diff --git a/web/Dockerfile b/web/Dockerfile index c569c42..853267c 100644 --- a/web/Dockerfile +++ b/web/Dockerfile @@ -1,4 +1,4 @@ -FROM grafana/grafana:4.1.1 +FROM fg2it/grafana-armhf:v4.1.1 ENV GF_SERVER_ROOT http://localhost ENV GF_AUTH_ANONYMOUS_ENABLED true From 653d94ec6e320030c3834ddbd1c4e3e762fea9f1 Mon Sep 17 00:00:00 2001 From: "Ryan C. Creasey" Date: Thu, 30 Mar 2017 04:55:59 +0000 Subject: [PATCH 2/4] Adding a maintainer. --- web/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/web/Dockerfile b/web/Dockerfile index 853267c..d3ee69a 100644 --- a/web/Dockerfile +++ b/web/Dockerfile @@ -1,4 +1,5 @@ FROM fg2it/grafana-armhf:v4.1.1 +MAINTAINER Ryan Creasey ENV GF_SERVER_ROOT http://localhost ENV GF_AUTH_ANONYMOUS_ENABLED true From 3dd17efa998c2a1fe0ecc9359098fcbc6fe905c0 Mon Sep 17 00:00:00 2001 From: "Ryan C. Creasey" Date: Wed, 29 Mar 2017 22:50:06 -0700 Subject: [PATCH 3/4] Putting polish on probe. --- probe/probe.py | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/probe/probe.py b/probe/probe.py index 4f51290..bf7f31e 100644 --- a/probe/probe.py +++ b/probe/probe.py @@ -1,29 +1,46 @@ -import speedtest import influxdb -import sys +import logging +import os import socket +import speedtest +import sys -probe = speedtest.Speedtest() +log = logging.getLogger(__name__) +out_hdlr = logging.StreamHandler(sys.stdout) +out_hdlr.setFormatter(logging.Formatter('%(asctime)s %(message)s')) +out_hdlr.setLevel(logging.INFO) +log.addHandler(out_hdlr) +log.setLevel(logging.INFO) +probe = speedtest.Speedtest() probe.get_best_server() if not probe.results.server: + log.error('Unable to select best server from Speedtest.net; Aborting') sys.exit(1) - -print("{0}: {1}".format(probe.results.server.get('sponsor'), probe.results.server.get('name'))) +else: + log.info("{0}: {1}".format(probe.results.server.get('sponsor'), probe.results.server.get('name'))) probe.download() probe.upload() -db = influxdb.InfluxDBClient('db', 8086, 'admin', 'speedtest', 'speedtest') -db.create_database('speedtest') - download_in_mbs = probe.results.download / 1000000 upload_in_mbs = probe.results.upload / 1000000 -hostname = socket.gethostname() +hostname = os.environ.get('HOSTNAME', socket.gethostname()) + +log.info("Host: {host}, Download: {down:.2f} Mb/s, Upload: {up:.2f} Mb/s".format(host=hostname, + down=download_in_mbs, + up=upload_in_mbs)) + +try: + db = influxdb.InfluxDBClient('db', 8086, 'admin', 'speedtest', 'speedtest') +except influxdb.exceptions.InfluxDBServerError as e: + log.error("DB is offline; results not saved.") + sys.exit(1) +db.create_database('speedtest') db.write_points([{'measurement': 'download', 'fields': {'host': hostname, 'value': download_in_mbs}}, {'measurement': 'upload', 'fields': {'host': hostname, 'value': upload_in_mbs}}]) -print("Download: {0:.2f} Mb, Upload: {0:.2f}".format(download_in_mbs, upload_in_mbs)) -print("-" * 25) +log.info("-" * 25) + From f9a907ba3559c610c28eeabc86417020b1599422 Mon Sep 17 00:00:00 2001 From: "Ryan C. Creasey" Date: Thu, 30 Mar 2017 09:50:15 -0700 Subject: [PATCH 4/4] Handling the error case to set download/upload to 0 in case of speedtest failure. --- probe/probe.py | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/probe/probe.py b/probe/probe.py index bf7f31e..499ae24 100644 --- a/probe/probe.py +++ b/probe/probe.py @@ -12,21 +12,26 @@ log.addHandler(out_hdlr) log.setLevel(logging.INFO) -probe = speedtest.Speedtest() -probe.get_best_server() +hostname = os.environ.get('HOSTNAME', socket.gethostname()) +download_in_mbs = 0 +upload_in_mbs = 0 -if not probe.results.server: - log.error('Unable to select best server from Speedtest.net; Aborting') - sys.exit(1) -else: - log.info("{0}: {1}".format(probe.results.server.get('sponsor'), probe.results.server.get('name'))) +try: + probe = speedtest.Speedtest() + probe.get_best_server() -probe.download() -probe.upload() + if not probe.results.server: + log.error('Unable to select best server from Speedtest.net; Aborting') + else: + log.info("{0}: {1}".format(probe.results.server.get('sponsor'), probe.results.server.get('name'))) -download_in_mbs = probe.results.download / 1000000 -upload_in_mbs = probe.results.upload / 1000000 -hostname = os.environ.get('HOSTNAME', socket.gethostname()) + probe.download() + probe.upload() + + download_in_mbs = probe.results.download / 1000000 + upload_in_mbs = probe.results.upload / 1000000 +except Exception as e: + log.error('Unable to gather results from Speedtest.net\n{0}', e.msg) log.info("Host: {host}, Download: {down:.2f} Mb/s, Upload: {up:.2f} Mb/s".format(host=hostname, down=download_in_mbs, @@ -43,4 +48,3 @@ {'measurement': 'upload', 'fields': {'host': hostname, 'value': upload_in_mbs}}]) log.info("-" * 25) -