Skip to content

第 19 章 · 生产部署与监控

本章目标:掌握 HTTP 客户端在生产环境的部署、日志和监控配置。

19.1 结构化日志

python
import logging
import requests

# 配置 requests 日志
logging.basicConfig(level=logging.DEBUG)
http_client_logger = logging.getLogger('httpx' or 'requests')
http_client_logger.setLevel(logging.INFO)

# 启用请求日志
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

resp = requests.get('https://api.example.com/data')
logging.info(f'Request completed: status={resp.status_code}')

19.2 httpx 日志配置

python
import httpx
import logging

# 启用 httpx 详细日志
logging.basicConfig(level=logging.DEBUG)
httpx_logger = logging.getLogger('httpx')
httpx_logger.setLevel(logging.INFO)

with httpx.Client() as client:
    resp = client.get('https://httpbin.org/get')

19.3 性能指标收集

python
import time
import requests

def timed_request(url: str, **kwargs) -> dict:
    start = time.perf_counter()
    resp = requests.get(url, **kwargs)
    elapsed = time.perf_counter() - start
    
    return {
        'url': url,
        'status': resp.status_code,
        'duration_ms': round(elapsed * 1000, 2),
        'size_bytes': len(resp.content)
    }

# 使用
result = timed_request('https://api.example.com/data')
print(f"耗时: {result['duration_ms']}ms")

19.4 健康检查

python
import requests
from typing import Dict, List

def check_endpoints(endpoints: List[str]) -> Dict[str, bool]:
    """检查多个 API 端点的可用性"""
    results = {}
    for url in endpoints:
        try:
            resp = requests.head(url, timeout=5)
            results[url] = resp.status_code < 500
        except requests.exceptions.RequestException:
            results[url] = False
    return results

# 使用
health = check_endpoints([
    'https://api.example.com/health',
    'https://db.example.com/status'
])

19.5 优雅关闭

python
import signal
import requests

session = requests.Session()

def graceful_shutdown(signum, frame):
    print('关闭连接池...')
    session.close()
    exit(0)

signal.signal(signal.SIGTERM, graceful_shutdown)
signal.signal(signal.SIGINT, graceful_shutdown)

# 正常处理请求
resp = session.get('https://api.example.com/data')

19.6 本章小结

  • 配置结构化日志便于问题排查;
  • 记录请求耗时和响应大小用于性能监控;
  • 实现健康检查端点用于服务监控;
  • 注册信号处理器确保连接池正确关闭。

🧪 随堂测验

点击你认为正确的选项。答错时会展示正确答案与原因解析。

1. requests 的请求日志由哪个 logger 控制?

2. 优雅关闭 Session 的目的是?

3. 生产环境健康检查应该?

4. 性能监控应记录哪些指标?

🛠️ 动手实践

  1. 配置 httpx 请求日志,输出每个请求的 URL 和状态码。
  2. 实现请求计时装饰器,记录 API 调用耗时。
  3. 编写健康检查函数,定期检查多个端点并报警。

完成练习后,进入下一章:综合实战