8.3 可观测性与健康检查
可观测性让你知道系统运行时发生了什么。对全栈项目来说,至少要能把一次前端错误、后端日志和数据库操作串起来。
学习目标
- 能为请求生成和传递 TraceId。
- 能写结构化日志定位业务问题。
- 能配置基础健康检查。
- 能区分日志、指标和追踪的作用。
应用场景
- 用户反馈“创建任务失败”,需要根据 TraceId 查日志。
- 部署后验证 API 和数据库是否可用。
- 慢接口需要定位耗时发生在前端、API 还是数据库。
- CI/CD 或负载均衡器需要健康检查端点。
三类信号
| 信号 | 回答的问题 | 示例 |
|---|---|---|
| 日志 | 发生了什么 | 创建任务失败,错误码是什么 |
| 指标 | 发生频率和趋势 | 请求量、错误率、耗时 P95 |
| 追踪 | 一次请求经过哪里 | API、数据库、外部服务耗时 |
健康检查示例
builder.Services
.AddHealthChecks()
.AddDbContextCheck<AppDbContext>("database");
var app = builder.Build();
app.MapHealthChecks("/health/live");
app.MapHealthChecks("/health/ready");
TraceId 中间件
app.Use(async (context, next) =>
{
var traceId = context.TraceIdentifier;
context.Response.Headers.TryAdd("X-Trace-Id", traceId);
using (logger.BeginScope(new Dictionary<string, object>
{
["TraceId"] = traceId,
}))
{
await next(context);
}
});
重点难点
- 日志要包含业务关键字段,但不能包含密码、Token 和隐私数据。
- 健康检查要区分存活和就绪,避免刚启动就接流量。
- TraceId 要返回给前端,方便用户反馈时定位。
- 指标适合看趋势,日志适合查细节。
常见误区
| 误区 | 推荐做法 |
|---|---|
| 只在异常时写日志 | 关键业务成功路径也写信息日志 |
| 日志写整段对象 JSON | 记录必要字段,避免敏感信息泄漏 |
| 健康检查只返回 200 | 检查关键依赖,例如数据库 |
练习
- 给所有响应增加
X-Trace-Id。 - 为数据库连接配置健康检查。
- 创建任务失败时记录用户 ID、错误码和 TraceId。
延伸阅读
- ASP.NET Core Health Checks。
- OpenTelemetry。
- 结构化日志。