MoneyTree.Telemetry 可观测性
📋 概述
MoneyTree.Telemetry 基于 OpenTelemetry SDK 薄封装,提供开箱即用的可观测性能力,涵盖 Traces(分布式追踪)、Metrics(指标采集)、Logs(结构化日志)三大支柱,并自动注入 TenantId、UserId、CorrelationId 等业务上下文。
| 属性 |
说明 |
| NuGet 包 |
MoneyTree.Telemetry |
| 外部依赖 |
MoneyTree.Core、OpenTelemetry SDK |
| 定位 |
OpenTelemetry 薄封装,开箱即用 |
🏗️ 项目文件结构
MoneyTree.Telemetry/
├── MoneyTree.Telemetry.csproj
├── GlobalUsings.cs
├── Abstractions/
│ └── ITelemetryProvider.cs # 遥测提供者接口
├── Core/
│ ├── TelemetryOptions.cs # 遥测配置选项
│ └── TelemetryDefaults.cs # 遥测默认配置
├── Exporters/
│ ├── ConsoleTelemetryExporter.cs # 控制台导出器
│ ├── JaegerTelemetryExporter.cs # Jaeger 导出器
│ └── OpenTelemetryCollectorExporter.cs # OTel Collector 导出器
├── Enrichers/
│ ├── TenantIdEnricher.cs # 租户 ID 增强器
│ ├── CorrelationIdEnricher.cs # 关联 ID 增强器
│ └── ServiceInfoEnricher.cs # 服务信息增强器
├── Instrumentation/
│ ├── AspNetCoreInstrumentation.cs # ASP.NET Core 仪表
│ ├── EFCoreInstrumentation.cs # EF Core 仪表
│ ├── HttpClientInstrumentation.cs # HttpClient 仪表
│ └── CacheInstrumentation.cs # 缓存仪表
├── Middleware/
│ └── TelemetryMiddleware.cs # 遥测中间件
└── Extensions/
├── TelemetryBuilder.cs # 流畅配置构造器
└── TelemetryExtensions.cs # DI 注册扩展
📊 三大支柱
| 支柱 |
能力 |
说明 |
| Traces |
跨服务追踪 |
自动注入 TenantId、UserId、CorrelationId |
| Metrics |
关键指标采集 |
HTTP/DB/Cache 指标自动采集 |
| Logs |
结构化日志 |
与 NLog 联动,自动注入 TraceId |
📤 导出器
| 导出器 |
适用场景 |
说明 |
| Console |
开发调试 |
输出到控制台,方便本地开发 |
| Jaeger |
分布式追踪可视化 |
查看服务调用链 |
| OpenTelemetry Collector |
生产标准方案 |
统一收集后转发到各类后端 |
🚀 快速开始
基础配置
// Program.cs
using MoneyTree.Telemetry.Extensions;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddMoneyTreeTelemetry(t =>
{
t.WithServiceName("OrderService")
.WithServiceVersion("2.0.0")
.WithEnvironment("Production")
.UseConsole()
.UseOpenTelemetryCollector("http://otel-collector:4317")
.WithTenantEnricher()
.WithCorrelationIdEnricher()
.WithSampleRate(0.5);
});
var app = builder.Build();
app.UseMoneyTreeTelemetry();
app.Run();
生产环境配置
builder.Services.AddMoneyTreeTelemetry(t =>
{
t.WithServiceName("OrderService")
.WithEnvironment("Production")
.UseOpenTelemetryCollector()
.WithTenantEnricher()
.WithSensitivePaths("/api/auth/", "/api/payment/card");
});
📈 自动仪表
| 仪表模块 |
采集内容 |
说明 |
AspNetCoreInstrumentation |
HTTP 请求耗时、状态码、路由 |
自动启用 |
EFCoreInstrumentation |
SQL 查询耗时、查询语句 |
自动启用 |
HttpClientInstrumentation |
外部 HTTP 调用耗时、目标地址 |
自动启用 |
CacheInstrumention |
缓存命中率、操作耗时 |
自动启用 |
🏷️ 上下文增强器
增强器自动为所有遥测数据附加业务上下文:
| 增强器 |
注入字段 |
说明 |
TenantIdEnricher |
tenant.id |
多租户场景追踪 |
CorrelationIdEnricher |
correlation.id |
跨服务请求关联 |
ServiceInfoEnricher |
service.name, service.version |
服务元信息 |
🔒 敏感路径屏蔽
通过配置敏感路径列表,避免敏感数据(如认证密码、支付卡号)出现在遥测数据中:
t.WithSensitivePaths(
"/api/auth/login",
"/api/auth/register",
"/api/payment/card"
);