AI系统可用性监控平台搭建:架构师的开源方案与配置教程
以“模型推理延迟”为例,创建一个趋势图点击左侧“Create”→“Dashboard”→“Add panel”;选择“Time series”图表类型;在“Query”栏输入PromQL查询语句:model_inference_latency_seconds{model_version="v1.0", endpoint="/predict"}设置图表标题(如“Model Inference Lat
AI系统可用性监控实战:从0到1搭建开源监控平台(附完整配置教程)
一、引言:AI系统的“可用性危机”与监控的重要性
1.1 一个真实的痛点场景
某电商公司的推荐系统上线3个月后,突然出现用户投诉推荐页面加载缓慢的问题。运营人员查看后台,发现订单量在2小时内暴跌了15%。技术团队紧急排查:
- 服务器存活状态正常,CPU使用率只有30%;
- 数据库查询延迟正常,没有慢查询;
- 模型推理服务的日志中,频繁出现“推理时间超过2秒”的警告。
最终发现,输入数据中的用户行为特征数量从100个增加到了200个,导致模型的计算量翻倍,推理延迟从500ms飙升至2.5秒。由于没有监控模型的推理延迟,问题持续了2小时才被发现,给业务造成了巨大损失。
1.2 AI系统监控的特殊性
与传统应用相比,AI系统的可用性监控需要关注更复杂的维度:
- 服务层:存活状态、QPS、延迟、错误率(如500错误);
- 模型层:推理时间、准确率变化、数据漂移(输入数据分布变化)、模型版本性能差异;
- 数据层:输入数据的完整性(如缺失值比例)、分布一致性(如均值/方差变化);
- 资源层:CPU、内存、GPU使用率(尤其是深度学习模型)。
传统监控工具(如Zabbix)无法覆盖这些AI特定指标,因此需要定制化的监控体系。
1.3 本文的核心价值
本文将分享架构师的开源监控方案,结合Prometheus、Grafana、Alertmanager、Loki等工具,教你从0到1搭建全面覆盖AI系统可用性的监控平台。你将学会:
- 设计AI监控体系的核心架构;
- 部署开源监控工具链;
- 采集AI特定指标(如数据漂移、模型延迟);
- 设置智能告警规则;
- 用可视化仪表盘快速定位问题。
二、核心架构设计:AI监控的“五脏六腑”
2.1 架构 overview
AI系统可用性监控平台的核心架构分为五层(如图1所示):
- 数据采集层:通过Exporter、Agent采集服务指标(如QPS)、AI特定指标(如模型延迟)、日志数据;
- 数据存储层:用Prometheus存储时间序列指标,用Loki存储日志;
- 可视化层:用Grafana展示指标 dashboard 和日志;
- 告警层:用Alertmanager触发告警(邮件、Slack等);
- 智能层(可选):用机器学习模型检测异常(如数据漂移)。
(注:实际写作中可插入架构图)
2.2 组件选择与理由
组件 | 作用 | 选择理由 |
---|---|---|
Prometheus | 指标存储与采集 | 多维数据模型(标签)适合监控,集成Alertmanager |
Grafana | 可视化 dashboard | 丰富的图表类型,支持Prometheus、Loki等数据源 |
Alertmanager | 告警管理 | 支持多种通知渠道,提供沉默、抑制规则避免误报 |
Loki | 日志存储与查询 | 与Grafana深度集成,用LogQL快速筛选日志 |
自定义Exporter | 采集AI特定指标 | 灵活扩展,支持Python、Go等语言 |
三、先决条件:搭建前的准备工作
3.1 环境要求
- 操作系统:Linux(推荐Ubuntu 20.04+)或macOS;
- 容器化工具:Docker(版本20.10+,方便部署监控组件);
- 编排工具:Kubernetes(可选,若AI系统运行在容器集群中);
- 编程语言:Python 3.8+(用于自定义Exporter)。
3.2 工具安装
3.2.1 安装Docker
# Ubuntu
sudo apt-get update
sudo apt-get install docker.io -y
sudo systemctl start docker
sudo systemctl enable docker
# macOS
brew install docker
3.2.2 安装Docker Compose(可选)
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
四、步骤1:部署Prometheus(指标存储核心)
4.1 Prometheus 配置文件
创建prometheus.yml
配置文件,定义采集目标和全局设置:
global:
scrape_interval: 15s # 每15秒采集一次指标(可根据需求调整)
evaluation_interval: 15s # 每15秒评估告警规则
# 采集配置:定义需要监控的目标
scrape_configs:
# 监控Prometheus自身
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# 监控AI服务(假设AI服务暴露8080端口的/metrics端点)
- job_name: 'ai_service'
static_configs:
- targets: ['ai-service:8080'] # 替换为AI服务的实际地址(如192.168.1.100:8080)
# 监控自定义Exporter(采集AI特定指标)
- job_name: 'model_exporter'
static_configs:
- targets: ['model-exporter:8000'] # 替换为Exporter的实际地址
4.2 用Docker部署Prometheus
docker run -d \
--name prometheus \
-p 9090:9090 \
-v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus:v2.45.0 # 使用稳定版本
4.3 验证部署
访问http://localhost:9090
,进入Prometheus UI:
- 点击“Status”→“Targets”,确认所有采集目标(如
ai_service
、model_exporter
)的状态为“UP”; - 点击“Graph”,输入指标名称(如
http_requests_total
),查看指标数据。
五、步骤2:部署Grafana(可视化 dashboard)
5.1 用Docker部署Grafana
docker run -d \
--name grafana \
-p 3000:3000 \
-v grafana-storage:/var/lib/grafana \
grafana/grafana:9.5.0 # 使用稳定版本
5.2 配置Prometheus数据源
- 访问
http://localhost:3000
,用默认账号(admin/admin)登录; - 点击左侧“Configuration”→“Data Sources”→“Add data source”;
- 选择“Prometheus”,填入Prometheus的地址(如
http://prometheus:9090
); - 点击“Save & Test”,确认连接成功。
5.3 创建AI监控 dashboard
Grafana提供了丰富的预制 dashboard(可在Grafana Labs下载),也可以自定义:
5.3.1 导入预制 dashboard
比如导入“Prometheus 2.0 Stats” dashboard(ID:3662),展示Prometheus自身的监控指标。
5.3.2 自定义AI dashboard
以“模型推理延迟”为例,创建一个趋势图:
- 点击左侧“Create”→“Dashboard”→“Add panel”;
- 选择“Time series”图表类型;
- 在“Query”栏输入PromQL查询语句:
model_inference_latency_seconds{model_version="v1.0", endpoint="/predict"}
- 设置图表标题(如“Model Inference Latency”),选择时间范围(如“Last 1 hour”);
- 点击“Apply”,保存面板。
5.4 推荐的AI监控指标
指标类型 | 示例指标 | 图表类型 |
---|---|---|
服务可用性 | http_requests_total (请求总数)、http_requests_error_rate (错误率) |
柱状图、 gauge |
模型性能 | model_inference_latency_seconds (推理延迟)、model_qps (QPS) |
趋势图、 gauge |
数据漂移 | input_data_mean{feature_name="age"} (输入数据均值)、input_data_std_dev (标准差) |
趋势图 |
资源占用 | node_cpu_seconds_total (CPU使用率)、node_memory_usage_bytes (内存占用) |
gauge、趋势图 |
六、步骤3:部署Alertmanager(智能告警)
6.1 Alertmanager 配置文件
创建alertmanager.yml
配置文件,定义告警渠道和抑制规则:
global:
resolve_timeout: 5m # 告警恢复后,5分钟内不再发送通知
# 告警渠道:发送邮件
route:
receiver: 'email-notifications'
group_by: ['alertname', 'service'] # 按告警名称和服务分组
group_wait: 30s # 分组等待30秒,避免重复发送
group_interval: 5m # 同一分组的告警每隔5分钟发送一次
repeat_interval: 12h # 重复告警每隔12小时发送一次
receivers:
- name: 'email-notifications'
email_configs:
- to: 'admin@example.com' # 接收告警的邮箱
from: 'alertmanager@example.com' # 发送告警的邮箱
smarthost: 'smtp.example.com:587' # SMTP服务器地址
auth_username: 'alertmanager' # SMTP用户名
auth_password: 'password' # SMTP密码
# 抑制规则:避免误报(如当服务器宕机时,抑制应用的告警)
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['service', 'instance']
6.2 用Docker部署Alertmanager
docker run -d \
--name alertmanager \
-p 9093:9093 \
-v $(pwd)/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
prom/alertmanager:v0.25.0 # 使用稳定版本
6.3 配置Prometheus告警规则
创建alert_rules.yml
文件,定义AI系统的告警规则:
groups:
- name: ai_service_alerts
rules:
# 规则1:AI服务延迟超过1.5秒(critical)
- alert: HighInferenceLatency
expr: model_inference_latency_seconds{endpoint="/predict"} > 1.5
for: 5m # 持续5分钟才发送告警
labels:
severity: critical
service: ai_service
annotations:
summary: "High inference latency for {{ $labels.model_version }}"
description: "Model {{ $labels.model_version }} on {{ $labels.endpoint }} has latency > 1.5s (current: {{ $value | round(2) }}s) for 5 minutes."
# 规则2:数据漂移(特征均值变化超过20%)
- alert: DataDriftDetected
expr: |
(input_data_mean{feature_name="age"} - input_data_mean_offset{feature_name="age"}) / input_data_mean_offset{feature_name="age"} > 0.2
for: 10m
labels:
severity: warning
service: ai_service
annotations:
summary: "Data drift detected for feature {{ $labels.feature_name }}"
description: "Mean value of {{ $labels.feature_name }} has changed by > 20% (current: {{ $value | round(2) }}) for 10 minutes."
6.4 让Prometheus加载告警规则
修改prometheus.yml
,添加rule_files
配置:
global:
# ...(省略)
rule_files:
- /etc/prometheus/alert_rules.yml # 告警规则文件路径
scrape_configs:
# ...(省略)
6.5 验证告警
- 重启Prometheus,让配置生效:
docker restart prometheus
- 访问Prometheus UI的“Alerts”页面,确认告警规则已加载;
- 模拟一个告警(如将
model_inference_latency_seconds
指标设置为2秒),查看是否收到邮件通知。
七、步骤4:采集AI特定指标(自定义Exporter实战)
7.1 什么是Exporter?
Exporter是Prometheus的数据采集代理,负责将非Prometheus格式的指标(如AI模型的推理延迟、数据漂移)转换为Prometheus可识别的格式(OpenMetrics),并暴露/metrics
端点供Prometheus采集。
7.2 用Python写一个AI Exporter
以采集模型推理延迟和输入数据漂移为例,使用prometheus_client
库(Python官方库)编写Exporter:
7.2.1 安装依赖
pip install prometheus_client
7.2.2 编写Exporter代码(model_exporter.py
)
from prometheus_client import start_http_server, Gauge
import time
import random
from typing import Dict, List
# 1. 定义指标(带标签,支持多维查询)
# 模型推理延迟(秒):标签包括模型版本、端点
model_inference_latency = Gauge(
'model_inference_latency_seconds',
'Latency of model inference',
labels=['model_version', 'endpoint']
)
# 输入数据均值:标签包括特征名称
input_data_mean = Gauge(
'input_data_mean',
'Mean value of input data',
labels=['feature_name']
)
# 2. 模拟数据采集(实际中替换为真实逻辑)
def collect_model_metrics() -> None:
"""采集模型推理延迟"""
# 假设模型版本为v1.0,端点为/predict
latency = random.uniform(0.1, 2.0) # 模拟延迟(0.1-2秒)
model_inference_latency.labels(model_version='v1.0', endpoint='/predict').set(latency)
def collect_data_metrics(features: Dict[str, List[float]]) -> None:
"""采集输入数据均值"""
for feature_name, values in features.items():
mean = sum(values) / len(values)
input_data_mean.labels(feature_name=feature_name).set(mean)
# 3. 启动HTTP服务器,暴露/metrics端点
if __name__ == '__main__':
# 启动服务器(端口8000)
start_http_server(8000)
print("Exporter running on port 8000")
# 模拟输入数据(实际中从AI服务获取)
features = {
'age': [random.randint(18, 60) for _ in range(100)],
'income': [random.randint(3000, 10000) for _ in range(100)]
}
# 循环采集指标(每15秒一次)
while True:
collect_model_metrics()
collect_data_metrics(features)
time.sleep(15)
7.2.3 运行Exporter
python model_exporter.py
7.2.4 验证Exporter
访问http://localhost:8000/metrics
,查看暴露的指标:
# HELP model_inference_latency_seconds Latency of model inference
# TYPE model_inference_latency_seconds gauge
model_inference_latency_seconds{model_version="v1.0",endpoint="/predict"} 0.876
# HELP input_data_mean Mean value of input data
# TYPE input_data_mean gauge
input_data_mean{feature_name="age"} 38.5
input_data_mean{feature_name="income"} 6500.0
八、步骤5:集成日志监控(Loki+Grafana)
8.1 为什么需要日志监控?
指标监控(如延迟、错误率)能快速发现问题,但日志监控能帮助排查问题的根源(如“为什么延迟升高?”)。Loki是Grafana推出的开源日志存储系统,与Grafana深度集成,支持用LogQL快速筛选日志。
8.2 部署Loki
docker run -d \
--name loki \
-p 3100:3100 \
-v $(pwd)/loki.yml:/etc/loki/loki.yml \
grafana/loki:2.8.0 # 使用稳定版本
8.3 配置Loki数据源
- 进入Grafana UI,点击“Configuration”→“Data Sources”→“Add data source”;
- 选择“Loki”,填入Loki的地址(如
http://loki:3100
); - 点击“Save & Test”,确认连接成功。
8.4 采集AI服务日志
假设AI服务的日志存储在/var/log/ai_service.log
,用Promtail(Loki的日志采集代理)采集:
- 创建
promtail.yml
配置文件:server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: /tmp/positions.yaml # 记录日志采集的位置 clients: - url: http://loki:3100/loki/api/v1/push # Loki的地址 scrape_configs: - job_name: 'ai_service_logs' static_configs: - targets: ['localhost'] labels: job: 'ai_service' # 日志的标签(用于筛选) __path__: /var/log/ai_service.log # 日志文件路径
- 用Docker部署Promtail:
docker run -d \ --name promtail \ -v $(pwd)/promtail.yml:/etc/promtail/promtail.yml \ -v /var/log/ai_service.log:/var/log/ai_service.log \ grafana/promtail:2.8.0
8.5 在Grafana中查看日志
- 进入Grafana UI,点击左侧“Explore”;
- 选择“Loki”数据源,输入LogQL查询语句:
{job="ai_service"} |~ "error" # 筛选AI服务中的错误日志
- 点击“Run Query”,查看筛选后的日志(如图2所示)。
九、案例研究:某推荐系统可用性问题排查
9.1 背景
某电商的推荐系统(基于深度学习模型)上线后,运营人员反馈“推荐页面加载缓慢”,订单量下降了10%。
9.2 监控发现
- 指标监控:通过Grafana dashboard发现,模型推理延迟从500ms升到了2s(超过告警阈值1.5s);
- 日志监控:通过Loki查看AI服务日志,发现“OutOfMemory”错误(内存不足);
- 数据漂移监控:输入数据中的“用户行为特征”数量从100个增加到了200个(通过
input_data_mean
指标发现)。
9.3 问题根源
模型版本v2.0新增了“用户行为特征”,需要加载更大的embedding矩阵(从1GB增加到2GB),导致服务器内存占用超过8GB(服务器内存为8GB),进而影响推理速度。
9.4 解决方案
- 优化模型:用量化技术(如INT8量化)将embedding矩阵的大小从2GB减少到500MB;
- 升级资源:将服务器内存从8GB升级到16GB;
- 完善监控:在监控平台中添加“内存占用”指标(
node_memory_usage_bytes
),设置告警阈值(如内存使用率超过80%)。
9.5 结果
- 模型推理延迟恢复到500ms以下;
- 订单量回升到正常水平;
- 避免了类似问题再次发生(通过内存告警)。
十、最佳实践与注意事项
10.1 指标设计最佳实践
-# AI系统可用性监控实战:从0到1搭建开源监控平台(附完整配置教程)
一、引言:AI系统的“可用性危机”与监控的重要性
1.1 一个真实的痛点场景
某电商公司的推荐系统上线3个月后,突然出现用户投诉推荐页面加载缓慢的问题。运营人员查看后台,发现订单量在2小时内暴跌了15%。技术团队紧急排查:
- 服务器存活状态正常,CPU使用率只有30%;
- 数据库查询延迟正常,没有慢查询;
- 模型推理服务的日志中,频繁出现“推理时间超过2秒”的警告。
最终发现,输入数据中的用户行为特征数量从100个增加到了200个,导致模型的计算量翻倍,推理延迟从500ms飙升至2.5秒。由于没有监控模型的推理延迟,问题持续了2小时才被发现,给业务造成了巨大损失。
1.2 AI系统监控的特殊性
与传统应用相比,AI系统的可用性监控需要关注更复杂的维度:
- 服务层:存活状态、QPS、延迟、错误率(如500错误);
- 模型层:推理时间、准确率变化、数据漂移(输入数据分布变化)、模型版本性能差异;
- 数据层:输入数据的完整性(如缺失值比例)、分布一致性(如均值/方差变化);
- 资源层:CPU、内存、GPU使用率(尤其是深度学习模型)。
传统监控工具(如Zabbix)无法覆盖这些AI特定指标,因此需要定制化的监控体系。
1.3 本文的核心价值
本文将分享架构师的开源监控方案,结合Prometheus、Grafana、Alertmanager、Loki等工具,教你从0到1搭建全面覆盖AI系统可用性的监控平台。你将学会:
- 设计AI监控体系的核心架构;
- 部署开源监控工具链;
- 采集AI特定指标(如数据漂移、模型延迟);
- 设置智能告警规则;
- 用可视化仪表盘快速定位问题。
二、核心架构设计:AI监控的“五脏六腑”
2.1 架构 overview
AI系统可用性监控平台的核心架构分为五层(如图1所示):
- 数据采集层:通过Exporter、Agent采集服务指标(如QPS)、AI特定指标(如模型延迟)、日志数据;
- 数据存储层:用Prometheus存储时间序列指标,用Loki存储日志;
- 可视化层:用Grafana展示指标 dashboard 和日志;
- 告警层:用Alertmanager触发告警(邮件、Slack等);
- 智能层(可选):用机器学习模型检测异常(如数据漂移)。
(注:实际写作中可插入架构图)
2.2 组件选择与理由
组件 | 作用 | 选择理由 |
---|---|---|
Prometheus | 指标存储与采集 | 多维数据模型(标签)适合监控,集成Alertmanager |
Grafana | 可视化 dashboard | 丰富的图表类型,支持Prometheus、Loki等数据源 |
Alertmanager | 告警管理 | 支持多种通知渠道,提供沉默、抑制规则避免误报 |
Loki | 日志存储与查询 | 与Grafana深度集成,用LogQL快速筛选日志 |
自定义Exporter | 采集AI特定指标 | 灵活扩展,支持Python、Go等语言 |
三、先决条件:搭建前的准备工作
3.1 环境要求
- 操作系统:Linux(推荐Ubuntu 20.04+)或macOS;
- 容器化工具:Docker(版本20.10+,方便部署监控组件);
- 编排工具:Kubernetes(可选,若AI系统运行在容器集群中);
- 编程语言:Python 3.8+(用于自定义Exporter)。
3.2 工具安装
3.2.1 安装Docker
# Ubuntu
sudo apt-get update
sudo apt-get install docker.io -y
sudo systemctl start docker
sudo systemctl enable docker
# macOS
brew install docker
3.2.2 安装Docker Compose(可选)
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
四、步骤1:部署Prometheus(指标存储核心)
4.1 Prometheus 配置文件
创建prometheus.yml
配置文件,定义采集目标和全局设置:
global:
scrape_interval: 15s # 每15秒采集一次指标(可根据需求调整)
evaluation_interval: 15s # 每15秒评估告警规则
# 采集配置:定义需要监控的目标
scrape_configs:
# 监控Prometheus自身
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# 监控AI服务(假设AI服务暴露8080端口的/metrics端点)
- job_name: 'ai_service'
static_configs:
- targets: ['ai-service:8080'] # 替换为AI服务的实际地址(如192.168.1.100:8080)
# 监控自定义Exporter(采集AI特定指标)
- job_name: 'model_exporter'
static_configs:
- targets: ['model-exporter:8000'] # 替换为Exporter的实际地址
4.2 用Docker部署Prometheus
docker run -d \
--name prometheus \
-p 9090:9090 \
-v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus:v2.45.0 # 使用稳定版本
4.3 验证部署
访问http://localhost:9090
,进入Prometheus UI:
- 点击“Status”→“Targets”,确认所有采集目标(如
ai_service
、model_exporter
)的状态为“UP”; - 点击“Graph”,输入指标名称(如
http_requests_total
),查看指标数据。
五、步骤2:部署Grafana(可视化 dashboard)
5.1 用Docker部署Grafana
docker run -d \
--name grafana \
-p 3000:3000 \
-v grafana-storage:/var/lib/grafana \
grafana/grafana:9.5.0 # 使用稳定版本
5.2 配置Prometheus数据源
- 访问
http://localhost:3000
,用默认账号(admin/admin)登录; - 点击左侧“Configuration”→“Data Sources”→“Add data source”;
- 选择“Prometheus”,填入Prometheus的地址(如
http://prometheus:9090
); - 点击“Save & Test”,确认连接成功。
5.3 创建AI监控 dashboard
Grafana提供了丰富的预制 dashboard(可在Grafana Labs下载),也可以自定义:
5.3.1 导入预制 dashboard
比如导入“Prometheus 2.0 Stats” dashboard(ID:3662),展示Prometheus自身的监控指标。
5.3.2 自定义AI dashboard
以“模型推理延迟”为例,创建一个趋势图:
- 点击左侧“Create”→“Dashboard”→“Add panel”;
- 选择“Time series”图表类型;
- 在“Query”栏输入PromQL查询语句:
model_inference_latency_seconds{model_version="v1.0", endpoint="/predict"}
- 设置图表标题(如“Model Inference Latency”),选择时间范围(如“Last 1 hour”);
- 点击“Apply”,保存面板。
5.4 推荐的AI监控指标
指标类型 | 示例指标 | 图表类型 |
---|---|---|
服务可用性 | http_requests_total (请求总数)、http_requests_error_rate (错误率) |
柱状图、 gauge |
模型性能 | model_inference_latency_seconds (推理延迟)、model_qps (QPS) |
趋势图、 gauge |
数据漂移 | input_data_mean{feature_name="age"} (输入数据均值)、input_data_std_dev (标准差) |
趋势图 |
资源占用 | node_cpu_seconds_total (CPU使用率)、node_memory_usage_bytes (内存占用) |
gauge、趋势图 |
六、步骤3:部署Alertmanager(智能告警)
6.1 Alertmanager 配置文件
创建alertmanager.yml
配置文件,定义告警渠道和抑制规则:
global:
resolve_timeout: 5m # 告警恢复后,5分钟内不再发送通知
# 告警渠道:发送邮件
route:
receiver: 'email-notifications'
group_by: ['alertname', 'service'] # 按告警名称和服务分组
group_wait: 30s # 分组等待30秒,避免重复发送
group_interval: 5m # 同一分组的告警每隔5分钟发送一次
repeat_interval: 12h # 重复告警每隔12小时发送一次
receivers:
- name: 'email-notifications'
email_configs:
- to: 'admin@example.com' # 接收告警的邮箱
from: 'alertmanager@example.com' # 发送告警的邮箱
smarthost: 'smtp.example.com:587' # SMTP服务器地址
auth_username: 'alertmanager' # SMTP用户名
auth_password: 'password' # SMTP密码
# 抑制规则:避免误报(如当服务器宕机时,抑制应用的告警)
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['service', 'instance']
6.2 用Docker部署Alertmanager
docker run -d \
--name alertmanager \
-p 9093:9093 \
-v $(pwd)/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
prom/alertmanager:v0.25.0 # 使用稳定版本
6.3 配置Prometheus告警规则
创建alert_rules.yml
文件,定义AI系统的告警规则:
groups:
- name: ai_service_alerts
rules:
# 规则1:AI服务延迟超过1.5秒(critical)
- alert: HighInferenceLatency
expr: model_inference_latency_seconds{endpoint="/predict"} > 1.5
for: 5m # 持续5分钟才发送告警
labels:
severity: critical
service: ai_service
annotations:
summary: "High inference latency for {{ $labels.model_version }}"
description: "Model {{ $labels.model_version }} on {{ $labels.endpoint }} has latency > 1.5s (current: {{ $value | round(2) }}s) for 5 minutes."
# 规则2:数据漂移(特征均值变化超过20%)
- alert: DataDriftDetected
expr: |
(input_data_mean{feature_name="age"} - input_data_mean_offset{feature_name="age"}) / input_data_mean_offset{feature_name="age"} > 0.2
for: 10m
labels:
severity: warning
service: ai_service
annotations:
summary: "Data drift detected for feature {{ $labels.feature_name }}"
description: "Mean value of {{ $labels.feature_name }} has changed by > 20% (current: {{ $value | round(2) }}) for 10 minutes."
6.4 让Prometheus加载告警规则
修改prometheus.yml
,添加rule_files
配置:
global:
# ...(省略)
rule_files:
- /etc/prometheus/alert_rules.yml # 告警规则文件路径
scrape_configs:
# ...(省略)
6.5 验证告警
- 重启Prometheus,让配置生效:
docker restart prometheus
- 访问Prometheus UI的“Alerts”页面,确认告警规则已加载;
- 模拟一个告警(如将
model_inference_latency_seconds
指标设置为2秒),查看是否收到邮件通知。
七、步骤4:采集AI特定指标(自定义Exporter实战)
7.1 什么是Exporter?
Exporter是Prometheus的数据采集代理,负责将非Prometheus格式的指标(如AI模型的推理延迟、数据漂移)转换为Prometheus可识别的格式(OpenMetrics),并暴露/metrics
端点供Prometheus采集。
7.2 用Python写一个AI Exporter
以采集模型推理延迟和输入数据漂移为例,使用prometheus_client
库(Python官方库)编写Exporter:
7.2.1 安装依赖
pip install prometheus_client
7.2.2 编写Exporter代码(model_exporter.py
)
from prometheus_client import start_http_server, Gauge
import time
import random
from typing import Dict, List
# 1. 定义指标(带标签,支持多维查询)
# 模型推理延迟(秒):标签包括模型版本、端点
model_inference_latency = Gauge(
'model_inference_latency_seconds',
'Latency of model inference',
labels=['model_version', 'endpoint']
)
# 输入数据均值:标签包括特征名称
input_data_mean = Gauge(
'input_data_mean',
'Mean value of input data',
labels=['feature_name']
)
# 2. 模拟数据采集(实际中替换为真实逻辑)
def collect_model_metrics() -> None:
"""采集模型推理延迟"""
# 假设模型版本为v1.0,端点为/predict
latency = random.uniform(0.1, 2.0) # 模拟延迟(0.1-2秒)
model_inference_latency.labels(model_version='v1.0', endpoint='/predict').set(latency)
def collect_data_metrics(features: Dict[str, List[float]]) -> None:
"""采集输入数据均值"""
for feature_name, values in features.items():
mean = sum(values) / len(values)
input_data_mean.labels(feature_name=feature_name).set(mean)
# 3. 启动HTTP服务器,暴露/metrics端点
if __name__ == '__main__':
# 启动服务器(端口8000)
start_http_server(8000)
print("Exporter running on port 8000")
# 模拟输入数据(实际中从AI服务获取)
features = {
'age': [random.randint(18, 60) for _ in range(100)],
'income': [random.randint(3000, 10000) for _ in range(100)]
}
# 循环采集指标(每15秒一次)
while True:
collect_model_metrics()
collect_data_metrics(features)
time.sleep(15)
7.2.3 运行Exporter
python model_exporter.py
7.2.4 验证Exporter
访问http://localhost:8000/metrics
,查看暴露的指标:
# HELP model_inference_latency_seconds Latency of model inference
# TYPE model_inference_latency_seconds gauge
model_inference_latency_seconds{model_version="v1.0",endpoint="/predict"} 0.876
# HELP input_data_mean Mean value of input data
# TYPE input_data_mean gauge
input_data_mean{feature_name="age"} 38.5
input_data_mean{feature_name="income"} 6500.0
八、步骤5:集成日志监控(Loki+Grafana)
8.1 为什么需要日志监控?
指标监控(如延迟、错误率)能快速发现问题,但日志监控能帮助排查问题的根源(如“为什么延迟升高?”)。Loki是Grafana推出的开源日志存储系统,与Grafana深度集成,支持用LogQL快速筛选日志。
8.2 部署Loki
docker run -d \
--name loki \
-p 3100:3100 \
-v $(pwd)/loki.yml:/etc/loki/loki.yml \
grafana/loki:2.8.0 # 使用稳定版本
8.3 配置Loki数据源
- 进入Grafana UI,点击“Configuration”→“Data Sources”→“Add data source”;
- 选择“Loki”,填入Loki的地址(如
http://loki:3100
); - 点击“Save & Test”,确认连接成功。
8.4 采集AI服务日志
假设AI服务的日志存储在/var/log/ai_service.log
,用Promtail(Loki的日志采集代理)采集:
- 创建
promtail.yml
配置文件:server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: /tmp/positions.yaml # 记录日志采集的位置 clients: - url: http://loki:3100/loki/api/v1/push # Loki的地址 scrape_configs: - job_name: 'ai_service_logs' static_configs: - targets: ['localhost'] labels: job: 'ai_service' # 日志的标签(用于筛选) __path__: /var/log/ai_service.log # 日志文件路径
- 用Docker部署Promtail:
docker run -d \ --name promtail \ -v $(pwd)/promtail.yml:/etc/promtail/promtail.yml \ -v /var/log/ai_service.log:/var/log/ai_service.log \ grafana/promtail:2.8.0
8.5 在Grafana中查看日志
- 进入Grafana UI,点击左侧“Explore”;
- 选择“Loki”数据源,输入LogQL查询语句:
{job="ai_service"} |~ "error" # 筛选AI服务中的错误日志
- 点击“Run Query”,查看筛选后的日志(如图2所示)。
九、案例研究:某推荐系统可用性问题排查
9.1 背景
某电商的推荐系统(基于深度学习模型)上线后,运营人员反馈“推荐页面加载缓慢”,订单量下降了10%。
9.2 监控发现
- 指标监控:通过Grafana dashboard发现,模型推理延迟从500ms升到了2s(超过告警阈值1.5s);
- 日志监控:通过Loki查看AI服务日志,发现“OutOfMemory”错误(内存不足);
- 数据漂移监控:输入数据中的“用户行为特征”数量从100个增加到了200个(通过
input_data_mean
指标发现)。
9.3 问题根源
模型版本v2.0新增了“用户行为特征”,需要加载更大的embedding矩阵(从1GB增加到2GB),导致服务器内存占用超过8GB(服务器内存为8GB),进而影响推理速度。
9.4 解决方案
- 优化模型:用量化技术(如INT8量化)将embedding矩阵的大小从2GB减少到500MB;
- 升级资源:将服务器内存从8GB升级到16GB;
- 完善监控:在监控平台中添加“内存占用”指标(
node_memory_usage_bytes
),设置告警阈值(如内存使用率超过80%)。
9.5 结果
- 模型推理延迟恢复到500ms以下;
- 订单量回升到正常水平;
- 避免了类似问题再次发生(通过内存告警)。
十、最佳实践与注意事项
10.1 指标设计最佳实践
- 聚焦核心指标:不要采集太多无关指标(如“模型层数”),只采集对可用性有影响的指标(如延迟、错误率、数据漂移);
- 使用标签:通过标签(如
model_version
、feature_name
)实现多维查询(如“查看v1.0模型的延迟”); - 命名规范:使用
snake_case
,前缀为服务名称(如ai_service_model_inference_latency_seconds
)。
10.2 告警设置最佳实践
- 分级告警:设置“warning”(警告)和“critical”( critical)两级告警(如延迟超过1秒为warning,超过2秒为critical)
更多推荐
所有评论(0)