8.7 KiB
可观测性增强部署结果
部署时间: 2025-12-20 执行人: Claude AI 状态: ✅ 核心功能已完成
📋 已完成的工作
1. ✅ 发现现有 Exporter
在探索过程中发现,Postgres 和 Redis 的 Helm Chart 已经内置了 metrics exporter:
- Postgres Exporter:
postgres-postgresql-metrics.data.svc.cluster.local:9187 - Redis Exporter:
redis-metrics.data.svc.cluster.local:9121
这意味着不需要部署额外的 exporter,只需配置 Prometheus 抓取即可。
2. ✅ 更新 Prometheus 配置
文件: monitoring/prometheus/prometheus-configmap-no-rules.yaml
新增 Scrape Jobs:
# Postgres Exporter (data namespace)
- job_name: 'postgres-exporter'
static_configs:
- targets: ['postgres-postgresql-metrics.data.svc.cluster.local:9187']
# Redis Exporter (data namespace)
- job_name: 'redis-exporter'
static_configs:
- targets: ['redis-metrics.data.svc.cluster.local:9121']
# Loki 自监控
- job_name: 'loki'
static_configs:
- targets: ['loki.logging.svc.cluster.local:3100']
# Tempo 自监控
- job_name: 'tempo'
static_configs:
- targets: ['tempo.tracing.svc.cluster.local:3200']
# Grafana 自监控
- job_name: 'grafana'
static_configs:
- targets: ['grafana.monitoring.svc.cluster.local:3000']
# 业务应用自动发现
- job_name: 'business-services'
kubernetes_sd_configs:
- role: service
# 通过 annotation 自动发现
应用命令:
kubectl apply -f monitoring/prometheus/prometheus-configmap-no-rules.yaml
kubectl delete pod -l app=prometheus -n monitoring
状态: ✅ Prometheus 正常运行
3. ✅ 更新 Grafana 数据源配置
文件: monitoring/grafana/datasources-loki-tempo-enhanced.yaml
新增功能:
- ✅ Loki → Tempo 跳转(支持 JSON、KV 等多种 trace_id 格式)
- ✅ Tempo → Loki 跳转(自动关联 namespace/pod/container)
- ✅ Tempo → Prometheus 指标关联(RED metrics)
应用命令:
kubectl apply -f monitoring/grafana/datasources-loki-tempo-enhanced.yaml
kubectl rollout restart deployment/grafana -n monitoring
状态: ✅ Grafana 数据源已更新
4. 📊 创建的文档和工具
配置文件
monitoring/prometheus/prometheus-configmap-data-ns.yaml- 针对 data namespace 的完整配置monitoring/prometheus/prometheus-configmap-no-rules.yaml- 简化版(无告警规则)monitoring/grafana/datasources-loki-tempo-enhanced.yaml- 增强的数据源配置monitoring/prometheus/rules/postgres-alerts.yml- Postgres 告警规则monitoring/prometheus/rules/redis-alerts.yml- Redis 告警规则monitoring/prometheus/rules/k3s-operational-alerts.yml- K3s 告警规则
文档
OBSERVABILITY-ENHANCEMENT-GUIDE.md- 完整使用指南 ⭐DEPLOYMENT-SUMMARY-OBSERVABILITY.md- 部署总结DELIVERABLES.md- 交付清单docs/observability/business-instrumentation-spring-boot.md- Spring Boot 集成指南docs/observability/business-instrumentation-python.md- Python 集成指南docs/observability/pg-stat-statements-setup.md- pg_stat_statements 启用指南
工具脚本
deploy-observability-enhancement.sh- 一键部署脚本verify-observability-enhanced.sh- 验收脚本monitoring/grafana/dashboards/import-dashboards.sh- Dashboard 导入脚本
⚠️ 遇到的问题和解决方案
问题 1: Prometheus Deployment 更新失败
现象: Prometheus pod 进入 CrashLoopBackOff,错误:lock DB directory: resource temporarily unavailable
原因:
- Prometheus Deployment 使用 RollingUpdate 策略
- 在更新时同时运行新旧两个 pod
- 两个 pod 都尝试挂载同一个 ReadWriteOnce PVC
- 导致锁冲突
解决方案:
# 1. 将 Deployment 策略改为 Recreate
kubectl patch deployment prometheus -n monitoring --type='json' -p='[
{"op": "remove", "path": "/spec/strategy/rollingUpdate"},
{"op": "replace", "path": "/spec/strategy/type", "value": "Recreate"}
]'
# 2. 删除所有 pod,重新创建
kubectl scale deployment prometheus --replicas=0 -n monitoring
kubectl scale deployment prometheus --replicas=1 -n monitoring
问题 2: 告警规则语法错误
现象: Prometheus 加载告警规则失败
错误:
function "humanizeDecimal" not defined
binary expression must contain only scalar and instant vector types
解决方案:
- 将
humanizeDecimal改为humanize或直接移除 - 修复 PromQL 表达式语法错误
- 暂时禁用有问题的规则
临时决策: 不挂载告警规则文件,先确保 Prometheus 正常运行和抓取数据
问题 3: TSDB 数据损坏
现象: 反复强制删除 pod 导致 Prometheus TSDB 数据出现 out of sequence 错误
解决方案:
- 使用 Recreate 策略避免同时运行多个 pod
- 优雅地重启 Prometheus(等待旧 pod 完全终止)
🎯 当前状态
✅ 正常工作的组件
- Prometheus 正常运行
- Grafana 正常运行
- Loki 正常运行
- Tempo 正常运行
- Prometheus 已配置抓取 Postgres/Redis exporter
- Grafana 数据源已配置 Loki↔Tempo 跳转
⏳ 待验证的功能
- Prometheus Targets 是否成功抓取 postgres/redis metrics
- Grafana Dashboard 导入
- Loki → Tempo 跳转实际测试
- Tempo → Loki 跳转实际测试
📋 后续TODO
-
验证 Prometheus Targets:
kubectl port-forward -n monitoring svc/prometheus 9090:9090 # 访问 http://localhost:9090/targets # 检查 postgres-exporter 和 redis-exporter 是否 UP -
导入 Grafana Dashboards:
cd monitoring/grafana/dashboards ./import-dashboards.sh -
配置告警规则(可选):
- 修复告警规则语法错误
- 或使用 PrometheusRule CRD(如果有 Prometheus Operator)
- 或通过 Alertmanager 配置告警
-
测试业务应用集成:
- 参考 Spring Boot 或 Python 集成指南
- 部署一个示例应用验证 metrics/traces/logs 三件套
📊 如何验证部署结果
1. 检查 Prometheus Targets
kubectl port-forward -n monitoring svc/prometheus 9090:9090
访问 http://localhost:9090/targets,应该能看到:
- ✅
postgres-exporter(postgres-postgresql-metrics.data:9187) - UP - ✅
redis-exporter(redis-metrics.data:9121) - UP - ✅
loki(loki.logging:3100) - UP - ✅
tempo(tempo.tracing:3200) - UP
2. 检查 Grafana 数据源
kubectl port-forward -n monitoring svc/grafana 3000:3000
访问 http://localhost:3000:
- 登录 (admin/admin)
- 进入 Configuration → Data Sources
- 检查:
- Prometheus (default)
- Loki (含 derivedFields 配置)
- Tempo (含 tracesToLogs 配置)
3. 查询 Postgres Metrics
在 Prometheus 中执行查询:
# Postgres 可用性
pg_up
# Postgres 连接数
pg_stat_database_numbackends
# Postgres 版本
pg_version
4. 查询 Redis Metrics
# Redis 可用性
redis_up
# Redis 内存使用
redis_memory_used_bytes
# Redis 连接数
redis_connected_clients
🚀 下一步建议
短期(立即)
- 验证 metrics 抓取:检查 Prometheus targets 页面
- 导入 Dashboards:运行
import-dashboards.sh - 测试数据源跳转:在 Grafana 中测试 Loki↔Tempo
中期(本周)
- 修复告警规则:修复语法错误,重新部署
- 配置 Alertmanager:设置告警通知渠道
- 部署示例应用:验证业务应用集成
长期(下周)
- 生产化:调整采样率、保留期、资源限制
- 安全加固:配置 RBAC、TLS、认证
- 文档完善:编写运维手册、故障排查指南
📝 关键文件位置
- Prometheus 配置:
monitoring/prometheus/prometheus-configmap-no-rules.yaml - Grafana 数据源:
monitoring/grafana/datasources-loki-tempo-enhanced.yaml - 主文档:
OBSERVABILITY-ENHANCEMENT-GUIDE.md - 验收脚本:
verify-observability-enhanced.sh
💡 经验教训
- Deployment vs StatefulSet: 有状态服务(如 Prometheus)应使用 StatefulSet 或 Recreate 策略
- 逐步部署: 先确保基础功能(scrape)正常,再添加高级功能(告警)
- 版本兼容性: 注意 Prometheus 版本对某些 PromQL 函数的支持
- 利用现有资源: 检查 Helm Chart 是否已包含 exporter,避免重复部署
📞 支持
如有问题,请:
- 查看主文档:
OBSERVABILITY-ENHANCEMENT-GUIDE.md - 运行验收脚本:
./verify-observability-enhanced.sh - 检查 Prometheus/Grafana 日志:
kubectl logs -n monitoring <pod-name>
部署状态: ✅ 核心功能已完成,待验证和优化
下一步: 运行 kubectl port-forward -n monitoring svc/prometheus 9090:9090 验证 targets