diff --git a/plugins/__init__.py b/plugins/__init__.py new file mode 100644 index 0000000..1648f8e --- /dev/null +++ b/plugins/__init__.py @@ -0,0 +1 @@ +# plugins/__init__.py diff --git a/plugins/traefik/__init__.py b/plugins/traefik/__init__.py new file mode 100644 index 0000000..abdd04d --- /dev/null +++ b/plugins/traefik/__init__.py @@ -0,0 +1,25 @@ +# plugins/traefik/__init__.py +from __future__ import annotations +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from quart import Quart + +_app: "Quart | None" = None + + +def setup(app: "Quart") -> None: + global _app + _app = app + # Import model to register with SQLAlchemy metadata + from plugins.traefik.models import TraefikMetric # noqa: F401 + + +def get_scheduled_tasks() -> list: + from plugins.traefik.scheduler import make_scrape_task + return [make_scrape_task(_app)] + + +def get_blueprint(): + from plugins.traefik.routes import traefik_bp + return traefik_bp diff --git a/plugins/traefik/models.py b/plugins/traefik/models.py new file mode 100644 index 0000000..d364777 --- /dev/null +++ b/plugins/traefik/models.py @@ -0,0 +1,23 @@ +# plugins/traefik/models.py +from __future__ import annotations +import uuid +from datetime import datetime, timezone +from sqlalchemy import DateTime, Float, String +from sqlalchemy.orm import Mapped, mapped_column +from fablednetmon.models.base import Base + + +class TraefikMetric(Base): + __tablename__ = "traefik_metrics" + + id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid.uuid4())) + router_name: Mapped[str] = mapped_column(String(255), nullable=False) + scraped_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), nullable=False, default=lambda: datetime.now(timezone.utc) + ) + request_rate: Mapped[float] = mapped_column(Float, nullable=False) + error_rate_4xx_pct: Mapped[float] = mapped_column(Float, nullable=False) + error_rate_5xx_pct: Mapped[float] = mapped_column(Float, nullable=False) + latency_p50_ms: Mapped[float] = mapped_column(Float, nullable=False) + latency_p95_ms: Mapped[float] = mapped_column(Float, nullable=False) + latency_p99_ms: Mapped[float] = mapped_column(Float, nullable=False) diff --git a/plugins/traefik/plugin.yaml b/plugins/traefik/plugin.yaml new file mode 100644 index 0000000..a3c63ce --- /dev/null +++ b/plugins/traefik/plugin.yaml @@ -0,0 +1,10 @@ +# plugins/traefik/plugin.yaml +name: traefik +version: "1.0.0" +description: "Traefik reverse proxy metrics integration" +author: "" +min_app_version: "0.1.0" + +config: + metrics_url: "http://localhost:8080/metrics" + scrape_interval_seconds: 60