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.ConfigureMoneyTreeTelemetry(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.ConfigureMoneyTreeTelemetry(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"
);
命中路径的 DisplayName、http.target、http.route、url.path 全部替换为 SENSITIVE_PATH。
SensitiveDataProcessor(自动脱敏)
框架内置 BaseProcessor<Activity> 在 Span 导出前自动处理以下脱敏:
| 脱敏项 |
处理方式 |
| HTTP 请求头 |
移除 Authorization、Cookie、Set-Cookie、X-Api-Key、X-Auth-Token 等 |
| QueryString 参数 |
?token=xxx → ?token=[REDACTED](token/key/secret/password/sign 等) |
| 错误消息 |
含连接字符串/密码关键词时替换为 [SECURITY_REDACTED];超过 500 字符自动截断 |
可通过 Builder API 扩展:
t.WithSensitiveHeaders("X-Custom-Token")
.WithSensitiveQueryParams("custom_secret");
网络层防护(运维)
| 端口 |
绑定 |
防火墙 |
| OTLP gRPC :4317 |
内网 IP |
仅微服务子网 |
| OTLP HTTP :4318 |
内网 IP |
仅微服务子网 |
| Dashboard :18888 |
127.0.0.1 或 VPN |
禁止公网 |
| Consul :8500 |
内网 IP + ACL Token |
仅微服务子网 |