Files

265 lines
7.9 KiB
Markdown
Raw Permalink Normal View History

# 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