伏羲天气预报业务监控:Prometheus+Grafana实现推理延迟与成功率看板
伏羲天气预报业务监控:Prometheus+Grafana实现推理延迟与成功率看板
1. 业务监控需求分析
伏羲天气预报系统作为复旦大学开发的15天全球天气预报级联机器学习系统,在实际业务运行中面临着关键的监控需求。天气预报的准确性和及时性直接关系到民生和经济活动,因此需要对系统的推理性能和稳定性进行实时监控。
核心监控指标包括:
- 推理延迟:从接收输入数据到生成预报结果的时间
- 成功率:预报任务成功完成的比例
- 资源使用:CPU、内存、存储的消耗情况
- 服务质量:系统可用性和响应能力
传统的日志查看方式无法满足实时监控需求,需要构建专业的监控看板来直观展示系统运行状态。
2. 监控方案技术选型
2.1 Prometheus监控系统
Prometheus是一款开源的系统监控和警报工具包,特别适合监控容器化和微服务架构。其特点包括:
- 多维数据模型:通过指标名称和键值对标签来标识时间序列数据
- 灵活的查询语言:PromQL支持实时查询和聚合
- 不依赖分布式存储:单个服务器节点自主工作
- 通过HTTP拉取方式收集时间序列数据
- 支持多种图形和仪表盘模式
2.2 Grafana数据可视化
Grafana是一个开源的指标分析和可视化套件,主要用于大规模指标数据的可视化展示。其优势包括:
- 丰富的可视化组件:图表、表格、热图、单值显示等
- 多数据源支持:Prometheus、Graphite、InfluxDB等
- 灵活的仪表盘配置:可拖拽组件、自定义查询、告警设置
- 用户友好的界面:易于配置和使用
2.3 整体架构设计
监控系统的整体架构包括:
- 数据采集层:在伏羲应用中集成Prometheus客户端库
- 数据存储层:Prometheus服务器定时拉取并存储指标数据
- 可视化层:Grafana从Prometheus查询数据并展示
- 告警层:配置阈值告警,及时发现问题
3. 伏羲应用监控集成
3.1 添加Prometheus客户端依赖
首先需要在伏羲应用中集成Prometheus客户端库:
# 安装Python Prometheus客户端 pip install prometheus-client3.2 实现监控指标收集
在伏羲应用代码中添加监控指标收集功能:
from prometheus_client import Counter, Gauge, Histogram, start_http_server import time # 定义监控指标 REQUEST_DURATION = Histogram('fuxi_request_duration_seconds', '伏羲请求处理时间', ['forecast_type']) REQUEST_COUNT = Counter('fuxi_requests_total', '伏羲请求总数', ['forecast_type', 'status']) ACTIVE_REQUESTS = Gauge('fuxi_active_requests', '当前活跃请求数') MODEL_LOAD_TIME = Gauge('fuxi_model_load_time_seconds', '模型加载时间', ['model_name']) # 在应用启动时启动Prometheus指标服务器 start_http_server(8000) # 在8000端口提供指标数据 def monitor_forecast(forecast_type): """监控装饰器,用于统计预报执行时间和成功率""" def decorator(func): def wrapper(*args, **kwargs): start_time = time.time() ACTIVE_REQUESTS.inc() try: result = func(*args, **kwargs) REQUEST_COUNT.labels(forecast_type=forecast_type, status='success').inc() return result except Exception as e: REQUEST_COUNT.labels(forecast_type=forecast_type, status='error').inc() raise e finally: duration = time.time() - start_time REQUEST_DURATION.labels(forecast_type=forecast_type).observe(duration) ACTIVE_REQUESTS.dec() return wrapper return decorator # 应用监控装饰器到预报函数 @monitor_forecast(forecast_type='short') def run_short_forecast(input_data, steps): # 短期预报逻辑 pass @monitor_forecast(forecast_type='medium') def run_medium_forecast(input_data, steps): # 中期预报逻辑 pass @monitor_forecast(forecast_type='long') def run_long_forecast(input_data, steps): # 长期预报逻辑 pass3.3 添加资源使用监控
监控系统的资源使用情况:
import psutil from prometheus_client import Gauge # 系统资源监控指标 CPU_USAGE = Gauge('fuxi_cpu_usage_percent', 'CPU使用率') MEMORY_USAGE = Gauge('fuxi_memory_usage_bytes', '内存使用量') DISK_USAGE = Gauge('fuxi_disk_usage_bytes', '磁盘使用量') def monitor_system_resources(): """监控系统资源使用情况""" # CPU使用率 cpu_percent = psutil.cpu_percent(interval=1) CPU_USAGE.set(cpu_percent) # 内存使用 memory = psutil.virtual_memory() MEMORY_USAGE.set(memory.used) # 磁盘使用 disk = psutil.disk_usage('/') DISK_USAGE.set(disk.used) # 定期收集系统资源指标 import threading def start_resource_monitoring(): def monitor_loop(): while True: monitor_system_resources() time.sleep(60) # 每分钟收集一次 thread = threading.Thread(target=monitor_loop) thread.daemon = True thread.start()4. Prometheus配置与部署
4.1 Prometheus安装配置
安装Prometheus服务器:
# 下载Prometheus wget https://github.com/prometheus/prometheus/releases/download/v2.37.0/prometheus-2.37.0.linux-amd64.tar.gz tar xvfz prometheus-*.tar.gz cd prometheus-* # 创建配置文件 cat <<EOF > prometheus.yml global: scrape_interval: 15s # 每15秒采集一次数据 scrape_configs: - job_name: 'fuxi-weather' static_configs: - targets: ['localhost:8000'] # 伏羲应用指标端点 metrics_path: '/metrics' - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] # Prometheus自身监控 EOF # 启动Prometheus ./prometheus --config.file=prometheus.yml4.2 数据采集配置优化
针对伏羲应用特点优化采集配置:
# prometheus.yml 伏羲专用配置 scrape_configs: - job_name: 'fuxi-application' scrape_interval: 30s # 30秒采集间隔适合天气预报场景 scrape_timeout: 25s # 超时时间略小于采集间隔 static_configs: - targets: ['fuxi-app:8000'] relabel_configs: - source_labels: [__address__] target_label: instance replacement: 'fuxi-weather-forecast' - job_name: 'node-resources' scrape_interval: 1m # 资源监控可以1分钟一次 static_configs: - targets: ['node-exporter:9100'] # 需要部署node-exporter4.3 监控数据存储优化
配置数据保留策略和存储选项:
# prometheus.yml 存储配置 storage: tsdb: retention: 15d # 保留15天数据,适合天气预报分析 # 启用数据压缩和缓存 query_log_file: /var/log/prometheus/query.log # 资源限制 web: max_connections: 512 # 查询配置 query: lookback-delta: 5m timeout: 2m5. Grafana看板设计与实现
5.1 Grafana安装与配置
安装并配置Grafana:
# Ubuntu/Debian安装 sudo apt-get install -y adduser libfontconfig1 wget https://dl.grafana.com/oss/release/grafana_9.0.1_amd64.deb sudo dpkg -i grafana_9.0.1_amd64.deb # 启动Grafana sudo systemctl start grafana-server sudo systemctl enable grafana-server5.2 伏羲监控看板设计
创建专门的伏羲天气预报监控看板,包含以下关键面板:
性能监控面板:
- 请求延迟分布:展示短期、中期、长期预报的延迟情况
- 请求成功率:实时显示各类型预报的成功率
- 活跃请求数:当前正在处理的预报任务数量
- 系统资源使用:CPU、内存、磁盘使用情况
业务监控面板:
- 每日预报统计:按天统计的预报任务数量和成功率
- 预报类型分布:各类预报的比例分布
- 性能趋势:延迟和成功率的长期趋势分析
5.3 关键监控图表配置
配置核心监控图表:
-- 请求成功率查询 100 - ( sum(rate(fuxi_requests_total{status="error"}[5m])) / sum(rate(fuxi_requests_total[5m])) ) * 100 -- 平均延迟查询 rate(fuxi_request_duration_seconds_sum[5m]) / rate(fuxi_request_duration_seconds_count[5m]) -- 95分位延迟查询 histogram_quantile(0.95, sum(rate(fuxi_request_duration_seconds_bucket[5m])) by (le, forecast_type) ) -- 当前活跃请求数 fuxi_active_requests -- 系统资源使用率 100 - (avg by (instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)5.4 告警规则配置
设置关键告警规则:
# alert.rules.yml groups: - name: fuxi-alerts rules: - alert: HighRequestLatency expr: | histogram_quantile(0.95, rate(fuxi_request_duration_seconds_bucket[5m])) > 300 for: 5m labels: severity: warning annotations: summary: "高请求延迟警告" description: "95分位请求延迟超过300秒" - alert: LowSuccessRate expr: | (100 - (sum(rate(fuxi_requests_total{status="error"}[5m])) / sum(rate(fuxi_requests_total[5m])) * 100)) < 95 for: 10m labels: severity: critical annotations: summary: "低成功率告警" description: "请求成功率低于95%持续10分钟" - alert: HighSystemLoad expr: | node_load1 > 5 for: 5m labels: severity: warning annotations: summary: "高系统负载警告" description: "系统1分钟负载超过5"6. 监控系统部署与实践
6.1 容器化部署方案
使用Docker Compose部署完整的监控栈:
# docker-compose.yml version: '3.8' services: prometheus: image: prom/prometheus:latest ports: - "9090:9090" volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml - prometheus_data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/etc/prometheus/console_libraries' - '--web.console.templates=/etc/prometheus/console_templates' - '--storage.tsdb.retention.time=15d' grafana: image: grafana/grafana:latest ports: - "3000:3000" volumes: - grafana_data:/var/lib/grafana - ./dashboards:/var/lib/grafana/dashboards environment: - GF_SECURITY_ADMIN_PASSWORD=admin123 node-exporter: image: prom/node-exporter:latest ports: - "9100:9100" volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:ro volumes: prometheus_data: grafana_data:6.2 监控数据备份策略
确保监控数据的安全性:
# 创建监控数据备份脚本 cat <<'EOF' > backup_monitoring.sh #!/bin/bash # 备份Prometheus数据 TIMESTAMP=$(date +%Y%m%d_%H%M%S) BACKUP_DIR="/backup/prometheus_$TIMESTAMP" mkdir -p $BACKUP_DIR cp -r /prometheus/data/* $BACKUP_DIR/ # 备份Grafana配置 GRAFANA_BACKUP="/backup/grafana_$TIMESTAMP.tar.gz" tar -czf $GRAFANA_BACKUP /var/lib/grafana/grafana.db /var/lib/grafana/dashboards/ # 保留最近7天的备份 find /backup -name "prometheus_*" -type d -mtime +7 -exec rm -rf {} \; find /backup -name "grafana_*.tar.gz" -type f -mtime +7 -exec rm -f {} \; EOF # 添加定时任务 echo "0 2 * * * /bin/bash /path/to/backup_monitoring.sh" | crontab -6.3 性能优化建议
优化监控系统性能:
Prometheus优化:
- 调整采集间隔,平衡实时性和资源消耗
- 使用记录规则预计算常用查询
- 配置适当的数据保留策略
Grafana优化:
- 使用模板变量减少重复面板
- 设置合适的面板刷新间隔
- 启用查询缓存提升性能
资源限制:
- 为监控组件分配适当的内存和CPU资源
- 监控监控系统自身的资源使用情况
7. 总结
通过Prometheus+Grafana构建的伏羲天气预报业务监控系统,实现了对预报推理延迟、成功率等关键指标的实时监控和可视化展示。这套监控方案具有以下优势:
核心价值:
- 实时掌握系统运行状态,快速发现性能问题
- 直观展示业务指标,支持数据驱动的决策
- 及时告警通知,减少系统故障时间
- 历史数据分析,支持系统优化和容量规划
实践建议:
- 根据实际业务需求调整监控指标和告警阈值
- 定期审查和优化监控配置,确保其有效性
- 建立监控数据的定期分析和报告机制
- 培训团队成员使用监控系统,发挥其最大价值
后续扩展:
- 集成更丰富的监控数据源,如日志、链路追踪等
- 开发自动化故障诊断和修复机制
- 构建预测性监控,提前发现潜在问题
- 实现多地域、多集群的统一监控管理
通过完善的监控体系,可以确保伏羲天气预报系统稳定高效运行,为全球天气预报业务提供可靠的技术保障。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
