Files
authelia-metrics/main.py
T
2026-05-19 21:57:54 +01:00

71 lines
1.8 KiB
Python

import os
import time
from prometheus_client import start_http_server, Gauge, REGISTRY
from prometheus_remote_writer import RemoteWriter
from dotenv import load_dotenv
from libs.generate_metrics import aggregate, domain_imports
from libs.parse_caddyfile import parse
DOMAIN_FEATURE = Gauge(
"caddy_domain_imports",
"Binary status of domain features (1=enabled, 0=disabled)",
["domain", "feature"],
)
GLOBAL_STATS = Gauge(
"caddy_global_stats", "Aggregated counts of features across all domains", ["type"]
)
load_dotenv()
PROMETHEUS_URL: str = os.environ.get("PROMETHEUS_URL", "http://localhost:9090")
PROMETHEUS_REMOTE_WRITE_URL: str = os.environ.get(
"PROMETHEUS_REMOTE_WRITE_URL", "/api/v1/write"
)
PROMETHEUS_REMOTE_WRITE_TOKEN: str = os.environ.get(
"PROMETHEUS_REMOTE_WRITE_TOKEN", "test"
)
CADDY_PATH = os.environ.get("CADDY_PATH", "Caddyfile")
def load_caddyfile():
with open(CADDY_PATH, "r") as f:
return f.read()
class PrometheusWriter:
url: str = PROMETHEUS_URL
write_path: str = PROMETHEUS_REMOTE_WRITE_URL
token: str = PROMETHEUS_REMOTE_WRITE_TOKEN
def initialize_writer(self):
self.writer = RemoteWriter(
url=self.url + self.write_path,
headers={f"Authorization": "Bearer {self.token}"},
)
def __init__(self) -> None:
self.initialize_writer()
def write(self, data: dict):
self.writer.send([data])
def push_metrics(data):
for metric in data:
print(metric)
PrometheusWriter().write(metric)
def main():
caddy = load_caddyfile()
domains: dict[str, list[str]] = parse(caddy)
aggregated: list[dict] = aggregate(domains)
imports = domain_imports(domains)
push_metrics(aggregated)
push_metrics(imports)
if __name__ == "__main__":
main()