Spaces:
Runtime error
Runtime error
import logging | |
import os | |
import urllib.parse | |
from bottle import request | |
from dtos import V1RequestBase, V1ResponseBase | |
from metrics import start_metrics_http_server, REQUEST_COUNTER, REQUEST_DURATION | |
PROMETHEUS_ENABLED = os.environ.get('PROMETHEUS_ENABLED', 'false').lower() == 'true' | |
PROMETHEUS_PORT = int(os.environ.get('PROMETHEUS_PORT', 8192)) | |
def setup(): | |
if PROMETHEUS_ENABLED: | |
start_metrics_http_server(PROMETHEUS_PORT) | |
def prometheus_plugin(callback): | |
""" | |
Bottle plugin to expose Prometheus metrics | |
http://bottlepy.org/docs/dev/plugindev.html | |
""" | |
def wrapper(*args, **kwargs): | |
actual_response = callback(*args, **kwargs) | |
if PROMETHEUS_ENABLED: | |
try: | |
export_metrics(actual_response) | |
except Exception as e: | |
logging.warning("Error exporting metrics: " + str(e)) | |
return actual_response | |
def export_metrics(actual_response): | |
res = V1ResponseBase(actual_response) | |
if res.startTimestamp is None or res.endTimestamp is None: | |
# skip management and healthcheck endpoints | |
return | |
domain = "unknown" | |
if res.solution and res.solution.url: | |
domain = parse_domain_url(res.solution.url) | |
else: | |
# timeout error | |
req = V1RequestBase(request.json) | |
if req.url: | |
domain = parse_domain_url(req.url) | |
run_time = (res.endTimestamp - res.startTimestamp) / 1000 | |
REQUEST_DURATION.labels(domain=domain).observe(run_time) | |
result = "unknown" | |
if res.message == "Challenge solved!": | |
result = "solved" | |
elif res.message == "Challenge not detected!": | |
result = "not_detected" | |
elif res.message.startswith("Error"): | |
result = "error" | |
REQUEST_COUNTER.labels(domain=domain, result=result).inc() | |
def parse_domain_url(url): | |
parsed_url = urllib.parse.urlparse(url) | |
return parsed_url.hostname | |
return wrapper | |