Files
AI-Proxy-Worker/docs/Monitoring.md
2025-08-17 19:59:10 +08:00

8.3 KiB

监控指南

🌍 Language / 语言

🇺🇸 English | 🇨🇳 中文

学习如何监控你的 AI Proxy Worker 部署,跟踪性能,并使用 Cloudflare 内置监控工具排查问题。

📊 Cloudflare 控制台监控

Worker 分析

在 Cloudflare 控制台中访问实时指标:

  1. 导航到 Workers & Pages
  2. 选择你的 AI Proxy Worker
  3. 查看分析标签

需要监控的关键指标

请求指标

  • 每秒请求数 - 流量大小
  • 成功率 - 成功请求的百分比
  • 错误率 - 需要关注的失败请求
  • 响应时间 - 平均延迟

资源使用

  • CPU 使用率 - Worker 执行时间
  • 内存使用 - 每个请求的内存消耗
  • 持续时间 - 请求处理时间

错误分析

  • 4xx 错误 - 客户端问题(认证、验证)
  • 5xx 错误 - 服务器端问题(上游 API 问题)
  • 超时错误 - 超过时间限制的请求

🔍 日志分析

访问日志

# 查看实时日志
wrangler tail

# 按特定日志级别过滤
wrangler tail --format json | jq 'select(.level == "error")'

# 保存日志到文件
wrangler tail --format json > worker-logs.json

日志级别和含义

INFO 级别

console.log('收到请求:', {
  method: request.method,
  url: request.url,
  timestamp: new Date().toISOString()
});

WARN 级别

console.warn('接近速率限制:', {
  clientId: 'user123',
  requestCount: 95,
  limit: 100
});

ERROR 级别

console.error('API 请求失败:', {
  error: error.message,
  statusCode: response.status,
  timestamp: new Date().toISOString()
});

📈 性能监控

响应时间跟踪

监控这些关键性能指标:

// 自定义计时日志
const start = Date.now();
const response = await fetch(upstreamAPI);
const duration = Date.now() - start;

console.log('上游 API 计时:', {
  duration: duration,
  endpoint: 'deepseek-api',
  status: response.status
});

推荐的响应时间目标

  • 聊天请求: < 2 秒
  • 流式响应: 首个令牌 < 1 秒
  • 健康检查: < 500ms

性能优化监控

跟踪这些指标以识别优化机会:

  1. 冷启动频率 - Worker 初始化时间
  2. 内存使用模式 - 识别内存泄漏
  3. CPU 利用率 - 优化重计算
  4. 网络延迟 - 上游 API 响应时间

🚨 告警配置

Cloudflare 告警

为关键问题设置告警:

错误率告警

告警类型: Worker 错误率
阈值: > 5% 错误率
时间段: 5 分钟
通知方式: 邮件, Webhook

响应时间告警

告警类型: Worker 响应时间
阈值: > 3 秒平均值
时间段: 5 分钟
通知方式: 邮件, Slack

请求量告警

告警类型: 请求量
阈值: > 1000 请求/分钟
时间段: 1 分钟
通知方式: 邮件

自定义告警实现

// 在你的 worker 代码中
const ALERT_THRESHOLDS = {
  ERROR_RATE: 0.05,  // 5%
  RESPONSE_TIME: 3000,  // 3 秒
  REQUEST_RATE: 1000   // 1000/分钟
};

async function checkAlerts(metrics) {
  if (metrics.errorRate > ALERT_THRESHOLDS.ERROR_RATE) {
    await sendAlert('检测到高错误率', metrics);
  }
}

📋 健康检查

端点监控

创建健康检查端点:

// 添加到你的 worker
if (url.pathname === '/health') {
  const healthStatus = await checkSystemHealth();
  return new Response(JSON.stringify(healthStatus), {
    headers: { 'Content-Type': 'application/json' }
  });
}

async function checkSystemHealth() {
  return {
    status: 'healthy',
    timestamp: new Date().toISOString(),
    version: '1.0.0',
    upstreamAPIs: {
      deepseek: await checkDeepSeekAPI()
    }
  };
}

外部监控服务

与外部监控工具集成:

Uptime Robot

# 监控端点
https://your-worker.workers.dev/health

# 每 5 分钟检查一次
# 连续 3 次失败时告警

Pingdom

# HTTP 检查配置
URL: https://your-worker.workers.dev/health
间隔: 1 分钟
超时: 30

