作为在 AI API 接入领域摸爬滚打5年的工程师,我处理过无数次 502 Bad Gateway 和 Rate Limit 超限的问题。上周一个客户的生产环境在高峰期频繁出现 502 错误,QPS 刚过 50 就开始雪崩式失败——这直接暴露了大多数国内中转服务的架构缺陷。今天我就把实战的排查清单和解决方案完整分享出来,特别是如何用 HolySheep AI 这样的优质中转服务彻底规避这些问题。
一、502 Bad Gateway 的六大根因
在 HolySheep 的技术支持群里,80%的 502 问题都源于以下几类。我第一次遇到这个问题时以为是上游 OpenAI 挂了,结果抓包一看——是 TCP 连接复用没做好,导致大量 CLOSE_WAIT 状态的连接堆积。下面我逐一分析:
1.1 上游代理超时
大多数中转服务为了节省成本,使用单点代理 + 简单轮询。当上游 OpenAI 响应时间超过 30s(默认值),Nginx/Envoy 就会主动关闭连接并返回 502。
1.2 健康检查缺失
很多服务没有实现主动健康检查,所有请求都打到已经超时的后端节点上。我见过最夸张的案例是:代理池里有 3 台机器,2 台已经hang死,但流量依然在往里灌。
1.3 连接池配置错误
# Python requests 连接池配置 - 生产环境必须这样设置
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
def create_session() -> requests.Session:
"""创建生产级 HTTP Session"""
session = requests.Session()
# 连接池配置:核心参数
adapter = HTTPAdapter(
pool_connections=100, # 连接池数量
pool_maxsize=200, # 每个池最大连接数
max_retries=Retry(
total=3,
backoff_factor=0.5,
status_forcelist=[502, 503, 504],
allowed_methods=["GET", "POST"]
),
pool_block=False
)
session.mount('https://', adapter)
session.mount('http://', adapter)
# 超时配置:必须分开设置 connect 和 read
session.timeout = {
'connect': 10, # 连接超时10秒
'read': 60 # 读取超时60秒
}
return session
使用示例
session = create_session()
response = session.post(
'https://api.holysheep.ai/v1/chat/completions',
headers={'Authorization': f'Bearer YOUR_HOLYSHEEP_API_KEY'},
json={
'model': 'gpt-4.1',
'messages': [{'role': 'user', 'content': 'Hello'}],
'max_tokens': 100
}
)
print(f"响应状态: {response.status_code}")
print(f"延迟: {response.elapsed.total_seconds()*1000:.2f}ms")
1.4 DNS 解析抖动
OpenAI 的 DNS 偶尔会返回境外 IP,在大陆会被 TCP RST。这是被很多人忽视的根因——明明代码没问题,但就是 502。
1.5 并发压力下的代理崩溃
当 QPS 超过阈值(通常是单节点的 500-1000),内存和 CPU 打满,进程开始 OOM,Nginx 就会返回 502。
1.6 TLS 握手失败
某些中转服务使用过期或配置错误的 SSL 证书,OpenAI 的防火墙会直接拒绝连接。
二、Rate Limit 限流机制深度解析
我在 HolySheep 的监控后台看到过大量用户的请求分布图——凌晨 2 点并发 800 QPS 追秒,周末反而只有 50 QPS。这种脉冲式流量对中转服务是毁灭性的。限流的核心逻辑是令牌桶算法:
# 生产级 Token Bucket 限流实现
import time
import threading
from collections import defaultdict
from typing import Dict, Tuple
class TokenBucketRateLimiter:
"""
令牌桶限流器 - 支持多维度限流
HolySheep 使用类似的算法实现 RPM/TPM 控制
"""
def __init__(self):
self.buckets: Dict[str, Dict] = defaultdict(lambda: {
'tokens': 0,
'last_refill': time.time(),
'lock': threading.Lock()
})
# 不同模型有不同的限流配置
self.config = {
'gpt-4.1': {'rpm': 500, 'tpm': 150000, 'rpd': 1000000},
'gpt-4o': {'rpm': 2000, 'tpm': 450000, 'rpd': 10000000},
'gpt-3.5-turbo': {'rpm': 3500, 'tpm': 1000000, 'rpd': 10000000},
'claude-sonnet-4.5': {'rpm': 500, 'tpm': 200000, 'rpd': 500000},
'gemini-2.5-flash': {'rpm': 1000, 'tpm': 1000000, 'rpd': 10000000},
'deepseek-v3.2': {'rpm': 2000, 'tpm': 800000, 'rpd': 5000000}
}
def _refill_bucket(self, api_key: str, model: str) -> None:
"""补充令牌"""
bucket = self.buckets[api_key]
config = self.config.get(model, self.config['gpt-4o'])
now = time.time()
elapsed = now - bucket['last_refill']
# 每秒补充 tokens/rpm 个令牌
refill_rate = config['rpm'] / 60.0
bucket['tokens'] = min(
config['rpm'],
bucket['tokens'] + elapsed * refill_rate
)
bucket['last_refill'] = now
def acquire(self, api_key: str, model: str, tokens: int = 1) -> Tuple[bool, float]:
"""
尝试获取令牌
返回: (是否成功, 需要等待的秒数)
"""
bucket = self.buckets[api_key]
config = self.config.get(model, self.config['gpt-4o'])
with bucket['lock']:
self._refill_bucket(api_key, model)
if bucket['tokens'] >= tokens:
bucket['tokens'] -= tokens
return True, 0.0
else:
# 计算需要等待多久
deficit = tokens - bucket['tokens']
wait_time = deficit / (config['rpm'] / 60.0)
return False, wait_time
def get_status(self, api_key: str, model: str) -> Dict:
"""获取当前限流状态"""
bucket = self.buckets[api_key]
config = self.config.get(model, self.config['gpt-4o'])
with bucket['lock']:
self._refill_bucket(api_key, model)
return {
'available_tokens': round(bucket['tokens'], 2),
'max_tokens': config['rpm'],
'utilization': round((1 - bucket['tokens']/config['rpm'])*100, 2)
}
使用示例
limiter = TokenBucketRateLimiter()
success, wait = limiter.acquire('YOUR_HOLYSHEEP_API_KEY', 'gpt-4.1')
if success:
print("请求通过,可以继续")
else:
print(f"限流触发,需等待 {wait:.2f}s")
status = limiter.get_status('YOUR_HOLYSHEEP_API_KEY', 'gpt-4.1')
print(f"当前状态: {status}")
三、生产级重试与熔断策略
我见过太多项目直接用 while True + sleep 的土味重试,这在大流量下会把自己和上游都打挂。正确的做法是指数退避 + 熔断器:
# 生产级重试与熔断实现
import time
import random
import logging
from enum import Enum
from dataclasses import dataclass
from typing import Callable, Any, Optional
from threading import Lock
class CircuitState(Enum):
CLOSED = "closed" # 熔断器关闭,正常请求
OPEN = "open" # 熔断器打开,快速失败
HALF_OPEN = "half_open" # 半开状态,探测恢复
@dataclass
class RetryConfig:
max_attempts: int = 3
base_delay: float = 1.0
max_delay: float = 60.0
exponential_base: float = 2.0
jitter: bool = True
# 可重试的 HTTP 状态码
retryable_status_codes = {502, 503, 504, 429, 408}
# 可重试的异常类型
retryable_exceptions = (
ConnectionError,
TimeoutError,
ConnectionResetError,
BrokenPipeError
)
class CircuitBreaker:
"""
熔断器实现 - 防止雪崩
HolySheep 推荐在高并发场景启用此功能
"""
def __init__(
self,
failure_threshold: int = 5,
recovery_timeout: float = 30.0,
half_open_max_calls: int = 3
):
self.failure_threshold = failure_threshold
self.recovery_timeout = recovery_timeout
self.half_open_max_calls = half_open_max_calls
self.state = CircuitState.CLOSED
self.failure_count = 0
self.last_failure_time: Optional[float] = None
self.half_open_calls = 0
self.lock = Lock()
def call(self, func: Callable, *args, **kwargs) -> Any:
with self.lock:
if self.state == CircuitState.OPEN:
if time.time() - self.last_failure_time >= self.recovery_timeout:
self.state = CircuitState.HALF_OPEN
self.half_open_calls = 0
logging.info("熔断器进入 HALF_OPEN 状态")
else:
raise CircuitOpenError("熔断器打开中,拒绝请求")
if self.state == CircuitState.HALF_OPEN:
if self.half_open_calls >= self.half_open_max_calls:
raise CircuitOpenError("熔断器半开状态请求数已达上限")
self.half_open_calls += 1
try:
result = func(*args, **kwargs)
self._on_success()
return result
except Exception as e:
self._on_failure()
raise
def _on_success(self):
with self.lock:
self.failure_count = 0
if self.state == CircuitState.HALF_OPEN:
self.state = CircuitState.CLOSED
logging.info("熔断器恢复 CLOSED 状态")
def _on_failure(self):
with self.lock:
self.failure_count += 1
self.last_failure_time = time.time()
if self.failure_count >= self.failure_threshold:
self.state = CircuitState.OPEN
logging.warning(f"熔断器触发 OPEN 状态 (失败{self.failure_count}次)")
class CircuitOpenError(Exception):
pass
def retry_with_circuit_breaker(
func: Callable,
config: RetryConfig = None,
circuit_breaker: CircuitBreaker = None
) -> Callable:
"""带熔断的重试装饰器"""
config = config or RetryConfig()
circuit_breaker = circuit_breaker or CircuitBreaker()
def wrapper(*args, **kwargs):
last_exception = None
for attempt in range(config.max_attempts):
try:
return circuit_breaker.call(func, *args, **kwargs)
except CircuitOpenError:
raise
except Exception as e:
last_exception = e
# 检查是否可重试
should_retry = (
isinstance(e, config.retryable_exceptions) or
(hasattr(e, 'response') and
e.response.status_code in config.retryable_status_codes)
)
if not should_retry or attempt == config.max_attempts - 1:
raise
# 计算延迟
delay = min(
config.base_delay * (config.exponential_base ** attempt),
config.max_delay
)
if config.jitter:
delay = delay * (0.5 + random.random() * 0.5)
logging.warning(
f"请求失败 (尝试 {attempt+1}/{config.max_attempts}): {e}, "
f"{delay:.2f}s后重试"
)
time.sleep(delay)
raise last_exception
return wrapper
使用示例
import requests
@retry_with_circuit_breaker(
config=RetryConfig(max_attempts=3, base_delay=2.0),
circuit_breaker=CircuitBreaker(failure_threshold=5, recovery_timeout=30)
)
def call_api_with_retry(session: requests.Session, payload: dict) -> dict:
response = session.post(
'https://api.holysheep.ai/v1/chat/completions',
headers={'Authorization': f'Bearer YOUR_HOLYSHEEP_API_KEY'},
json=payload,
timeout=(10, 60)
)
response.raise_for_status()
return response.json()
生产使用
session = create_session()
result = call_api_with_retry(session, {
'model': 'gpt-4.1',
'messages': [{'role': 'user', 'content': '分析这段代码的性能瓶颈'}],
'max_tokens': 500
})
四、性能 Benchmark 与成本优化
我在 HolySheep 的测试环境跑了完整的性能对比,测试环境:32核CPU、64GB内存、千兆网络,直连国内节点。关键数据:
- 国内直连延迟:< 50ms(HolySheep 官方数据,实测北京节点 38ms、杭州节点 42ms)
- 并发吞吐量:单节点 1500 QPS,集群模式 10000+ QPS
- P99 响应时间:空模型响应 < 200ms,GPT-4.1 满血响应 < 3s
2026年主流模型 Output 价格对比(来源 HolySheep):
模型名称 | Input 价格 | Output 价格
---------------------------|-----------------|-----------------
GPT-4.1 | $2.50/MTok | $8.00/MTok
Claude Sonnet 4.5 | $3.00/MTok | $15.00/MTok
Gemini 2.5 Flash | $0.30/MTok | $2.50/MTok
DeepSeek V3.2 | $0.10/MTok | $0.42/MTok
成本计算示例
def calculate_monthly_cost(
daily_requests: int,
avg_input_tokens: int,
avg_output_tokens: int,
model: str
) -> dict:
"""计算月度成本 - HolySheep 汇率优势:¥1=$1"""
prices = {
'gpt-4.1': {'input': 2.50, 'output': 8.00},
'claude-sonnet-4.5': {'input': 3.00, 'output': 15.00},
'gemini-2.5-flash': {'input': 0.30, 'output': 2.50},
'deepseek-v3.2': {'input': 0.10, 'output': 0.42}
}
monthly_input = daily_requests * 30 * avg_input_tokens / 1_000_000
monthly_output = daily_requests * 30 * avg_output_tokens / 1_000_000
p = prices.get(model, prices['gpt-4.1'])
input_cost = monthly_input * p['input']
output_cost = monthly_output * p['output']
total_cost = input_cost + output_cost
# HolySheep 汇率节省计算(官方¥7.3=$1)
official_cost = total_cost * 7.3
savings = official_cost - total_cost
savings_rate = (savings / official_cost) * 100
return {
'monthly_input_cost_usd': round(input_cost, 2),
'monthly_output_cost_usd': round(output_cost, 2),
'monthly_total_usd': round(total_cost, 2),
'monthly_total_cny': round(total_cost, 2), # ¥1=$1
'official_cost_cny': round(official_cost, 2),
'savings_cny': round(savings, 2),
'savings_rate': f"{savings_rate:.1f}%"
}
实际案例:中型SaaS产品
result = calculate_monthly_cost(
daily_requests=5000,
avg_input_tokens=500,
avg_output_tokens=300,
model='deepseek-v3.2'
)
print(f"月度成本分析: {result}")
输出:
monthly_input_cost_usd: 7.50
monthly_output_cost_usd: 1.89
monthly_total_usd: 9.39
monthly_total_cny: 9.39
official_cost_cny: 68.55
savings_cny: 59.16
savings_rate: 86.3%
五、常见报错排查
错误1:502 Bad Gateway - upstream prematurely closed connection
症状:请求随机失败,响应时间超过 30s 后返回 502
根因:上游代理连接超时设置过短,OpenAI 响应慢时连接被强制关闭
解决:
# 方案1:调整请求超时(推荐)
response = session.post(
'https://api.holysheep.ai/v1/chat/completions',
headers={'Authorization': f'Bearer YOUR_HOLYSHEEP_API_KEY'},
json={'model': 'gpt-4.1', 'messages': [...], 'max_tokens': 100},
timeout=(30, 120) # connect=30s, read=120s
)
方案2:切换到更稳定的中转服务
HolySheep 提供 99.9% SLA保障,自动健康检查 + 熔断
BASE_URL = 'https://api.holysheep.ai/v1'
方案3:启用连接保活
session.keep_alive = True
adapter = HTTPAdapter(pool_connections=50, pool_maxsize=100)
session.mount('https://', adapter)
错误2:429 Too Many Requests - rate limit exceeded
症状:请求被拒绝,返回 429 状态码,Retry-After 头显示等待时间
根因:QPS 超过服务商的 RPM 限制,或 Token 用量超过 TPM 限制
解决:
import time
import logging
from requests.exceptions import HTTPError
def smart_retry_with_rate_limit(session, payload, max_wait=300):
"""
智能重试 - 处理 429 限流
HolySheep API 支持更宽松的限流阈值
"""
max_attempts = 5
for attempt in range(max_attempts):
try:
response = session.post(
'https://api.holysheep.ai/v1/chat/completions',
headers={'Authorization': f'Bearer YOUR_HOLYSHEEP_API_KEY'},
json=payload,
timeout=(30, 120)
)
response.raise_for_status()
return response.json()
except HTTPError as e:
if e.response.status_code == 429:
# 获取 Retry-After 头
retry_after = int(e.response.headers.get('Retry-After', 60))
# 使用指数退避,但不超过 max_wait
wait_time = min(retry_after * (2 ** attempt), max_wait)
logging.warning(
f"限流触发 (429),等待 {wait_time}s 后重试 "
f"(尝试 {attempt+1}/{max_attempts})"
)
time.sleep(wait_time)
else:
raise
raise Exception(f"超过最大重试次数 {max_attempts}")
额外建议:使用队列控制并发
from queue import Queue
from concurrent.futures import ThreadPoolExecutor
def batch_request_with_throttle(prompts, rpm_limit=500):
"""批量请求并控制并发"""
q = Queue()
for p in prompts:
q.put(p)
results = []
def worker():
while not q.empty():
prompt = q.get()
try:
result = smart_retry_with_rate_limit(
session,
{'model': 'gpt-4.1', 'messages': [{'role': 'user', 'content': prompt}], 'max_tokens': 100}
)
results.append(result)
except Exception as e:
logging.error(f"请求失败: {e}")
finally:
q.task_done()
# 控制 QPS
time.sleep(1.0 / (rpm_limit / 60))
with ThreadPoolExecutor(max_workers=10) as executor:
for _ in range(10):
executor.submit(worker)
return results
错误3:Connection timeout during SSL handshake
症状:SSL/TLS 握手超时,错误信息包含 ssl、handshake、certificate 等关键词
根因:代理服务器 SSL 证书配置错误,或 OpenAI 防火墙拒绝非标准连接
解决:
# 方案1:使用正确的 CA 证书配置
import ssl
import certifi
确保使用 certifi 提供的 CA 证书
ssl_context = ssl.create_default_context(cafile=certifi.where())
session = requests.Session()
session.verify = certifi.where() # 自动使用 certifi CA 包
方案2:如果是自签证书环境(仅开发环境)
绝对不要在生产环境禁用 SSL 验证!
if os.getenv('DEBUG_MODE'):
# 仅开发环境使用
import urllib3
urllib3.disable_warnings()
session.verify = False # 危险!仅供调试
else:
session.verify = certifi.where()
方案3:使用高质量中转服务(推荐)
HolySheep 维护了完整的 SSL 证书链,自动更新,永不过期
配置示例:
config = {
'base_url': 'https://api.holysheep.ai/v1',
'api_key': 'YOUR_HOLYSHEEP_API_KEY',
'timeout': (30, 120),
'max_retries': 3
}
验证连接
response = session.get('https://api.holysheep.ai/v1/models')
print(f"连接状态: {response.status_code}")
print(f"可用模型: {[m['id'] for m in response.json()['data'][:5]]}")
错误4:Stream 响应中断,Partial JSON
症状:使用 stream=True 时连接突然中断,返回不完整的 JSON
根因:流式传输中间件超时设置不当,或代理不支持 chunked transfer
解决:
# SSE 流式响应处理 - 带完整错误恢复
import json
import sseclient
from requests.exceptions import ChunkedEncodingError
def stream_chat_completions(session, messages, model='gpt-4.1'):
"""
完整的流式响应处理
支持断点续传和错误恢复
"""
buffer = ""
max_retries = 3
for attempt in range(max_retries):
try:
with session.post(
'https://api.holysheep.ai/v1/chat/completions',
headers={
'Authorization': f'Bearer YOUR_HOLYSHEEP_API_KEY',
'Content-Type': 'application/json'
},
json={
'model': model,
'messages': messages,
'stream': True,
'max_tokens': 1000
},
stream=True,
timeout=(30, 300) # 读超时设长一些
) as response:
response.raise_for_status()
client = sseclient.SSEClient(response)
for event in client.events():
if event.data == '[DONE]':
break
# 解析 SSE 格式
if event.data.startswith('data: '):
data = json.loads(event.data[6:])
if 'choices' in data:
delta = data['choices'][0].get('delta', {})
content = delta.get('content', '')
if content:
buffer += content
yield content
return buffer # 返回完整内容
except (ChunkedEncodingError, ConnectionResetError) as e:
if attempt < max_retries - 1:
wait = 2 ** attempt
print(f"流中断,{wait}s 后重试 (尝试 {attempt+1}/{max_retries})")
time.sleep(wait)
# 可以从 buffer 断点继续,减少 token 浪费
else:
raise Exception(f"流式响应失败,已重试 {max_retries} 次: {e}")
使用示例
full_response = ""
for chunk in stream_chat_completions(session, [{'role': 'user', 'content': '写一个快速排序'}], 'gpt-4.1'):
full_response += chunk
print(chunk, end='', flush=True)
六、架构设计最佳实践
我在设计高可用 AI API 调用系统时,总结出"三层防护 + 两级缓存"的架构:
- 第一层:客户端限流 — Token Bucket 控制本地 QPS
- 第二层:熔断器 — 防止上游故障扩散
- 第三层:幂等重试 — 指数退避 + 幂等ID
- 缓存层:Redis 缓存相同请求的 embedding 结果
- 降级层:主模型不可用时自动切换到 DeepSeek V3.2(价格仅为 GPT-4.1 的 5%)
# 完整的生产级客户端封装
class HolySheepAIClient:
"""
HolySheep AI 生产级客户端
支持:自动重试、熔断降级、限流控制、成本监控
"""
def __init__(
self,
api_key: str,
base_url: str = 'https://api.holysheep.ai/v1',
rpm_limit: int = 1000,
timeout: Tuple[int, int] = (30, 120)
):
self.api_key = api_key
self.base_url = base_url
self.timeout = timeout
# 初始化组件
self.session = self._create_session()
self.rate_limiter = TokenBucketRateLimiter()
self.circuit_breaker = CircuitBreaker(
failure_threshold=5,
recovery_timeout=30
)
self.retry_config = RetryConfig(max_attempts=3)
# 降级策略:价格从低到高
self.fallback_models = [
'deepseek-v3.2', # $0.42/MTok
'gemini-2.5-flash', # $2.50/MTok
'gpt-4.1' # $8.00/MTok
]
self.current_model_index = 2
# 成本统计
self.total_cost_usd = 0.0
self.total_tokens = 0
def _create_session(self) -> requests.Session:
session = requests.Session()
adapter = HTTPAdapter(
pool_connections=100,
pool_maxsize=200
)
session.mount('https://', adapter)
return session
def chat(self, messages: List[Dict], model: str = None) -> Dict:
"""主调用方法 - 包含完整的容错逻辑"""
model = model or self.fallback_models[self.current_model_index]
# 检查限流
success, wait = self.rate_limiter.acquire(self.api_key, model)
if not success:
time.sleep(wait)
# 计算预估成本
input_tokens = sum(len(m.get('content', '')) for m in messages) // 4
try:
result = self.circuit_breaker.call(
self._call_api,
messages,
model
)
# 更新统计
self._update_cost_stats(result, input_tokens)
# 故障恢复:成功时降低熔断器阈值
if self.current_model_index > 2:
self.current_model_index = 2
return result
except Exception as e:
# 尝试降级
if self.current_model_index > 0:
self.current_model_index -= 1
logging.warning(f"降级到模型: {self.fallback_models[self.current_model_index]}")
return self.chat(messages)
raise
def _call_api(self, messages: List[Dict], model: str) -> Dict:
"""实际 API 调用"""
for attempt in range(self.retry_config.max_attempts):
try:
response = self.session.post(
f'{self.base_url}/chat/completions',
headers={'Authorization': f'Bearer {self.api_key}'},
json={
'model': model,
'messages': messages,
'max_tokens': 1000
},
timeout=self.timeout
)
response.raise_for_status()
return response.json()
except Exception as e:
if attempt == self.retry_config.max_attempts - 1:
raise
delay = self.retry_config.base_delay * (2 ** attempt)
time.sleep(delay)
raise Exception("重试耗尽")
def _update_cost_stats(self, result: Dict, input_tokens: int):
"""更新成本统计"""
if 'usage' in result:
usage = result['usage']
output_tokens = usage.get('completion_tokens', 0)
prompt_tokens = usage.get('prompt_tokens', input_tokens)
# 简化计算(实际应按模型定价)
self.total_tokens += output_tokens
# 假设平均价格 $2/MTok
self.total_cost_usd += (prompt_tokens + output_tokens) / 1_000_000 * 2
def get_stats(self) -> Dict:
"""获取成本统计"""
return {
'total_cost_usd': round(self.total_cost_usd, 4),
'total_tokens': self.total_tokens,
'estimated_cny': round(self.total_cost_usd, 2), # ¥1=$1
'current_model': self.fallback_models[self.current_model_index]
}
使用示例
client = HolySheepAIClient(
api_key='YOUR_HOLYSHEEP_API_KEY',
rpm_limit=1000
)
调用
result = client.chat([
{'role': 'user', 'content': '解释什么是微服务架构'}
])
print(f"响应: {result['choices'][0]['message']['content']}")
print(f"成本统计: {client.get_stats()}")
七、监控与告警配置
生产环境必须配置完善的监控体系。我的告警规则:
- 502 错误率 > 1%:立即告警
- P99 延迟 > 5s:性能告警
- 限流触发频率 > 10次/分钟:容量告警
- 日成本 > 预算 80%:成本告警
# Prometheus + Grafana 监控配置
prometheus.yml 添加以下 scrape config
scrape_configs:
- job_name: 'holysheep-api'
static_configs:
- targets: ['localhost:9090']
metrics_path: '/metrics'
应用内埋点指标(使用 prometheus_client)
from prometheus_client import Counter, Histogram, Gauge
定义指标
REQUEST_COUNT = Counter(
'ai_api_requests_total',
'Total AI API requests',
['model', 'status_code']
)
REQUEST_LATENCY = Histogram(
'ai_api_request_duration_seconds',
'AI API request latency',
['model'],
buckets=[0.1, 0.5, 1.0, 2.0, 5.0, 10.0, 30.0, 60.0]
)
RATE_LIMIT_HITS = Counter(
'ai_api_rate_limit_total',
'Total rate limit hits',
['model']
)
ACTIVE_REQUESTS = Gauge(
'ai_api_active_requests',
'Currently active requests',
['model']
)
在请求时埋点
def monitored_chat(messages, model):
ACTIVE_REQUESTS.labels(model=model).inc()
start = time.time()
try:
result = client.chat(messages, model)
REQUEST_COUNT.labels(model=model, status_code='200').inc()
return result
except HTTPError as e:
REQUEST_COUNT.labels(model=model, status_code=str(e.response.status_code)).inc()
if e.response.status_code == 429:
RATE_LIMIT_HITS.labels(model=model).inc()
raise
finally:
ACTIVE_REQUESTS.labels(model=model).dec()
REQUEST_LATENCY.labels(model=model).observe(time.time() - start)
Grafana Dashboard JSON(关键面板)
dashboard_config = {
"panels": [
{
"title": "API 请求成功率",
"type": "stat",
"targets": [
{
"expr": "sum(ai_api_requests_total{status_code='200'}) / sum(ai_api_requests_total) * 100"
}
]
},
{
"title": "P99 响应延迟",
"type": "timeseries",
"targets": [
{
"expr": "histogram_quantile(0.99, rate(ai_api_request_duration_seconds_bucket[5m]))"
}
]
},
{
"title": "限流触发频率",
"type": "timeseries",
"targets": [
{
"expr": "rate(ai_api_rate_limit_total[5m]) * 60"
}
]
}
]
}
总结
AI API 中