amit0101/sre-event-watchdog

GitHub: amit0101/sre-event-watchdog

一款 API 优先的智能可观测性工具,通过规则与 LLM 混合检测日志中的错误激增并触发告警,帮助 SRE 团队快速响应线上事件。

Stars: 0 | Forks: 0

# SRE Event Watchdog API 优先的智能可观测性与事件监控工具 — 摄取 JSONL 日志,检测错误激增(规则 + LLM),触发 webhook 告警,并在 React dashboard 上展示健康趋势。 ## 功能 - **日志摄取** — JSONL 上传、原始 body 和 JSON 批量 endpoint,支持可选的 API key - **指标** — 窗口化错误聚合、按 service 分解、可过滤的时间序列 - **混合检测** — 按 service 的 EWMA 基线、趋势上下文、关联性、快速路径(60秒)、AI 分析 - **高弹性** — OpenAI 缓存、payload 截断、API 故障时自动降级 - **告警** — 去重、`open` → `ack` → `resolved` 生命周期、Slack Block Kit、webhook 重试 - **Dashboard** — **Ops 视图**(默认,监控风格)+ **经典视图**切换;图表过滤器;确认/解决操作;质量面板 ## 架构 ``` flowchart LR generator[generate_logs.py] -->|JSONL| ingest[POST_logs_ingest] ingest --> ingestion[IngestionService] ingestion --> db[(log_events)] db --> metrics[MetricsService] metrics --> detection[RuleDetection] detection -->|spike| ai[AIAnalyzer] detection -->|acute| fast[FastPath] ai --> alerts[(alerts)] fast --> alerts alerts --> webhook[WebhookDispatcher] webhook --> mock[mock_webhook] db --> dashboard[ReactDashboard] alerts --> dashboard ``` ## 环境要求 - Python 3.13 - Node.js 18+(用于构建 dashboard) - OpenAI API key ## 快速开始 ``` # 后端设置 python3.13 -m venv .venv source .venv/bin/activate pip install -r requirements.txt cp .env.example .env # 在 .env 中设置 OPENAI_API_KEY # 运行 API(当 frontend/dist 存在时提供已构建的 dashboard) uvicorn app.main:app --reload --host 127.0.0.1 --port 8000 ``` ### 构建 dashboard(单服务器演示) ``` cd frontend npm install npm run build cd .. uvicorn app.main:app --host 127.0.0.1 --port 8000 # Dashboard: http://127.0.0.1:8000/(默认为 Ops 视图;在右上角切换至 Classic) ``` ### 前端开发模式(热重载 + API 代理) ``` # 终端 1 uvicorn app.main:app --reload --port 8000 # 终端 2 cd frontend && npm install && npm run dev # Dashboard 开发: http://127.0.0.1:5173 ``` ## 演示导览 ``` # 1. 生成带有错误激增的日志 python generate_logs.py --spike -n 150 -o spike.jsonl # 关联级联(auth → payment) python generate_logs.py --correlated-spike -n 150 -o correlated.jsonl # spike 窗口期间的高延迟错误 python generate_logs.py --spike --latency-spike -n 150 -o latency.jsonl # 2. 摄取 curl -F "file=@spike.jsonl" http://127.0.0.1:8000/logs/ingest # 3. 查看 metrics curl "http://127.0.0.1:8000/metrics/errors?window_minutes=60" curl "http://127.0.0.1:8000/metrics/timeseries?window_minutes=60&level=ERROR" curl "http://127.0.0.1:8000/metrics/levels?window_minutes=60" # 4. 运行检测 + AI enrichment + webhook curl -X POST http://127.0.0.1:8000/analyze -H "Content-Type: application/json" -d '{"window_minutes":5}' # 5. Alert 生命周期 curl http://127.0.0.1:8000/alerts curl -X PATCH http://127.0.0.1:8000/alerts/1/ack -H "Content-Type: application/json" -d '{"ack_by":"oncall"}' curl -X PATCH http://127.0.0.1:8000/alerts/1/resolution -H "Content-Type: application/json" -d '{"resolution":"true_positive"}' # 6. 质量报告 curl "http://127.0.0.1:8000/alerts/quality-report?days=7" # 7. 检查 mock webhook 回执 curl http://127.0.0.1:8000/mock-webhook/received ``` 或者在摄取日志后使用 dashboard 上的 **分析** 按钮。 ## API Endpoints | 方法 | 路径 | 描述 | |--------|------|-------------| | POST | `/logs/ingest` | 上传 JSONL 日志文件 | | POST | `/logs/ingest/raw` | 摄取原始 JSONL body | | POST | `/logs/ingest/batch` | 摄取包含多个事件的 JSON 数组 | | GET | `/metrics/errors` | 按时间桶分组的错误计数/比率 | | GET | `/metrics/timeseries` | 可过滤的图表序列(level, service) | | GET | `/metrics/levels` | 按 level 计数,用于过滤器标签 | | GET | `/metrics/health` | 后端健康评分 | | GET | `/metrics/services` | 按 service 划分的错误分解 | | POST | `/analyze` | 运行激增检测、AI 分析、告警 + webhook | | GET | `/alerts` | 列出最近的告警 | | PATCH | `/alerts/{id}/ack` | 确认告警(`open` → `ack`) | | PATCH | `/alerts/{id}/resolution` | 解决告警(`true_positive`、`false_positive` 等) | | GET | `/alerts/quality-report` | 告警质量指标 | | GET | `/health` | 存活探针 | | GET | `/ready` | 就绪状态(DB 可达) | | POST | `/mock-webhook` | 本地 webhook 接收端 | | GET | `/docs` | OpenAPI/Swagger UI | ## 日志格式(JSONL) ``` {"timestamp":"2026-07-12T10:00:00Z","level":"ERROR","service":"payment-service","message":"timeout","trace_id":"abc-123","host":"host-a","pod":"pod-1","region":"us-east-1","http_status":503,"latency_ms":2400} ``` 字段:`timestamp` (ISO8601)、`level` (`INFO|WARN|ERROR`)、`service`、`message`,以及可选的 `trace_id`、`host`、`pod`、`region`、`http_status`、`latency_ms`。 ## 环境变量 | 变量 | 必填 | 默认值 | 描述 | |----------|----------|---------|-------------| | `OPENAI_API_KEY` | 是 | — | OpenAI API key | | `OPENAI_MODEL` | 否 | `gpt-4o-mini` | 用于 AI 分析的模型 | | `DATABASE_URL` | 否 | `sqlite:///./watchdog.db` | SQLAlchemy DB URL | | `WEBHOOK_URL` | 否 | `http://127.0.0.1:8000/mock-webhook` | 告警 webhook 目标地址 | | `WEBHOOK_MAX_RETRIES` | 否 | `3` | webhook 投递重试次数 | | `FAST_PATH_INTERVAL_SECONDS` | 否 | `18` | 快速路径调度器频率 | | `INGEST_API_KEY` | 否 | — | 可选的摄取认证 header | ## 生产环境数据库 本地开发使用 SQLite。在生产环境中,请将 `DATABASE_URL` 设置为 Postgres(例如 Supabase): ``` DATABASE_URL=postgresql+psycopg://user:pass@host:5432/watchdog ``` 安装驱动:`pip install psycopg[binary]`。无需修改任何应用代码。 ## 测试 ``` pytest -v ``` ## 项目结构 ``` app/ main.py # FastAPI app factory config.py # pydantic-settings db.py, models.py # SQLAlchemy layer schemas.py # Pydantic DTOs api/ # REST routers services/ # ingestion, metrics, detection, ai, alerting, correlation, fast_path frontend/ # React SPA (Vite + Recharts) — Ops + Classic views tests/ # pytest suite (62 cases) generate_logs.py # synthetic log generator (--spike, --correlated-spike, --latency-spike) sample_logs.jsonl # sample data DEVELOPMENT_PLAN.md # build progress tracker DETECTION_ENHANCEMENTS.md # statistical detection phases 0–9 DECK_OUTLINE.md # presentation outline PRESENTATION.md # submission deck (Markdown source) docs/presentation/ # print-ready PDF + rendered diagram assets prompts.md # prompt audit log ``` ## 演示文稿 - **Markdown:** [`PRESENTATION.md`](PRESENTATION.md) - **PDF (打印就绪):** [`docs/presentation/SRE_Event_Watchdog_Presentation.pdf`](docs/presentation/SRE_Event_Watchdog_Presentation.pdf) 使用 `python scripts/build_presentation.py` 重新生成(选项详见 [`SUBMISSION.md`](SUBMISSION.md))。 ## 生产环境就绪度 当前的 MVP 提供了一个可运行的端到端监控工具。生产环境将填补以下空白(完整详情见演示文稿第 15 页): | 领域 | MVP (当前版本) | 生产环境路径 | |------|---------------|-----------------| | 数据库 | SQLite,可通过 `DATABASE_URL` 替换 | Postgres + 连接池 | | 迁移 | Alembic 版本控制 | 读副本、按时间分区的事件 | | 摄取 | 批量 POST | 队列/流处理 (Kafka/Redis) + workers | | 检测 | 基于聚合数据的规则 + LLM | 流式聚合或时间序列数据库 | | 认证 | 可选的 `INGEST_API_KEY` | OAuth2/OIDC,密钥管理器 | | 告警 | 去重、生命周期、webhook 重试 | 冷静期、严重性路由、多渠道 | | 可观测性 | `/health`、`/ready` | 结构化 JSON 日志、请求 ID、Prometheus、链路追踪 | | CI/CD | 本地 pytest | GitHub Actions、Dockerfile、docker-compose | | 数据保留 | 保留所有事件 | 汇总数据、TTL、归档层级 | **已覆盖:** pydantic-settings、DB 索引、LLM 超时/重试/降级、分析缓存、告警去重 + `open`→`ack`→`resolved`、Slack Block Kit、62 个 pytest 测试用例。 ## 许可证 MIT (演示 / 教学项目)
标签:API集成, MITM代理, React, SRE, Syscalls, 偏差过滤, 可观测性, 安全规则引擎, 异常检测, 测试用例, 监控告警, 逆向工具