71 lines
1.8 KiB
Python
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()
|