aryaman22-hubb/Monitoring-and-Incident-Response
GitHub: aryaman22-hubb/Monitoring-and-Incident-Response
一套基于 Docker Compose 的容器化可观测性技术栈,为 Node.js 应用提供指标采集、日志记录、可视化仪表盘和告警通知的完整监控能力。
Stars: 0 | Forks: 0
# 监控与事件响应(可观测性技术栈)
本仓库包含一个可用于生产环境、完全容器化的可观测性技术栈,专为 Node.js + Express 应用程序构建。它集成了指标跟踪、结构化 JSON 日志记录、仪表盘、告警规则以及通知端点。
## 架构图
```
+-----------------------+
| |
+------------->+ Grafana +<------------+
| | (Port 3001) | |
| +-----------+-----------+ |
| | |
| Queries | Reads |
| v |
+---------+-----------+ Scrapes | +-------------+-------+
| +<-------------+ | |
| Prometheus | | Alertmanager |
| (Port 9090) +------------------------->+ (Port 9093) |
| | Sends Alerts | |
+---------^-----------+ +----------+----------+
| |
| Scrapes | Sends Webhook
| | (Alert details)
| v
+---------+-----------+ +----------+----------+
| | | |
| Node.js App +<-------------------------+ Node.js App |
| (Express/Winston) | | POST /webhook |
| (Port 3000) | | |
+---------------------+ +---------------------+
```
## 使用的技术
* **后端:** Node.js、Express、Winston(结构化 JSON Logger)、prom-client
* **可观测性:** Prometheus、Alertmanager、Grafana
* **部署:** Docker、Docker Compose
## 技术栈的设置与运行
要构建并启动整个技术栈:
```
docker-compose up --build
```
验证所有容器是否健康:
```
docker ps
```
### 访问 URL
| 服务 | 端口 | 端点 URL | 凭证 / 备注 |
| :--- | :--- | :--- | :--- |
| **Node.js App** | `3000` | `http://localhost:3000` | 暴露应用端点 |
| **Prometheus** | `9090` | `http://localhost:9090` | 告警规则和抓取目标界面 |
| **Grafana** | `3001` | `http://localhost:3001` | 预配置管理员模式 / 仪表盘自动加载 |
| **Alertmanager** | `9093` | `http://localhost:9093` | 通知路由和活动告警状态 |
## 流量生成与验证
为了验证监控是否正常工作并填充 Grafana 图表,您可以生成流量。
### 1. 正常流量循环
在终端中运行此 curl 命令,以持续请求 `/` 和 `/health` 端点:
```
for i in {1..50}; do curl -s http://localhost:3000/ > /dev/null; curl -s http://localhost:3000/health > /dev/null; sleep 0.5; done
```
### 2. 触发告警(`HighErrorRate`)
当 HTTP 500 错误率超过 **2%** 时,将触发告警条件。快速请求 `/fail` 端点(该端点会随机失败并返回 500 状态码):
```
for i in {1..60}; do curl -s http://localhost:3000/fail; sleep 0.1; done
```
### 3. 观察告警的执行过程
1. **Prometheus UI:** 导航到 `http://localhost:9090/alerts`。您将看到 `HighErrorRate` 从 `Pending` 变为 `Firing`。
2. **Node 应用日志:** 当 Alertmanager 触发时,它将 webhook 路由到 Node 应用程序。检查日志:
docker logs node-app | grep "Alertmanager Notification Received"
您将看到完全序列化的告警 JSON 作为 Winston 日志事件清晰地打印到 stdout 中。
## 系统配置详情
### 1. 日志记录
Winston 被配置为以单行 JSON 格式写入日志。每条日志包括:
* `timestamp`
* 日志 `level`(`info`、`error`)
* `requestId`(分配给每个请求的关联 UUID)
* 请求的 `method`、`path`、`status` 和 `responseTimeMs`
* HTTP 500 / 异常情况下的错误堆栈跟踪位于 `stack` 字段下
### 2. 指标
`prom-client` 收集 Node.js 进程指标(GC、内存使用、CPU)和自定义 HTTP 指标:
* `http_requests_total`:跟踪总请求数的 Counter,包含 `method`、`route` 和 `status` 标签。
* `http_request_duration_seconds`:测量响应延迟的 Histogram。
* `node_active_requests`:在请求开始时递增、在终止时递减的 Gauge。
### 3. Alertmanager 配置
路由规则将所有处于 firing 状态的触发器映射到后端 webhook 路径 `http://app:3000/webhook`。
### 4. Grafana 仪表盘
使用 JSON 规范自动配置。它包含 6 个面板:
1. **总请求数**
2. **活动请求数**
3. **错误率 %**(低于 2% 显示绿色,高于 2% 变为红色)
4. **请求/秒(按路由)**
5. **P95 延迟**
6. **按状态码划分的请求数**
## Runbook
有关 `HighErrorRate` 告警触发时的诊断和恢复步骤,请参阅 [runbook.md](file:///d:/kalvium%20assignment/Monitoring-and-Incident-Response/runbook.md)。
标签:API集成, Docker, GNU通用公共许可证, Grafana, MITM代理, Node.js, 可观测性, 安全防御评估, 版权保护, 监控告警, 自定义脚本, 自定义请求头, 请求拦截, 运维