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所示):

  1. 数据采集层:通过Exporter、Agent采集服务指标(如QPS)、AI特定指标(如模型延迟)、日志数据;
  2. 数据存储层:用Prometheus存储时间序列指标,用Loki存储日志;
  3. 可视化层:用Grafana展示指标 dashboard 和日志;
  4. 告警层:用Alertmanager触发告警(邮件、Slack等);
  5. 智能层(可选):用机器学习模型检测异常(如数据漂移)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(注:实际写作中可插入架构图)

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_servicemodel_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数据源

  1. 访问http://localhost:3000,用默认账号(admin/admin)登录;
  2. 点击左侧“Configuration”→“Data Sources”→“Add data source”;
  3. 选择“Prometheus”,填入Prometheus的地址(如http://prometheus:9090);
  4. 点击“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

以“模型推理延迟”为例,创建一个趋势图

  1. 点击左侧“Create”→“Dashboard”→“Add panel”;
  2. 选择“Time series”图表类型;
  3. 在“Query”栏输入PromQL查询语句:
    model_inference_latency_seconds{model_version="v1.0", endpoint="/predict"}
    
  4. 设置图表标题(如“Model Inference Latency”),选择时间范围(如“Last 1 hour”);
  5. 点击“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 验证告警

  1. 重启Prometheus,让配置生效:
    docker restart prometheus
    
  2. 访问Prometheus UI的“Alerts”页面,确认告警规则已加载;
  3. 模拟一个告警(如将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数据源

  1. 进入Grafana UI,点击“Configuration”→“Data Sources”→“Add data source”;
  2. 选择“Loki”,填入Loki的地址(如http://loki:3100);
  3. 点击“Save & Test”,确认连接成功。

8.4 采集AI服务日志

假设AI服务的日志存储在/var/log/ai_service.log,用Promtail(Loki的日志采集代理)采集:

  1. 创建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  # 日志文件路径
    
  2. 用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中查看日志

  1. 进入Grafana UI,点击左侧“Explore”;
  2. 选择“Loki”数据源,输入LogQL查询语句:
    {job="ai_service"} |~ "error"  # 筛选AI服务中的错误日志
    
  3. 点击“Run Query”,查看筛选后的日志(如图2所示)。

九、案例研究:某推荐系统可用性问题排查

9.1 背景

某电商的推荐系统(基于深度学习模型)上线后,运营人员反馈“推荐页面加载缓慢”,订单量下降了10%。

9.2 监控发现

  1. 指标监控:通过Grafana dashboard发现,模型推理延迟从500ms升到了2s(超过告警阈值1.5s);
  2. 日志监控:通过Loki查看AI服务日志,发现“OutOfMemory”错误(内存不足);
  3. 数据漂移监控:输入数据中的“用户行为特征”数量从100个增加到了200个(通过input_data_mean指标发现)。

9.3 问题根源

模型版本v2.0新增了“用户行为特征”,需要加载更大的embedding矩阵(从1GB增加到2GB),导致服务器内存占用超过8GB(服务器内存为8GB),进而影响推理速度。

9.4 解决方案

  1. 优化模型:用量化技术(如INT8量化)将embedding矩阵的大小从2GB减少到500MB;
  2. 升级资源:将服务器内存从8GB升级到16GB;
  3. 完善监控:在监控平台中添加“内存占用”指标(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所示):

  1. 数据采集层:通过Exporter、Agent采集服务指标(如QPS)、AI特定指标(如模型延迟)、日志数据;
  2. 数据存储层:用Prometheus存储时间序列指标,用Loki存储日志;
  3. 可视化层:用Grafana展示指标 dashboard 和日志;
  4. 告警层:用Alertmanager触发告警(邮件、Slack等);
  5. 智能层(可选):用机器学习模型检测异常(如数据漂移)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(注:实际写作中可插入架构图)

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_servicemodel_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数据源

  1. 访问http://localhost:3000,用默认账号(admin/admin)登录;
  2. 点击左侧“Configuration”→“Data Sources”→“Add data source”;
  3. 选择“Prometheus”,填入Prometheus的地址(如http://prometheus:9090);
  4. 点击“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

以“模型推理延迟”为例,创建一个趋势图

  1. 点击左侧“Create”→“Dashboard”→“Add panel”;
  2. 选择“Time series”图表类型;
  3. 在“Query”栏输入PromQL查询语句:
    model_inference_latency_seconds{model_version="v1.0", endpoint="/predict"}
    
  4. 设置图表标题(如“Model Inference Latency”),选择时间范围(如“Last 1 hour”);
  5. 点击“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 验证告警

  1. 重启Prometheus,让配置生效:
    docker restart prometheus
    
  2. 访问Prometheus UI的“Alerts”页面,确认告警规则已加载;
  3. 模拟一个告警(如将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数据源

  1. 进入Grafana UI,点击“Configuration”→“Data Sources”→“Add data source”;
  2. 选择“Loki”,填入Loki的地址(如http://loki:3100);
  3. 点击“Save & Test”,确认连接成功。

8.4 采集AI服务日志

假设AI服务的日志存储在/var/log/ai_service.log,用Promtail(Loki的日志采集代理)采集:

  1. 创建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  # 日志文件路径
    
  2. 用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中查看日志

  1. 进入Grafana UI,点击左侧“Explore”;
  2. 选择“Loki”数据源,输入LogQL查询语句:
    {job="ai_service"} |~ "error"  # 筛选AI服务中的错误日志
    
  3. 点击“Run Query”,查看筛选后的日志(如图2所示)。

九、案例研究:某推荐系统可用性问题排查

9.1 背景

某电商的推荐系统(基于深度学习模型)上线后,运营人员反馈“推荐页面加载缓慢”,订单量下降了10%。

9.2 监控发现

  1. 指标监控:通过Grafana dashboard发现,模型推理延迟从500ms升到了2s(超过告警阈值1.5s);
  2. 日志监控:通过Loki查看AI服务日志,发现“OutOfMemory”错误(内存不足);
  3. 数据漂移监控:输入数据中的“用户行为特征”数量从100个增加到了200个(通过input_data_mean指标发现)。

9.3 问题根源

模型版本v2.0新增了“用户行为特征”,需要加载更大的embedding矩阵(从1GB增加到2GB),导致服务器内存占用超过8GB(服务器内存为8GB),进而影响推理速度。

9.4 解决方案

  1. 优化模型:用量化技术(如INT8量化)将embedding矩阵的大小从2GB减少到500MB;
  2. 升级资源:将服务器内存从8GB升级到16GB;
  3. 完善监控:在监控平台中添加“内存占用”指标(node_memory_usage_bytes),设置告警阈值(如内存使用率超过80%)。

9.5 结果

  • 模型推理延迟恢复到500ms以下;
  • 订单量回升到正常水平;
  • 避免了类似问题再次发生(通过内存告警)。

十、最佳实践与注意事项

10.1 指标设计最佳实践

  • 聚焦核心指标:不要采集太多无关指标(如“模型层数”),只采集对可用性有影响的指标(如延迟、错误率、数据漂移);
  • 使用标签:通过标签(如model_versionfeature_name)实现多维查询(如“查看v1.0模型的延迟”);
  • 命名规范:使用snake_case,前缀为服务名称(如ai_service_model_inference_latency_seconds)。

10.2 告警设置最佳实践

  • 分级告警:设置“warning”(警告)和“critical”( critical)两级告警(如延迟超过1秒为warning,超过2秒为critical)
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