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()