initial commit
This commit is contained in:
commit
c78ab70298
4 changed files with 103 additions and 0 deletions
7
Dockerfile
Normal file
7
Dockerfile
Normal file
|
@ -0,0 +1,7 @@
|
|||
FROM python:alpine
|
||||
|
||||
COPY exporter.py /exporter.py
|
||||
|
||||
RUN pip install --no-cache-dir requests
|
||||
|
||||
CMD [ "python", "/exporter.py" ]
|
12
docker-compose.yml
Normal file
12
docker-compose.yml
Normal file
|
@ -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
|
83
exporter.py
Normal file
83
exporter.py
Normal file
|
@ -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()
|
1
requirements.txt
Normal file
1
requirements.txt
Normal file
|
@ -0,0 +1 @@
|
|||
requests==2.18.4
|
Loading…
Reference in a new issue