"""Each router's 4xx and 5xx responses by status code The scraper folded traefik_service_requests_total{code} into a 4xx share and a 5xx share and dropped the code, so a problem couldn't say whether it was scanners probing (404), a login wall (401/403) or the app down (502/503/504) (#5711). One row per router, scrape and code that occurred; the page reads a router's codes over a time window, answered from the index alone. Revision ID: traefik_006_status_codes Revises: traefik_005_reload_at Create Date: 2026-10-14 """ from typing import Sequence, Union from alembic import op import sqlalchemy as sa revision: str = "traefik_006_status_codes" down_revision: Union[str, None] = "traefik_005_reload_at" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: op.create_table( "traefik_status_codes", sa.Column("id", sa.String(36), primary_key=True), sa.Column("router_name", sa.String(255), nullable=False), sa.Column("scraped_at", sa.DateTime(timezone=True), nullable=False), sa.Column("code", sa.String(8), nullable=False), sa.Column("count", sa.Integer, nullable=False), ) op.create_index("ix_traefik_status_codes_router_scraped", "traefik_status_codes", ["router_name", "scraped_at"], postgresql_include=["code", "count"]) op.create_index("ix_traefik_status_codes_scraped", "traefik_status_codes", ["scraped_at"]) def downgrade() -> None: op.drop_index("ix_traefik_status_codes_scraped", "traefik_status_codes") op.drop_index("ix_traefik_status_codes_router_scraped", "traefik_status_codes") op.drop_table("traefik_status_codes")