跳到主要内容

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。
  • 结构化日志。