Q14 · 监控与调试
如何监控一个接口的返回时间与是否出错?
⚡ 速记答案(30 秒)
- 前端拦截请求层:
fetch/XMLHttpRequest封装,记录开始时间和结束时间 - 根据响应状态码、业务 code 判断成功/失败
- 上报:接口名、耗时、状态码、错误信息、用户环境
- 后端:接入日志系统(ELK 等),统计每个 API 的耗时/错误率
- 最终在监控平台做:告警 + 看板(耗时分布、错误率趋势)
📖 详细讲解
监控维度
1. 时间指标
• 请求耗时
• TTFB(首字节时间)
• 下载时间
2. 状态指标
• HTTP 状态码
• 业务状态码
• 成功率/错误率
3. 上下文信息
• 接口 URL
• 请求参数(脱敏)
• 用户信息
• 设备/网络环境
实现方式
1. Fetch 拦截
重写 window.fetch
2. Axios 拦截器
使用 request/response 拦截器
3. XHR 代理
重写 XMLHttpRequest.prototype
💻 代码示例
Axios 接口监控
import axios from 'axios';
const api = axios.create({
baseURL: '/api',
timeout: 10000,
});
// 请求拦截器 - 记录开始时间
api.interceptors.request.use((config) => {
config.metadata = { startTime: Date.now() };
return config;
});
// 响应拦截器 - 计算耗时并上报
api.interceptors.response.use(
(response) => {
const duration = Date.now() - response.config.metadata.startTime;
reportApiMetrics({
url: response.config.url,
method: response.config.method,
status: response.status,
duration,
success: true,
});
return response;
},
(error) => {
const config = error.config;
const duration = config ? Date.now() - config.metadata.startTime : 0;
reportApiMetrics({
url: config?.url,
method: config?.method,
status: error.response?.status || 0,
duration,
success: false,
errorMessage: error.message,
});
return Promise.reject(error);
}
);
function reportApiMetrics(data: any) {
navigator.sendBeacon('/api/monitor/api', JSON.stringify(data));
}面试技巧:回答性能问题时,先说指标和标准,再讲优化手段,最后结合实际项目经验。