在微服务与模块化单体架构中,当线上用户报障“页面加载卡顿”或“结算失败”时,缺乏全链路可观测性的团队往往像在黑夜中摸索:
- 只能靠
grep混乱的文本日志拼凑线索; - 无法准确定位是数据库慢查询、Redis 超时还是外部第三方网关抖动。
BitzOrcas.Modern 原生集成了 OpenTelemetry 业界标准与自动化审计管道:所有入站请求自动生成全局唯一的 TraceId,并在跨进程调用中自动传递(Baggage),实现全链路拓扑追踪。
全链路可观测性与审计全景
第一步:在业务用例中记录结构化业务日志
严禁使用字符串拼接日志!必须使用高效的结构化模板,框架自动注入 TenantId、UserId 与 TraceId:
using Microsoft.Extensions.Logging;
public sealed class ProcessPaymentCommandHandler( ILogger<ProcessPaymentCommandHandler> logger){ public async ValueTask<Result> Handle(ProcessPaymentCommand command, CancellationToken ct) { // 结构化日志:参数使用命名占位符,严禁 $"字符串插值" logger.LogInformation( "开始处理支付交易:订单号 {OrderId},金额 {Amount} {Currency}", command.OrderId, command.Amount, command.Currency);
// 模拟支付处理 await Task.Delay(10, ct);
logger.LogInformation("支付交易成功完成:订单号 {OrderId}", command.OrderId); return Result.Success(); }}第二步:全自动业务操作审计(ActivityAuditPipelineBehavior)
所有带有数据变更的 Command 会自动进入审计管道,生成包含调用前后差异的结构化审计记录:
// 结构化审计实体:全自动落盘不可篡改事实public sealed class SysAuditRecord{ // 审计主键与全局唯一分布式 TraceId public string Id { get; set; } = Guid.NewGuid().ToString("N"); public string TraceId { get; set; } = "4bf92f3577b34da6a3ce929d0e0e4736"; public string ActionName { get; set; } = "Ordering.CreateOrder"; public string OperatorId { get; set; } = "user-1001"; public string TenantId { get; set; } = "tenant-test"; public long DurationMs { get; set; } = 42; public string Status { get; set; } = "Success";}总结
OpenTelemetry + 结构化审计为系统保驾护航:
- 微秒级根因定位:单次点击全链路 Span 耗时一目了然;
- 不可篡改审计:操作者、时间、租户与状态完全留痕;
- 云原生标准:零代码改造无缝对接 Prometheus、Grafana 与 Jaeger。