import requests import json import os from dotenv import load_dotenv # Load environment variables from .env file load_dotenv() # 🔑 Load Hetzner API Token HETZNER_API_TOKEN = os.getenv("HETZNER_API_TOKEN") # Check if token is loaded if not HETZNER_API_TOKEN: raise ValueError("❌ HETZNER_API_TOKEN is missing! Make sure it's set in the .env file.") # 📂 Path to the Prometheus service discovery file PROMETHEUS_TARGETS_FILE = "/opt/phx/main/config/hetzner_targets.json" ERROR_LOG_FILE = "/opt/phx/main/config/hetzner_error_servers.json" # 📌 Hetzner API URL HETZNER_API_URL = os.getenv("HETZNER_API_URL") # Check if API URL is loaded if not HETZNER_API_URL: raise ValueError("❌ HETZNER_API_URL is missing! Make sure it's set in the .env file.") # 📡 Fetch Hetzner server list def get_hetzner_servers(): headers = {"Authorization": f"Bearer {HETZNER_API_TOKEN}"} response = requests.get(HETZNER_API_URL, headers=headers) if response.status_code != 200: print(f"❌ Error fetching servers: {response.text}") return [] return response.json().get("servers", []) # 🏗️ Generate Prometheus JSON file def generate_prometheus_sd_config(): servers = get_hetzner_servers() targets = [] error_servers = [] for server in servers: if "public_net" in server and "ipv4" in server["public_net"]: ipv4 = server["public_net"]["ipv4"]["ip"] server_name = server["name"] datacenter = server["datacenter"]["location"]["name"] targets.append({ "targets": [f"{ipv4}:9100"], "labels": { "instance": server_name, "datacenter": datacenter } }) else: # Log the server that couldn't be added error_servers.append({ "server_id": server["id"], "name": server["name"], "status": server["status"], "datacenter": server["datacenter"]["location"]["name"], "reason": "Missing public_net or IPv4" }) # Save JSON to Prometheus target file with open(PROMETHEUS_TARGETS_FILE, "w") as f: json.dump(targets, f, indent=4) print(f"✅ Updated Prometheus targets in {PROMETHEUS_TARGETS_FILE}") # Save error logs if any servers were skipped if error_servers: with open(ERROR_LOG_FILE, "w") as f: json.dump(error_servers, f, indent=4) print(f"⚠️ Some servers could not be added. Check {ERROR_LOG_FILE} for details.") else: print("✅ All servers were added successfully, no errors detected.") # 🔄 Run the script if __name__ == "__main__": generate_prometheus_sd_config()