Skip to content
bitzorcas
中EN

Reference

全链路可观测性与结构化审计:OpenTelemetry 与 Activity

掌握 BitzOrcas.Modern 企业级可观测性底座,深入 OpenTelemetry 分布式链路追踪(Tracing)、指标监控(Metrics)与结构化业务审计日志落盘。

Last updated

在微服务与模块化单体架构中,当线上用户报障“页面加载卡顿”或“结算失败”时,缺乏全链路可观测性的团队往往像在黑夜中摸索:

  • 只能靠 grep 混乱的文本日志拼凑线索;
  • 无法准确定位是数据库慢查询、Redis 超时还是外部第三方网关抖动。

BitzOrcas.Modern 原生集成了 OpenTelemetry 业界标准与自动化审计管道:所有入站请求自动生成全局唯一的 TraceId,并在跨进程调用中自动传递(Baggage),实现全链路拓扑追踪。

全链路可观测性与审计全景

1. HTTP / RPC 入站请求

2. OpenTelemetry 注入 TraceId 与 Span

3. Logging & ActivityAudit 管道

4. 业务用例执行

5. 数据库 / Redis (自动生成子 Span)

6. 结构化审计事件写入 SysAuditLog (不可篡改)

7. OTLP 导出至 Prometheus / Jaeger / Grafana


第一步:在业务用例中记录结构化业务日志

严禁使用字符串拼接日志!必须使用高效的结构化模板,框架自动注入 TenantId、UserId 与 TraceId:

ProcessPaymentCommandHandler.cs: 结构化日志埋点
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 会自动进入审计管道,生成包含调用前后差异的结构化审计记录:

SysAuditLog 物理落盘记录
// 结构化审计实体:全自动落盘不可篡改事实
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。

100%

滚轮或按钮缩放 · 放大后拖动画面 · 双击切换 100% / 200%