From c78ab702989a7bfc40b0d15eb546eb18d400f8aa Mon Sep 17 00:00:00 2001 From: hnrd Date: Sun, 8 Apr 2018 13:37:13 +0200 Subject: [PATCH] initial commit --- Dockerfile | 7 ++++ docker-compose.yml | 12 +++++++ exporter.py | 83 ++++++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 1 + 4 files changed, 103 insertions(+) create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100644 exporter.py create mode 100644 requirements.txt diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ea9ecc8 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,7 @@ +FROM python:alpine + +COPY exporter.py /exporter.py + +RUN pip install --no-cache-dir requests + +CMD [ "python", "/exporter.py" ] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..c0cf5df --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,12 @@ +version: '2.1' + +services: + exporter: + build: . + restart: unless-stopped + environment: + UPTIME_ROBOT_APIKEY: u123456-1a2b3c4d5e6f7890abc12323 + ports: + - 9705:9705 + read_only: true + pids_limit: 5 diff --git a/exporter.py b/exporter.py new file mode 100644 index 0000000..3be533d --- /dev/null +++ b/exporter.py @@ -0,0 +1,83 @@ +import argparse +import http.server +import os + + +import requests + + +def fetch_data(api_key): + params = { + 'api_key': api_key, + 'format': 'json', + 'response_times': 1, + 'response_times_limit': 1, + } + req = requests.post( + 'https://api.uptimerobot.com/v2/getMonitors', + data=params, + ) + return req.json() + + +def format_prometheus(data): + result = '' + for item in data: + result += 'uptimerobot_up{{name="{}",type="{}",url="{}"}} {}\n'.format( + item.get('friendly_name'), + item.get('type'), + item.get('url'), + 1 if item.get('status', 0) == 2 else 0, + ) + result += 'uptimerobot_response_time{{name="{}",type="{}",url="{}"}} {}\n'.format( + item.get('friendly_name'), + item.get('type'), + item.get('url'), + item.get('response_times').pop().get('value'), + ) + return result + + +class ReqHandler(http.server.BaseHTTPRequestHandler): + def do_GET(self): + answer = fetch_data(api_key) + self.send_response(200) + self.send_header("Content-type", "text/plain") + self.end_headers() + self.wfile.write( + format_prometheus(answer.get('monitors')).encode('utf-8') + ) + + +if __name__ == '__main__': + if 'UPTIMEROBOT_API_KEY' in os.environ: + api_key = os.environ.get('UPTIMEROBOT_API_KEY') + server_name = os.environ.get('UPTIMEROBOT_SERVER_NAME', '0.0.0.0') + server_port = int(os.environ.get('UPTIMEROBOT_SERVER_PORT', '9705')) + else: + parser = argparse.ArgumentParser( + description='Export all check results from uptimerobot.txt' + 'for prometheus scraping.' + ) + parser.add_argument( + 'apikey', + help='Your uptimerobot.com API key. See account details.' + ) + parser.add_argument( + '--server_name', '-s', + default='0.0.0.0', + help='Server address to bind to.' + ) + parser.add_argument( + '--server_port', '-p', + default=9705, + type=int, + help='Port to bind to.' + ) + args = parser.parse_args() + api_key = args.apikey + server_name = args.server_name + server_port = args.server_port + + httpd = http.server.HTTPServer((server_name, server_port), ReqHandler) + httpd.serve_forever() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..271baf7 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +requests==2.18.4