mirror of
https://github.com/ansible/awx.git
synced 2026-03-10 05:59:28 -02:30
* Enable new fancy asyncio metrics for dispatcherd Remove old dispatcher metrics and patch in new data from local whatever Update test fixture to new dispatcherd version * Update dispatcherd again * Handle node filter in URL, and catch more errors * Add test for metric filter * Split module for dispatcherd metrics
42 lines
1.5 KiB
Python
42 lines
1.5 KiB
Python
import http.client
|
|
import socket
|
|
import urllib.error
|
|
import urllib.request
|
|
import logging
|
|
|
|
from django.conf import settings
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def get_dispatcherd_metrics(request):
|
|
metrics_cfg = settings.METRICS_SUBSYSTEM_CONFIG.get('server', {}).get(settings.METRICS_SERVICE_DISPATCHER, {})
|
|
host = metrics_cfg.get('host', 'localhost')
|
|
port = metrics_cfg.get('port', 8015)
|
|
metrics_filter = []
|
|
if request is not None and hasattr(request, "query_params"):
|
|
try:
|
|
nodes_filter = request.query_params.getlist("node")
|
|
except Exception:
|
|
nodes_filter = []
|
|
if nodes_filter and settings.CLUSTER_HOST_ID not in nodes_filter:
|
|
return ''
|
|
try:
|
|
metrics_filter = request.query_params.getlist("metric")
|
|
except Exception:
|
|
metrics_filter = []
|
|
if metrics_filter:
|
|
# Right now we have no way of filtering the dispatcherd metrics
|
|
# so just avoid getting in the way if another metric is filtered for
|
|
return ''
|
|
url = f"http://{host}:{port}/metrics"
|
|
try:
|
|
with urllib.request.urlopen(url, timeout=1.0) as response:
|
|
payload = response.read()
|
|
if not payload:
|
|
return ''
|
|
return payload.decode('utf-8')
|
|
except (urllib.error.URLError, UnicodeError, socket.timeout, TimeoutError, http.client.HTTPException) as exc:
|
|
logger.debug(f"Failed to collect dispatcherd metrics from {url}: {exc}")
|
|
return ''
|