KRISH2507/Monitoring-and-Incident-Response

GitHub: KRISH2507/Monitoring-and-Incident-Response

一个基于 Docker Compose 的全栈监控与事件响应演示项目,集成 Prometheus、Grafana 和 Alertmanager 来演示微服务可观测性与告警闭环。

Stars: 0 | Forks: 0

# NovaSaaS — 监控与事件响应 ## 架构 ``` ┌──────────────────────────────────────────────────────────────────┐ │ Docker Compose Stack │ │ │ │ ┌──────────────┐ /metrics ┌─────────────────┐ │ │ │ orders- │◄──────────────│ Prometheus │ │ │ │ service │ │ :9090 │ │ │ │ :3000 │ └────────┬────────┘ │ │ │ │ │ alert rules │ │ │ Express API │ ┌────────▼────────┐ │ │ │ Winston logs │ │ Alertmanager │ │ │ │ prom-client │ │ :9093 │ │ │ └──────────────┘ └─────────────────┘ │ │ ▲ │ │ │ datasource │ │ ┌────────┴────────┐ │ │ │ Grafana │ │ │ │ :3001 │ │ │ └─────────────────┘ │ └──────────────────────────────────────────────────────────────────┘ ``` ## 前置条件 - [Docker Desktop](https://www.docker.com/products/docker-desktop/) (v24+) - Docker Compose v2 (`docker compose version`) - Node.js >= 18 (仅适用于不使用 Docker 的本地开发) ## 快速开始 ``` # 1. Clone repo git clone https://github.com/KRISH2507/Monitoring-and-Incident-Response.git cd Monitoring-and-Incident-Response # 启动 full stack docker compose up --build -d # 验证所有服务健康 docker compose ps ``` ## 生成流量 ### 正常流量 ``` for i in $(seq 1 50); do curl -s http://localhost:3000/api/orders > /dev/null curl -s http://localhost:3000/api/orders/42 > /dev/null done ``` ### 触发 HighErrorRate 告警 ``` # Error rate 超过 2%,告警在约 30 秒内触发 for i in $(seq 1 200); do curl -s http://localhost:3000/fail > /dev/null done ``` ## 访问 UI | 服务 | URL | 凭证 | |---------|-----|-------------| | Grafana | http://localhost:3001 | admin / admin | | Prometheus | http://localhost:9090 | — | | Alertmanager | http://localhost:9093 | — | | Orders API | http://localhost:3000 | — | ## Grafana Dashboard 首次启动时自动配置。导航至: **Grafana → Dashboards → NovaSaaS → NovaSaaS — Orders Service Observability** ### 4 个面板 | # | 面板 | 查询 | |---|-------|-------| | 1 | Request Rate (req/s) | `sum(rate(http_requests_total[1m])) by (route)` | | 2 | 5xx Error Rate (%) | `(sum(rate(http_errors_total{status_code=~"5.."}[1m])) / sum(rate(http_requests_total[1m]))) * 100` | | 3 | p50/p95 Latency | `histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le, route))` | | 4 | Active In-Flight Requests | `http_active_requests` | ## 告警规则 | 告警 | 条件 | 严重性 | |-------|-----------|----------| | `HighErrorRate` | 5xx rate > 2% 持续 30s | critical | | `HighRequestLatency` | p95 > 1s 持续 1m | warning | | `OrdersServiceDown` | 不可达持续 15s | critical | ## 关键文件 ``` . ├── app.js # Express app — metrics, logging, /fail ├── logger.js # Winston JSON logger ├── Dockerfile ├── docker-compose.yml ├── prometheus.yml ├── alert_rules.yml ├── alertmanager.yml ├── runbook.md # Incident response (3 failure modes) └── grafana/ ├── provisioning/ │ ├── datasources/prometheus.yml │ └── dashboards/dashboards.yml └── dashboards/orders-service.json ``` ## 销毁环境 ``` docker compose down # stop containers docker compose down -v # also wipe volumes ``` ## PromQL:为什么 sum() 很重要 ``` sum(rate(http_errors_total{status_code=~"5.."}[1m])) / sum(rate(http_requests_total[1m])) ``` 如果没有 `sum()`,Prometheus 会将标签集进行一对一匹配。如果某个 route 有错误,但没有匹配的 total-requests 序列(例如由于标签差异),除法将返回 NaN。`sum()` 会首先将所有序列合并为一个值,从而确保计算出正确且稳定的百分比。 有关完整的事件响应流程,请参阅 [runbook.md](./runbook.md)。
标签:Docker Compose, Grafana, MITM代理, SaaS, WSL, 告警响应, 版权保护, 自定义脚本, 自定义请求头, 请求拦截, 运维监控