8f98bdd273
- ruff.toml: select E/W/F/I/N rules, line-length=120, drop legacy ignores - Auto-fix: sort 82 import blocks (isort), remove 29 unused imports, strip 6 trailing-whitespace blank lines in docstrings - main.py: move setup_logging and settings imports to top (E402) - errors.py: noqa N818 on DDD exception names (96 call sites, safe) - intel_service.py: noqa N817 for universal ET alias - atomic/elastic/sigma import services: move _MAX_UNCOMPRESSED_SIZE and _MAX_ENTRIES to module level (N806) - compliance_import_service.py: move SAMPLE_CONTROLS / CIS_CONTROLS to module level; wrap long description strings (N806 + E501) - snapshot_service.py: move STATUS_ORDER dict to module level (N806) - sigma_import_service.py: remove dead dedup_key expression (F841) - threat_actor_import_service.py: remove dead stix_to_actor expression (F841) - data_source.py, seed_demo.py, campaign_scheduler_service.py, lolbas_import_service.py: wrap lines exceeding 120 chars (E501) - d3fend_import_service.py: per-file E501 ignore (data file with long strings) All 439 unit tests pass. ruff check app/ → All checks passed!
58 lines
1.8 KiB
Python
58 lines
1.8 KiB
Python
"""Operational metrics endpoints — MTTD, MTTR, Detection Efficacy, and more.
|
|
|
|
Provides operational KPIs for security teams with trend analysis
|
|
and team-level breakdowns.
|
|
"""
|
|
|
|
from fastapi import APIRouter, Depends, Query
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.database import get_db
|
|
from app.dependencies.auth import get_current_user
|
|
from app.models.user import User
|
|
from app.services.operational_metrics_service import (
|
|
get_metrics_by_team,
|
|
get_operational_trend,
|
|
)
|
|
|
|
router = APIRouter(prefix="/metrics/operational", tags=["operational-metrics"])
|
|
|
|
|
|
# ── GET /metrics/operational ──────────────────────────────────────────
|
|
|
|
|
|
@router.get("")
|
|
def operational_metrics(
|
|
db: Session = Depends(get_db),
|
|
current_user: User = Depends(get_current_user),
|
|
):
|
|
"""Get all operational metrics (MTTD, MTTR, etc.) — cached for 5 min."""
|
|
from app.services.score_cache import get_operational_metrics_cached
|
|
|
|
return get_operational_metrics_cached(db)
|
|
|
|
|
|
# ── GET /metrics/operational/trend ────────────────────────────────────
|
|
|
|
|
|
@router.get("/trend")
|
|
def operational_trend(
|
|
period: str = Query("90d", pattern="^(30d|90d|1y)$"),
|
|
db: Session = Depends(get_db),
|
|
current_user: User = Depends(get_current_user),
|
|
):
|
|
"""Get weekly trend data for operational metrics."""
|
|
return get_operational_trend(db, period)
|
|
|
|
|
|
# ── GET /metrics/operational/by-team ──────────────────────────────────
|
|
|
|
|
|
@router.get("/by-team")
|
|
def metrics_by_team(
|
|
db: Session = Depends(get_db),
|
|
current_user: User = Depends(get_current_user),
|
|
):
|
|
"""Get metrics broken down by Red Team vs Blue Team."""
|
|
return get_metrics_by_team(db)
|