讲师中心 微信公众号
AI工具推荐 视频效率加速

C# OpenTelemetry集成方法 C#如何实现分布式追踪

胖雪酱_4244

胖雪酱_4244

发布时间:2026-02-22 00:01:07

|

1078人浏览过

|

来源于php中文网

原创

OpenTelemetry SDK 必须在 WebApplicationBuilder 阶段初始化,显式设置 service.name,正确配置 OTLP 协议(gRPC 或 HTTP/JSON),手动创建 Span 时需通过 Propagator 提取父上下文,HttpClient 需启用 EnableHttpHeadersInjection 才能传递 trace 上下文。

c# opentelemetry集成方法 c#如何实现分布式追踪

OpenTelemetry SDK 初始化必须在应用启动早期完成

如果在 Program.cs 中延迟注册或依赖服务已构建后再配置 OpenTelemetry,会导致部分 HTTP 请求、数据库调用等自动检测(auto-instrumentation)丢失 span。ASP.NET Core 6+ 推荐在 WebApplicationBuilder 阶段就添加 tracing 服务。

实操建议:

  • 使用 AddOpenTelemetryTracing 扩展方法,而非手动 new TracerProvider,避免生命周期管理错误
  • 必须调用 SetResourceBuilder 显式设置 service.name,否则后端(如 Jaeger、OTLP Collector)无法按服务归类数据
  • 启用 ActivitySource.Create 的自定义追踪前,确认未被 AspNetCoreInstrumentation 或 HttpClientInstrumentation 覆盖

示例关键片段:

builder.Services.AddOpenTelemetryTracing(tracerProviderBuilder =>
{
    tracerProviderBuilder
        .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("my-api"))
        .AddAspNetCoreInstrumentation()
        .AddHttpClientInstrumentation()
        .AddOtlpExporter(opt => opt.Endpoint = new Uri("http://localhost:4317"));
});

OTLP 协议导出需注意 gRPC vs HTTP/JSON 传输差异

默认 OtlpExporter 使用 gRPC(http://localhost:4317),但若后端只支持 HTTP/JSON(如某些旧版 Collector 配置),会静默失败——没有异常,但 spans 不出现。

常见错误现象:

  • 日志里反复出现 ExportProcessor.OnExportAsync: Export failed,但无堆栈
  • Wireshark 抓包发现客户端尝试 gRPC 连接,而服务端只监听 :4318

解决方式:

  • 改用 HTTP/JSON 导出:设置 Protocol = OtlpExportProtocol.HttpProtobuf,endpoint 改为 http://localhost:4318/v1/traces
  • 确保 Collector 配置中同时启用了 otlp/<code> 接收器,并区分 <code>grpc_endpoint 和 http_endpoint
  • 开发期可临时启用 ConsoleExporter 验证 trace 是否生成成功,绕过网络环节

手动创建 Span 时必须显式链接父上下文

在非 HTTP 入口(如后台队列消费、TimerCallback、gRPC ServerStreaming)中,Activity.Current 通常为 null,直接 StartActivity 会产生孤立 span,断开调用链。

C#
C#

"避开 C# 常见错误——空陷阱、异步陷阱、LINQ 陷阱及资源泄漏。"

下载

正确做法是通过 Propagators.Extract 从消息头(如 RabbitMQ headers、Kafka headers)还原上下文:

  • 使用 B3Propagator 或 TraceContextPropagator,取决于上下游系统约定的传播格式
  • 提取后调用 ActivitySource.StartActivity(..., parentContext: extractedContext)
  • 避免用字符串拼接 traceId/spanId 手动构造 ActivityContext,易出格式错误(如缺失 trace-flags)

示例(从字典提取 B3 头):

var b3Propagator = new B3Propagator();
var extracted = b3Propagator.Extract(B3Propagator.ParseHeaders, headers, (h, k) => h.GetValueOrDefault(k));
using var activity = MyActivitySource.StartActivity("process-order", ActivityKind.Consumer, extracted.Context);

HttpClient 默认不传递 trace 上下文到外部服务

即使启用了 AddHttpClientInstrumentation(),.NET 默认仍不会将当前 trace context 注入 outgoing request headers,除非显式启用传播。

原因在于:.NET 的 HttpClient instrumentation 默认关闭了 Enrich 和 header 注入逻辑,仅采集本地耗时。

修复方式:

  • 在 AddHttpClientInstrumentation 中启用 EnableHttpHeadersInjection = true
  • 确保目标服务也支持对应传播协议(如 W3C TraceContext),否则收到的 traceparent 可能被忽略
  • 若调用的是遗留 Java 服务,可能需降级为 B3 格式,在 HttpClientInstrumentationOptions 中指定 Propagator = new B3Propagator()

这个点最容易被忽略——你看到自己的服务有 trace,但下游没关联,大概率卡在这里。

热门AI工具

更多
讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

更多
rabbitmq和kafka有什么区别
rabbitmq和kafka有什么区别

rabbitmq和kafka的区别:1、语言与平台;2、消息传递模型;3、可靠性;4、性能与吞吐量;5、集群与负载均衡;6、消费模型;7、用途与场景;8、社区与生态系统;9、监控与管理;10、其他特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

664

2024.02.23

Java 消息队列与异步架构实战
Java 消息队列与异步架构实战

本专题系统讲解 Java 在消息队列与异步系统架构中的核心应用,涵盖消息队列基本原理、Kafka 与 RabbitMQ 的使用场景对比、生产者与消费者模型、消息可靠性与顺序性保障、重复消费与幂等处理,以及在高并发系统中的异步解耦设计。通过实战案例,帮助学习者掌握 使用 Java 构建高吞吐、高可靠异步消息系统的完整思路。

1128

2026.01.28

RabbitMQ使用教程合集
RabbitMQ使用教程合集

RabbitMQ使用教程合集整理 RabbitMQ 基础教程、消息队列开发案例、生产者消费者、交换机与队列实战内容。

224

2026.05.20

RabbitMQ集群部署指南
RabbitMQ集群部署指南

RabbitMQ集群部署指南聚合 RabbitMQ 集群部署、高可用架构、镜像队列、故障恢复、监控与运维优化内容。

137

2026.05.20

RabbitMQ Docker实战指南
RabbitMQ Docker实战指南

RabbitMQ Docker实战指南提供 RabbitMQ Docker 镜像部署、Docker Compose、Kubernetes Operator 与云原生实践教程。

162

2026.05.20

什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

2153

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

3554

2023.10.07

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2275

2023.08.07

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn