在部署AI API服务时,监控调用延迟、Token消耗、错误率是保障服务稳定性的核心工作。我在做国内AI服务架构升级时,深入研究了如何用Prometheus高效采集AI服务的各项指标。今天分享我的完整实战方案,特别推荐使用
我在部署多个AI项目后发现,没有监控的AI服务就像盲人摸象。Prometheus能帮我们采集: 我用Flask搭建了一个AI代理服务,集成了完整的Prometheus指标采集。核心思路是在请求前后记录时间,计算Token单价成本,并按模型分组统计。 要让Prometheus抓取我们的指标,需要正确配置scrape_configs。我踩过的一个坑是漏配了metric_path,导致一直拿不到数据。 我建议至少配置3个核心告警:延迟过高、错误率飙升、成本超限。下面的规则已经在生产环境验证过。 我在部署时遇到prometheus一直报scrape_errors,增加日志后发现是网络策略问题。AI服务在Docker网络内,但Prometheus在宿主机。 很多中转API会过滤掉usage字段,导致无法采集Token数据。这是其他中转站的通病,但HolySheep API返回完整usage信息。 这个问题折磨了我很久。原因是Prometheus Histogram记录的延迟是服务端处理时间,不包含请求等待队列的等待时间。 如果你的成本监控数值持续增长但API余额没变,可能是价格配置表过期。2026年模型价格变动频繁。 我在公司部署的AI监控架构经过3次迭代,现在是第4版,核心是用HolySheep AI作为统一网关,省去了维护多个API Key的麻烦。 我用Grafana创建了一个AI服务监控仪表盘,核心包含4个Panel:延迟分布、Token消耗、成本趋势、错误追踪。 我在优化AI服务监控时总结了3个关键点: 我用HolySheep AI一年多了,最满意的3点:①国内延迟实测<50ms,比官方API快4倍;②Token数据完整,监控数据可信度高;③微信充值秒到账,不用折腾信用卡。 Prometheus监控是AI服务运维的基础设施,做好指标采集能让你提前发现成本异常、性能瓶颈、可用性问题。本文提供的代码在生产环境稳定运行超过6个月,覆盖了核心监控场景。 如果你正在搭建AI服务监控,建议直接使用免费注册 HolySheep AI,获取首月赠额度
对比维度
HolySheheep AI
OpenAI 官方
其他中转站
汇率
¥1=$1(无损)
¥7.3=$1
¥6-8=$1
国内延迟
<50ms
>200ms
80-150ms
GPT-4.1价格/MTok
$8.00
$60.00
$15-30
Claude Sonnet价格/MTok
$15.00
$45.00
$20-35
充值方式
微信/支付宝
国际信用卡
参差不齐
监控数据精准度
高(含完整元数据)
高
通常丢失usage字段
免费额度
注册即送
$5体验金
极少或无
为什么AI服务需要Prometheus监控
实战:Python Flask + Prometheus监控AI服务
"""
AI服务Prometheus监控完整实现
兼容HolySheep AI / OpenAI兼容API
"""
from flask import Flask, request, jsonify
from prometheus_client import Counter, Histogram, Gauge, generate_latest, REGISTRY
import time
import requests
from collections import defaultdict
app = Flask(__name__)
==================== Prometheus指标定义 ====================
请求计数器(按模型和状态码分组)
REQUEST_COUNTER = Counter(
'ai_api_requests_total',
'Total AI API requests',
['model', 'status', 'provider']
)
延迟直方图(毫秒级)
REQUEST_LATENCY = Histogram(
'ai_api_request_duration_milliseconds',
'AI API request latency in ms',
['model', 'provider'],
buckets=[50, 100, 200, 500, 1000, 2000, 5000]
)
Token计数器
TOKEN_COUNTER = Counter(
'ai_api_tokens_total',
'Total tokens consumed',
['model', 'type'] # type: input/output
)
成本Gauge(累计美元成本)
COST_GAUGE = Gauge(
'ai_api_total_cost_usd',
'Total cost in USD',
['model']
)
当前并发请求数
ACTIVE_REQUESTS = Gauge(
'ai_api_active_requests',
'Number of active requests',
['model']
)
错误计数器
ERROR_COUNTER = Counter(
'ai_api_errors_total',
'Total API errors',
['model', 'error_type']
)
==================== 模型价格配置(2026最新) ====================
MODEL_PRICING = {
'gpt-4.1': {'input': 0.002, 'output': 8.00, 'unit': 'per_1M_tokens'},
'gpt-4o': {'input': 2.50, 'output': 10.00, 'unit': 'per_1M_tokens'},
'claude-sonnet-4.5': {'input': 3.00, 'output': 15.00, 'unit': 'per_1M_tokens'},
'claude-opus-3.5': {'input': 15.00, 'output': 75.00, 'unit': 'per_1M_tokens'},
'gemini-2.5-flash': {'input': 0.35, 'output': 2.50, 'unit': 'per_1M_tokens'},
'deepseek-v3.2': {'input': 0.27, 'output': 0.42, 'unit': 'per_1M_tokens'},
}
==================== 成本计算函数 ====================
def calculate_cost(model: str, input_tokens: int, output_tokens: int) -> float:
"""计算单次请求成本(美元)"""
if model not in MODEL_PRICING:
# 未知模型返回0,避免监控中断
return 0.0
pricing = MODEL_PRICING[model]
input_cost = (input_tokens / 1_000_000) * pricing['input']
output_cost = (output_tokens / 1_000_000) * pricing['output']
return round(input_cost + output_cost, 6) # 精确到小数点后6位
==================== AI请求处理 ====================
@app.route('/v1/chat/completions', methods=['POST'])
def chat_completions():
start_time = time.time()
ACTIVE_REQUESTS.labels(model='unknown').inc()
try:
data = request.json
model = data.get('model', 'unknown')
messages = data.get('messages', [])
# 调用HolySheep AI API(¥1=$1汇率)
headers = {
'Authorization': f'Bearer {request.headers.get("X-API-Key", "YOUR_HOLYSHEEP_API_KEY")}',
'Content-Type': 'application/json'
}
# 实际请求
response = requests.post(
'https://api.holysheep.ai/v1/chat/completions',
headers=headers,
json={'model': model, 'messages': messages},
timeout=60
)
result = response.json()
# 提取Token使用量(HolySheep返回完整usage字段)
usage = result.get('usage', {})
input_tokens = usage.get('prompt_tokens', 0)
output_tokens = usage.get('completion_tokens', 0)
# 记录Token指标
TOKEN_COUNTER.labels(model=model, type='input').inc(input_tokens)
TOKEN_COUNTER.labels(model=model, type='output').inc(output_tokens)
# 计算并记录成本
cost = calculate_cost(model, input_tokens, output_tokens)
COST_GAUGE.labels(model=model).inc(cost)
# 记录延迟
latency_ms = (time.time() - start_time) * 1000
REQUEST_LATENCY.labels(model=model, provider='holysheep').observe(latency_ms)
# 记录成功请求
REQUEST_COUNTER.labels(model=model, status='success', provider='holysheep').inc()
return jsonify(result)
except requests.exceptions.Timeout:
ERROR_COUNTER.labels(model=model, error_type='timeout').inc()
REQUEST_COUNTER.labels(model=model, status='timeout', provider='holysheep').inc()
return jsonify({'error': 'Request timeout after 60s'}), 504
except requests.exceptions.RequestException as e:
ERROR_COUNTER.labels(model=model, error_type='network').inc()
REQUEST_COUNTER.labels(model=model, status='network_error', provider='holysheep').inc()
return jsonify({'error': str(e)}), 502
finally:
ACTIVE_REQUESTS.labels(model=model).dec()
==================== Prometheus指标端点 ====================
@app.route('/metrics')
def metrics():
return generate_latest(REGISTRY), 200, {'Content-Type': 'text/plain'}
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)
prometheus.yml配置
# prometheus.yml - AI服务监控完整配置
global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets: []
rule_files:
- "ai_alerts.yml" # 告警规则文件
scrape_configs:
# 抓取AI代理服务
- job_name: 'ai-proxy-service'
static_configs:
- targets: ['ai-proxy:8080'] # Docker Compose服务名
metrics_path: '/metrics'
scrape_interval: 10s
scrape_timeout: 5s
# 抓取模型响应延迟(P99告警)
- job_name: 'ai-latency-monitor'
static_configs:
- targets: ['ai-proxy:8080']
metrics_path: '/metrics'
params:
include_metrics: ['ai_api_request_duration_milliseconds']
relabel_configs:
- source_labels: [__address__]
target_label: instance
replacement: 'ai-service-${job}'
# 抓取成本统计
- job_name: 'ai-cost-monitor'
static_configs:
- targets: ['ai-proxy:8080']
metric_relabel_configs:
- source_labels: [__name__]
regex: 'ai_api_total_cost_usd'
action: keep
告警规则配置
# ai_alerts.yml - AI服务告警规则
groups:
- name: ai_service_alerts
rules:
# P99延迟告警(超过3秒)
- alert: AIRequestLatencyHigh
expr: histogram_quantile(0.99, rate(ai_api_request_duration_milliseconds_bucket[5m])) > 3000
for: 5m
labels:
severity: warning
annotations:
summary: "AI请求P99延迟过高"
description: "模型 {{ $labels.model }} P99延迟 {{ $value }}ms 已持续5分钟"
# 错误率告警(超过5%)
- alert: AIErrorRateHigh
expr: |
sum(rate(ai_api_errors_total[5m]))
/ sum(rate(ai_api_requests_total[5m])) > 0.05
for: 3m
labels:
severity: critical
annotations:
summary: "AI API错误率超过5%"
description: "当前错误率 {{ $value | humanizePercentage }}"
# Token消耗异常(比昨天同时段多50%)
- alert: TokenConsumptionAnomaly
expr: |
sum(increase(ai_api_tokens_total[1h]))
> 1.5 * sum(increase(ai_api_tokens_total[1h] offset 24h))
for: 10m
labels:
severity: warning
annotations:
summary: "Token消耗异常增长"
description: "当前小时消耗比24小时前增长超过50%"
# 成本告警(每小时超过$100)
- alert: AICostBudgetExceeded
expr: increase(ai_api_total_cost_usd[1h]) > 100
for: 0m
labels:
severity: critical
annotations:
summary: "AI服务成本超限"
description: "过去1小时成本已达 ${{ $value }}"
常见报错排查
错误1:Prometheus抓取不到指标(scrape_errors持续增加)
# 诊断命令
curl http://ai-proxy:8080/metrics
常见原因及解决:
1. 服务未启动 → 检查容器状态
docker ps | grep ai-proxy
2. 端口未暴露 → docker-compose.yml添加
services:
ai-proxy:
ports:
- "8080:8080" # 显式暴露端口
3. 防火墙阻断 → 确认云服务器安全组开放8080端口
4. Prometheus与目标不在同一网络 → docker-compose添加 networks
services:
prometheus:
networks:
- ai-network
ai-proxy:
networks:
- ai-network
networks:
ai-network:
driver: bridge
错误2:Token计数器始终为0(usage字段丢失)
# 诊断:检查API响应是否包含usage字段
curl -X POST https://api.holysheep.ai/v1/chat/completions \
-H "Authorization: Bearer YOUR_HOLYSHEEP_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "deepseek-v3.2", "messages": [{"role": "user", "content": "Hi"}]}'
正确响应应包含:
{
"usage": {
"prompt_tokens": 10,
"completion_tokens": 25,
"total_tokens": 35
}
}
如果使用其他中转站返回空usage,需要在代码中添加fallback估算
def get_token_count(response_json):
usage = response_json.get('usage', {})
if not usage:
# 使用响应长度估算(不精准但能采集数据)
response_text = response_json.get('choices', [{}])[0].get('message', {}).get('content', '')
return {'prompt_tokens': 0, 'completion_tokens': len(response_text) // 4, 'total_tokens': len(response_text) // 4}
return usage
错误3:延迟指标数值异常(超过60秒timeout但直方图正常)
# 解决方案:在请求进入时记录start_time,放入队列前就计时
@app.route('/v1/chat/completions', methods=['POST'])
def chat_completions():
# 请求进入立即记录时间(包含队列等待)
request_start_time = time.time()
ACTIVE_REQUESTS.labels(model='unknown').inc()
# ... 业务逻辑 ...
# 正确的延迟统计(包含完整等待+处理时间)
total_latency_ms = (time.time() - request_start_time) * 1000
REQUEST_LATENCY.labels(model=model, provider='holysheep').observe(total_latency_ms)
# 如果需要分离等待时间,用队列深度估算
queue_wait_estimate = queue_depth * avg_processing_time
actual_processing_time = total_latency_ms - queue_wait_estimate
return jsonify(result)
验证:Grafana中使用以下PromQL对比
包含队列等待的总延迟
sum(rate(ai_api_request_duration_milliseconds_sum[5m]))
/ sum(rate(ai_api_request_duration_milliseconds_count[5m]))
服务端处理时间(需要在代码中单独记录)
sum(rate(ai_api_processing_duration_seconds_sum[5m]))
/ sum(rate(ai_api_processing_duration_seconds_count[5m])) * 1000
错误4:成本Gauge持续增长但余额充足
# 排查步骤
1. 确认prometheus中查询到的价格
rate(ai_api_total_cost_usd_total[1h])
2. 手动验证计算
python3 -c "
input_tokens = 1000
output_tokens = 500
model = 'gpt-4.1'
price_input = 2.00 / 1_000_000 # $2/MTok for gpt-4.1 input
price_output = 8.00 / 1_000_000 # $8/MTok for gpt-4.1 output
cost = input_tokens * price_input + output_tokens * price_output
print(f'计算成本: ${cost:.6f}')
如果你用的GPT-4.1 output价格是$8但实际是$60,就是配置表过期
"
3. 更新配置表(2026最新价格)
MODEL_PRICING = {
'gpt-4.1': {'input': 2.00, 'output': 8.00}, # 2026.01更新
'gpt-4o': {'input': 2.50, 'output': 10.00},
'claude-sonnet-4.5': {'input': 3.00, 'output': 15.00}, # 2026.01更新
'gemini-2.5-flash': {'input': 0.35, 'output': 2.50},
'deepseek-v3.2': {'input': 0.27, 'output': 0.42},
}
我的生产环境监控架构
# docker-compose.yml 完整监控栈
version: '3.8'
services:
# AI代理服务(含Prometheus指标)
ai-proxy:
build: ./ai-proxy
ports:
- "8080:8080"
environment:
- HOLYSHEEP_API_KEY=${HOLYSHEEP_API_KEY}
- API_BASE=https://api.holysheep.ai/v1
networks:
- monitoring
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3
# Prometheus
prometheus:
image: prom/prometheus:latest
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- ./ai_alerts.yml:/etc/prometheus/ai_alerts.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.enable-lifecycle'
networks:
- monitoring
# Grafana可视化
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD}
networks:
- monitoring
depends_on:
- prometheus
# Alertmanager告警
alertmanager:
image: prom/alertmanager:latest
ports:
- "9093:9093"
volumes:
- ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
networks:
- monitoring
networks:
monitoring:
driver: bridge
volumes:
prometheus_data:
grafana_data:
Grafana仪表盘推荐配置
# Grafana面板PromQL配置
Panel 1: 请求延迟P50/P95/P99
histogram_quantile(0.50, rate(ai_api_request_duration_milliseconds_bucket[5m]))
histogram_quantile(0.95, rate(ai_api_request_duration_milliseconds_bucket[5m]))
histogram_quantile(0.99, rate(ai_api_request_duration_milliseconds_bucket[5m]))
Panel 2: Token消耗趋势(按input/output分组)
sum(rate(ai_api_tokens_total[1h])) by (type)
Panel 3: 累计成本(按模型分组)
sum(increase(ai_api_total_cost_usd[24h])) by (model)
Panel 4: 错误率时间序列
sum(rate(ai_api_errors_total[5m])) by (error_type)
/ sum(rate(ai_api_requests_total[5m]))
性能优化实战经验
总结