From 26290c043d0407d03246a8ece400f673a04d937a Mon Sep 17 00:00:00 2001 From: Ben Kochie Date: Sat, 3 Jun 2017 14:47:03 +0200 Subject: [PATCH 1/2] Add Prometheus metrics. --- webtest.py | 43 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/webtest.py b/webtest.py index 1f5b2f7..02bb5ca 100644 --- a/webtest.py +++ b/webtest.py @@ -1,24 +1,36 @@ #!/usr/bin/python from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer +from prometheus_client import Gauge import serial import time import json PORT_NUMBER = 8080 +# Setup Prometheus metrics. +bartem_metric = Gauge('barometer_sensor_temperature_celcius', 'Barometric sensor temperature reading') +barpres_metric = Gauge('barometer_sensor_pressure_pascals', 'Barometric sensor pressure reading') +humidity_metric = Gauge('humidity_sensor_percent', 'Humidity sensor humidity reading') +humidity_temp_metric = Gauge('humidity_sensor_temperature_celcius', 'Humidity sensor temperature reading') + #This class will handles any incoming request from #the browser class myHandler(BaseHTTPRequestHandler): #Handler for the GET requests def do_GET(self): - if self.path=="/temp.json": - ser.write('g') - bartemp = float(ser.readline()) - barpres = int(float(ser.readline())) - humidity = int(float(ser.readline())) - humtemp = int(float(ser.readline())) - currenttime = time.time() + ser.write('g') + bartemp = float(ser.readline()) + barpres = int(float(ser.readline())) + humidity = int(float(ser.readline())) + humtemp = int(float(ser.readline())) + currenttime = time.time() + bartemp_metric.set(bartemp) + barpres_metric.set(barpres) + humidity_metric.set(humidity) + humidity_temp_metric.set(humtemp) + + if self.path=="/temp.json": data = {'BarometerTemperature':bartemp, 'BarometerPressure':barpres, 'Humidity':humidity, 'HumidityTemperature':humtemp, 'CurrentTime':int(currenttime)} self.send_response(200) @@ -27,6 +39,21 @@ def do_GET(self): # Send the html message self.wfile.write(json.dumps(data)) return + elif self.path=="/metrics": + registry = core.REGISTRY + params = parse_qs(urlparse(self.path).query) + if 'name[]' in params: + registry = registry.restricted_registry(params['name[]']) + try: + output = generate_latest(registry) + except: + self.send_error(500, 'error generating metric output') + raise + self.send_response(200) + self.send_header('Content-Type', CONTENT_TYPE_LATEST) + self.end_headers() + self.wfile.write(output) + return else: self.send_error(404,'File Not Found: %s' % self.path) @@ -45,4 +72,4 @@ def do_GET(self): except KeyboardInterrupt: print '^C received, shutting down the web server' server.socket.close() - ser.close() \ No newline at end of file + ser.close() From 2289c97cd29abb5e713017fed0cb5d66ed67bf32 Mon Sep 17 00:00:00 2001 From: Ben Kochie Date: Sat, 3 Jun 2017 15:00:51 +0200 Subject: [PATCH 2/2] Split out serial reading to a separate function. --- webtest.py | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/webtest.py b/webtest.py index 02bb5ca..0d009c2 100644 --- a/webtest.py +++ b/webtest.py @@ -13,24 +13,25 @@ humidity_metric = Gauge('humidity_sensor_percent', 'Humidity sensor humidity reading') humidity_temp_metric = Gauge('humidity_sensor_temperature_celcius', 'Humidity sensor temperature reading') + +# Return the readings from the serial line. +class readSerial(): + ser.write('g') + bartemp = float(ser.readline()) + barpres = int(float(ser.readline())) + humidity = int(float(ser.readline())) + humtemp = int(float(ser.readline())) + return bartemp, barpres, humidity, humtemp + + #This class will handles any incoming request from #the browser class myHandler(BaseHTTPRequestHandler): #Handler for the GET requests def do_GET(self): - ser.write('g') - bartemp = float(ser.readline()) - barpres = int(float(ser.readline())) - humidity = int(float(ser.readline())) - humtemp = int(float(ser.readline())) - currenttime = time.time() - - bartemp_metric.set(bartemp) - barpres_metric.set(barpres) - humidity_metric.set(humidity) - humidity_temp_metric.set(humtemp) - if self.path=="/temp.json": + bartemp, barpres, humidity, humtemp = readSerial() + currenttime = time.time() data = {'BarometerTemperature':bartemp, 'BarometerPressure':barpres, 'Humidity':humidity, 'HumidityTemperature':humtemp, 'CurrentTime':int(currenttime)} self.send_response(200) @@ -40,6 +41,12 @@ def do_GET(self): self.wfile.write(json.dumps(data)) return elif self.path=="/metrics": + bartemp, barpres, humidity, humtemp = readSerial() + bartemp_metric.set(bartemp) + barpres_metric.set(barpres) + humidity_metric.set(humidity) + humidity_temp_metric.set(humtemp) + registry = core.REGISTRY params = parse_qs(urlparse(self.path).query) if 'name[]' in params: