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, 告警响应, 版权保护, 自定义脚本, 自定义请求头, 请求拦截, 运维监控