86 lines
2.7 KiB
Python
86 lines
2.7 KiB
Python
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() |