- Remove old review reports (keep latest only) - Move docs/ to deploy/docs-backup/ - Move performance-testing/ to deploy/ - Clean up test output files - Organize root directory
265 lines
7.9 KiB
Markdown
265 lines
7.9 KiB
Markdown
# Sub2API 监控栈
|
||
|
||
基于 Prometheus + Grafana + Loki + Jaeger 的完整可观测性解决方案。
|
||
|
||
## 架构概览
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────┐
|
||
│ 监控栈架构 │
|
||
├─────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
||
│ │ Prometheus │ │ Loki │ │ Jaeger │ │
|
||
│ │ (指标存储) │ │ (日志存储) │ │ (追踪存储) │ │
|
||
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
|
||
│ │ │ │ │
|
||
│ └────────────────┼────────────────┘ │
|
||
│ ▼ │
|
||
│ ┌─────────────┐ │
|
||
│ │ Grafana │ │
|
||
│ │ (可视化) │ │
|
||
│ └─────────────┘ │
|
||
│ │
|
||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
||
│ │ Promtail │ │ Node Exp │ │ cAdvisor │ │
|
||
│ │ (日志收集) │ │ (主机指标) │ │ (容器指标) │ │
|
||
│ └─────────────┘ └─────────────┘ └─────────────┘ │
|
||
│ │
|
||
└─────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
## 快速开始
|
||
|
||
### 1. 准备工作
|
||
|
||
```bash
|
||
cd deploy/monitoring
|
||
|
||
# 创建数据目录
|
||
mkdir -p prometheus-data grafana-data loki-data alertmanager-data
|
||
|
||
# 复制环境变量配置
|
||
cp .env.example .env
|
||
|
||
# 编辑 .env 文件,配置你的告警通知方式
|
||
vim .env
|
||
```
|
||
|
||
### 2. 启动监控栈
|
||
|
||
```bash
|
||
docker-compose -f docker-compose.monitoring.yml up -d
|
||
```
|
||
|
||
### 3. 访问服务
|
||
|
||
| 服务 | URL | 默认账号 |
|
||
|------|-----|----------|
|
||
| Grafana | http://localhost:3000 | admin/admin |
|
||
| Prometheus | http://localhost:9090 | - |
|
||
| Jaeger UI | http://localhost:16686 | - |
|
||
| Alertmanager | http://localhost:9093 | - |
|
||
|
||
### 4. 配置 Sub2API 应用指标暴露
|
||
|
||
在 Sub2API 后端代码中集成 Prometheus 指标:
|
||
|
||
```go
|
||
import (
|
||
"github.com/prometheus/client_golang/prometheus/promhttp"
|
||
)
|
||
|
||
// 在路由中添加 metrics 端点
|
||
router.GET("/metrics", gin.WrapH(promhttp.Handler()))
|
||
```
|
||
|
||
### 5. 查看 Dashboard
|
||
|
||
1. 登录 Grafana (http://localhost:3000)
|
||
2. 导航到 Dashboards -> Sub2API
|
||
3. 查看以下预设 Dashboard:
|
||
- **系统概览** - 整体健康度和关键指标
|
||
- **SLO 监控** - 服务水平目标达成情况
|
||
- **网关性能** - API 网关详细性能指标
|
||
- **上游健康** - 上游 AI 服务状态
|
||
|
||
## 配置说明
|
||
|
||
### Prometheus 配置
|
||
|
||
配置文件:`prometheus/prometheus.yml`
|
||
|
||
主要配置项:
|
||
- 抓取目标(Sub2API、Node Exporter、cAdvisor)
|
||
- 告警规则路径
|
||
- Alertmanager 地址
|
||
- 数据保留策略
|
||
|
||
### 告警规则
|
||
|
||
配置文件:`prometheus/rules/sub2api-alerts.yml`
|
||
|
||
预设告警:
|
||
- **SLO 告警** - 基于错误预算燃烧率的多窗口告警
|
||
- **延迟告警** - P99/P95 延迟阈值告警
|
||
- **错误率告警** - HTTP 5xx 错误率告警
|
||
- **基础设施告警** - CPU、内存、磁盘、连接池
|
||
- **业务告警** - QPS、账号切换频率
|
||
|
||
### Alertmanager 配置
|
||
|
||
配置文件:`alertmanager/config.yml`
|
||
|
||
支持的通知渠道:
|
||
- Email
|
||
- Slack
|
||
- PagerDuty
|
||
- Webhook
|
||
|
||
### Grafana 配置
|
||
|
||
- **数据源**:Prometheus、Loki、Jaeger
|
||
- **Dashboard**:系统概览、SLO 监控、错误分析
|
||
- **告警**:可视化告警配置
|
||
|
||
### Loki 日志配置
|
||
|
||
配置文件:`loki/loki-config.yaml`
|
||
|
||
- 日志收集:Promtail 从 Docker 容器和文件收集
|
||
- 日志查询:Grafana Explore 中查询日志
|
||
- 日志告警:基于日志内容的告警
|
||
|
||
## 常用查询
|
||
|
||
### Prometheus 查询示例
|
||
|
||
```promql
|
||
# 当前可用性
|
||
1 - (sum(rate(sub2api_http_requests_total{status=~"5.."}[5m])) / sum(rate(sub2api_http_requests_total[5m])))
|
||
|
||
# P99 延迟
|
||
histogram_quantile(0.99, sum(rate(sub2api_http_request_duration_seconds_bucket[5m])) by (le))
|
||
|
||
# QPS
|
||
sum(rate(sub2api_http_requests_total[1m]))
|
||
|
||
# 错误预算燃烧率
|
||
(sum(rate(sub2api_http_requests_total{status=~"5.."}[1h])) / sum(rate(sub2api_http_requests_total[1h]))) / 0.0005
|
||
```
|
||
|
||
### Loki 日志查询示例
|
||
|
||
```logql
|
||
# 查看错误日志
|
||
{job="sub2api"} |= "error" | json
|
||
|
||
# 查看特定请求的日志
|
||
{job="sub2api"} |= "trace_id=\"xxx\""
|
||
|
||
# 按错误类型统计
|
||
sum by (error_type) (rate({job="sub2api"} |= "error" | json [5m]))
|
||
```
|
||
|
||
## 故障排查
|
||
|
||
### 检查服务状态
|
||
|
||
```bash
|
||
# 查看所有服务状态
|
||
docker-compose -f docker-compose.monitoring.yml ps
|
||
|
||
# 查看服务日志
|
||
docker-compose -f docker-compose.monitoring.yml logs -f prometheus
|
||
docker-compose -f docker-compose.monitoring.yml logs -f grafana
|
||
docker-compose -f docker-compose.monitoring.yml logs -f loki
|
||
```
|
||
|
||
### 常见问题
|
||
|
||
1. **Prometheus 无法抓取指标**
|
||
- 检查 Sub2API `/metrics` 端点是否可访问
|
||
- 检查网络连通性
|
||
- 查看 Prometheus Targets 页面
|
||
|
||
2. **Grafana 无法显示数据**
|
||
- 检查数据源配置
|
||
- 验证 Prometheus 查询
|
||
- 查看浏览器开发者工具
|
||
|
||
3. **告警不触发**
|
||
- 检查告警规则语法
|
||
- 验证 Alertmanager 配置
|
||
- 查看 Alertmanager 状态页面
|
||
|
||
## 扩展配置
|
||
|
||
### 添加自定义 Dashboard
|
||
|
||
1. 在 Grafana 中创建 Dashboard
|
||
2. 导出 JSON 文件
|
||
3. 保存到 `grafana/dashboards/` 目录
|
||
4. 重启 Grafana 服务
|
||
|
||
### 添加自定义告警规则
|
||
|
||
1. 编辑 `prometheus/rules/sub2api-alerts.yml`
|
||
2. 添加新的告警规则
|
||
3. 重新加载 Prometheus 配置:
|
||
```bash
|
||
curl -X POST http://localhost:9090/-/reload
|
||
```
|
||
|
||
### 集成外部服务
|
||
|
||
- **PagerDuty**: 配置 `PAGERDUTY_WEBHOOK_URL`
|
||
- **Slack**: 配置 `SLACK_WEBHOOK_URL`
|
||
- **自定义 Webhook**: 修改 `alertmanager/config.yml`
|
||
|
||
## 维护操作
|
||
|
||
### 备份数据
|
||
|
||
```bash
|
||
# 备份 Prometheus 数据
|
||
tar czf prometheus-backup-$(date +%Y%m%d).tar.gz prometheus-data/
|
||
|
||
# 备份 Grafana 配置
|
||
tar czf grafana-backup-$(date +%Y%m%d).tar.gz grafana-data/
|
||
```
|
||
|
||
### 清理旧数据
|
||
|
||
```bash
|
||
# Prometheus 数据清理 (保留30天)
|
||
curl -X POST -g 'http://localhost:9090/api/v1/admin/tsdb/delete_series?match[]={__name__=~".+"}'
|
||
|
||
# Loki 数据自动清理 (按配置保留)
|
||
```
|
||
|
||
### 升级组件
|
||
|
||
```bash
|
||
# 更新镜像版本
|
||
vim docker-compose.monitoring.yml
|
||
|
||
# 重新部署
|
||
docker-compose -f docker-compose.monitoring.yml pull
|
||
docker-compose -f docker-compose.monitoring.yml up -d
|
||
```
|
||
|
||
## 参考文档
|
||
|
||
- [Prometheus 文档](https://prometheus.io/docs/)
|
||
- [Grafana 文档](https://grafana.com/docs/)
|
||
- [Loki 文档](https://grafana.com/docs/loki/)
|
||
- [Jaeger 文档](https://www.jaegertracing.io/docs/)
|
||
- [Alertmanager 文档](https://prometheus.io/docs/alerting/latest/alertmanager/)
|
||
|
||
## 支持
|
||
|
||
如有问题,请联系:
|
||
- SRE Team: sre@sub2api.org
|
||
- On-Call: oncall@sub2api.org
|