🔧 调试工具

调试模式

启用详细日志进行故障排除:

const DEBUG = env.DEBUG_MODE === 'true';

if (DEBUG) {
  console.log('调试: 请求详情:', {
    headers: Object.fromEntries(request.headers),
    body: await request.clone().text(),
    timestamp: new Date().toISOString()
  });
}

请求追踪

跟踪请求在系统中的流转:

function generateTraceId() {
  return Math.random().toString(36).substring(2, 15);
}

const traceId = generateTraceId();
console.log('请求开始:', { traceId, url: request.url });

// 在所有函数调用中传递 traceId
const result = await processRequest(request, { traceId });

console.log('请求完成:', { traceId, duration });

📊 自定义指标

业务指标

跟踪应用程序特定指标:

// 跟踪模型使用情况
const modelUsage = {
  'deepseek-chat': 0,
  'deepseek-reasoner': 0
};

// 跟踪用户活动
const userMetrics = {
  activeUsers: new Set(),
  totalRequests: 0,
  streamingRequests: 0
};

// 定期记录指标
setInterval(() => {
  console.log('业务指标:', {
    modelUsage,
    userMetrics: {
      activeUsers: userMetrics.activeUsers.size,
      totalRequests: userMetrics.totalRequests,
      streamingRequests: userMetrics.streamingRequests
    }
  });
}, 60000); // 每分钟

成本跟踪

监控使用成本:

// 跟踪请求成本
const costTracking = {
  totalRequests: 0,
  cpuTime: 0,
  bandwidthUsed: 0
};

// 计算预估成本
function calculateCosts(metrics) {
  const workerCost = metrics.totalRequests * 0.0000005; // 每百万 $0.50
  const cpuCost = metrics.cpuTime * 0.000002; // 每百万 CPU 秒 $2
  
  return {
    workerCost,
    cpuCost,
    totalCost: workerCost + cpuCost
  };
}

🔍 日志分析最佳实践

结构化日志

使用一致的日志格式:

function logEvent(level, event, data) {
  const logEntry = {
    level,
    event,
    timestamp: new Date().toISOString(),
    workerId: env.WORKER_ID || 'unknown',
    ...data
  };
  
  console[level](JSON.stringify(logEntry));
}

// 使用方法
logEvent('info', 'request_received', { method, url });
logEvent('error', 'api_error', { error: err.message, statusCode });

日志保留

了解 Cloudflare 的日志保留策略:

  • 实时日志: 开发期间可用
  • 分析数据: 保留 30 天
  • 自定义日志: 使用外部服务进行长期存储

外部日志聚合

发送日志到外部服务:

async function sendToLogService(logData) {
  if (env.LOG_SERVICE_URL) {
    await fetch(env.LOG_SERVICE_URL, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(logData)
    });
  }
}

📱 监控仪表板

创建自定义仪表板

使用 Grafana 或 Datadog 等工具:

// 发送指标到外部服务
async function sendMetrics(metrics) {
  if (env.METRICS_ENDPOINT) {
    await fetch(env.METRICS_ENDPOINT, {
      method: 'POST',
      headers: { 
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${env.METRICS_API_KEY}`
      },
      body: JSON.stringify({
        service: 'ai-proxy-worker',
        timestamp: Date.now(),
        metrics
      })
    });
  }
}

关键仪表板组件

  1. 请求量 - 显示随时间变化的请求的折线图
  2. 错误率 - 带有阈值告警的百分比仪表
  3. 响应时间 - 显示延迟分布的直方图
  4. 模型使用 - 显示模型使用情况的饼图
  5. 地理分布 - 显示请求来源的地图

🚨 事故响应

事故检测

自动化监控应检测:

  • 高错误率 (>5%)
  • 慢响应时间 (>3s 平均)
  • 服务不可用
  • 异常流量模式

响应程序

  1. 立即: 检查 Cloudflare 状态页面
  2. 调查: 查看最近的部署和日志
  3. 缓解: 必要时回滚
  4. 沟通: 更新状态页面并通知用户
  5. 解决: 修复根本原因
  6. 事后分析: 记录经验教训

紧急联系人

维护升级列表:

  • 主要: 值班工程师
  • 次要: 团队负责人
  • 升级: 基础设施团队

有效的监控确保可靠的服务 📊

定期监控帮助你维护高可用性并快速解决问题。