From 3fd7dbc8ee39ffa46e4f239ee3b863785d7d3023 Mon Sep 17 00:00:00 2001 From: weidenwiesel Date: Sat, 1 Nov 2025 17:59:00 +0100 Subject: [PATCH] Update alloy and prom exporter --- etc/alloy/config.alloy | 47 ++++++++++++++----- .../invidious-companion-metrics.py | 43 +++++++---------- 2 files changed, 51 insertions(+), 39 deletions(-) diff --git a/etc/alloy/config.alloy b/etc/alloy/config.alloy index 22dbd7a..4ddc0e2 100644 --- a/etc/alloy/config.alloy +++ b/etc/alloy/config.alloy @@ -1,18 +1,20 @@ -# This config is to be used with Grafana Cloud alloy +// ------------------- +// INVIDIOUS COMPANION +// ------------------- prometheus.scrape "scrape_invidious_companion_metrics" { targets = [ - # This first target is my custom python prometheus exporter that cumulates all data and additionally provides info about healthy/unhealthy status of each instance - {"__address__" = "127.0.0.1:10080", "instance" = "invidious.nerdvpn.de" }, - # Invidious companion metrics endpoint - {"__address__" = "192.42.6.11:8282", "instance" = "invidious-companion-1" }, - {"__address__" = "192.42.6.12:8282", "instance" = "invidious-companion-2" }, - {"__address__" = "192.42.6.13:8282", "instance" = "invidious-companion-3" }, - {"__address__" = "192.42.6.14:8282", "instance" = "invidious-companion-4" }, - {"__address__" = "192.42.6.15:8282", "instance" = "invidious-companion-5" }, - {"__address__" = "192.42.6.16:8282", "instance" = "invidious-companion-6" }, - {"__address__" = "192.42.6.17:8282", "instance" = "invidious-companion-7" }, - {"__address__" = "192.42.6.18:8282", "instance" = "invidious-companion-8" }, + {"__address__" = "127.0.0.1:10080", "instance" = "overall" }, + {"__address__" = "192.42.6.31:8282", "instance" = "invidious-companion-01" }, + {"__address__" = "192.42.6.32:8282", "instance" = "invidious-companion-02" }, + {"__address__" = "192.42.6.33:8282", "instance" = "invidious-companion-03" }, + {"__address__" = "192.42.6.34:8282", "instance" = "invidious-companion-04" }, + {"__address__" = "192.42.6.35:8282", "instance" = "invidious-companion-05" }, + {"__address__" = "192.42.6.36:8282", "instance" = "invidious-companion-06" }, + {"__address__" = "192.42.6.37:8282", "instance" = "invidious-companion-07" }, + {"__address__" = "192.42.6.38:8282", "instance" = "invidious-companion-08" }, + {"__address__" = "192.42.6.39:8282", "instance" = "invidious-companion-09" }, + {"__address__" = "192.42.6.40:8282", "instance" = "invidious-companion-10" }, ] scrape_interval = "30s" metrics_path = "/metrics" @@ -20,3 +22,24 @@ prometheus.scrape "scrape_invidious_companion_metrics" { forward_to = [prometheus.remote_write.metrics_service.receiver] } + + +// ------ +// ANUBIS +// ------ + +prometheus.scrape "scrape_anubis_metrics" { + targets = [ + {"__address__" = "192.42.30.2:9090", "instance" = "default" }, + {"__address__" = "192.42.30.3:9090", "instance" = "max" }, + ] + scrape_interval = "30s" + metrics_path = "/metrics" + job_name = "custom/anubis_collector" + + forward_to = [prometheus.remote_write.metrics_service.receiver] +} + +// ---------- +// CONFIG END +// ---------- diff --git a/prometheus_exporter/invidious-companion-metrics.py b/prometheus_exporter/invidious-companion-metrics.py index fc22675..bbb5b56 100755 --- a/prometheus_exporter/invidious-companion-metrics.py +++ b/prometheus_exporter/invidious-companion-metrics.py @@ -1,6 +1,5 @@ #!/usr/bin/python -import subprocess import requests import threading import time @@ -11,41 +10,23 @@ HOST = '127.0.0.1' PORT = 10080 base_ip_prefix = "192.42.6." -base_ip_start = 11 +base_ip_start = 31 update_interval = 30 -aggregated_metrics = {} +expected_backends = [f"http://{base_ip_prefix}{base_ip_start + i}:8282/metrics" for i in range(10)] +expected_container_names = [f"invidious-companion-{i:02d}" for i in range(1, 11)] -def get_containers(): - try: - result = subprocess.run( - ["docker", "ps", "--format", "{{.Names}}"], - capture_output=True, text=True, check=True - ) - containers = [line for line in result.stdout.splitlines() if line.startswith("invidious-companion-")] - containers.sort(key=lambda x: int(x.split('-')[2])) - return containers - except Exception as e: - print(f"Error getting container info: {e}") - return [] +aggregated_metrics = {} def fetch_metrics(): global aggregated_metrics while True: - containers = get_containers() - backend = [] - container_names = [] - for i, container in enumerate(containers): - ip = f"{base_ip_prefix}{base_ip_start + i}" - backend.append(f"http://{ip}:8282/metrics") - container_names.append(container) - sums = {} backend_down = 0 backend_down_list = [] backend_up_list = [] - for url, container_name in zip(backend, container_names): + for url, container_name in zip(expected_backends, expected_container_names): try: resp = requests.get(url, timeout=5) if resp.status_code != 200: @@ -70,9 +51,9 @@ def fetch_metrics(): except Exception as e: backend_down += 1 backend_down_list.append(container_name) - print(f"Error calling URL '{url}': {e}") + print(f"Fehler beim Abruf von {url}: {e}") - backend_total = len(backend) + backend_total = len(expected_backends) backend_up = backend_total - backend_down metrics = {} @@ -84,6 +65,13 @@ def fetch_metrics(): metrics["invidious_companion_healthy_total"] = backend_up metrics["invidious_companion_unhealthy_total"] = backend_down + try: + with open('/var/log/inv_network_load.log', 'r') as file: + network_load = file.read().replace('\n', '') + metrics["invidious_companion_network_load_percent"] = network_load + except Exception as e: + metrics["invidious_companion_network_load_percent"] = 0 + labeled_metrics = [] for ep in backend_up_list: labeled_metrics.append((f'invidious_companion_healthy{{container="{ep}"}}', 1)) @@ -101,6 +89,7 @@ class MetricsHandler(BaseHTTPRequestHandler): for name, value in metrics.items(): response += f"# TYPE {name} gauge\n{name} {value}\n" for labeled_name, value in labeled_metrics: + # labeled_name enthält schon Label-String, TYPE nicht nötig hier response += f"{labeled_name} {value}\n" self.send_response(200) self.send_header('Content-Type', 'text/plain; version=0.0.4') @@ -112,7 +101,7 @@ class MetricsHandler(BaseHTTPRequestHandler): def run_server(): server = HTTPServer((HOST, PORT), MetricsHandler) - print(f'Starting HTTP server for prometheus.scrape under http://{HOST}:{PORT}/metrics') + print(f'Starte HTTP-Server auf http://{HOST}:{PORT}/metrics') server.serve_forever() if __name__ == '__main__':