此示例显示如何以不同的方式扩展OpenTelemetry活动。
运行项目
该代码由一个向自身发送消息的单端点项目组成。
压机哦发送创建订单
带有随机的消息订单Id
。处理消息时,会再创建两条消息:帐单订单
和发货订单
.
在发送和处理消息时,跟踪数据被导出到控制台。一些跟踪数据来自NServiceBus,一些来自示例中的自定义代码。
代码演练
全局配置
默认情况下未启用NServiceBus OpenTelemetry检测。必须在端点配置上启用它。
var endpointConfiguration=新endpointConfiguration(“CustomTelemetry”);端点配置。启用OpenTelemetry();
OpenTelemetry配置为将所有跟踪导出到命令行。它包括NServiceBus。核心
源,它内置于NServiceBus和示例中定义的自定义活动源中(参见下文)。
var resourceBuilder=资源生成器。创建默认值().AddService(“自定义遥测”);var tracerProviderBuilder=Sdk。CreateTracerProviderBuilder().SetResourceBuilder(resourceBuilder).AddSource(“NServiceBus.Core”).AddSource(CustomActivitySources.Name).AddProcessor(新的NetHostProcessor).AddConsoleExporter();
注册了一个自定义处理器,它将机器名作为标记添加到此跟踪侦听器创建的每个活动。
类NetHostProcessor:BaseProcessor<活动>{字符串主机名;公用NetHostProcessor(){主机名=Dns。获取主机名();}公共重写void OnStart(活动数据){数据。SetTag(“net.host.name”,主机名);}}
自定义活动
该示例包含自定义活动源。
静态类CustomActivitySources{public const string Name=“Sample.ActivitySource”;public static ActivitySource Main=新ActivityResource(名称);}
的处理程序创建订单
包括围绕帐单部分的自定义活动。
公共异步任务句柄(CreateOrder消息,IMessageHandlerContext上下文){使用(var activity=CustomActivitySources.Main.StartActivity(“账单订单”)){慰问。WriteLine($“帐单订单{message.OrderId}”);活动?。AddTag(“sample.billing.system”,“paypal”);//计算订单成本等待上下文。SendLocal(新BillOrder{OrderId=message.OrderId});}慰问。WriteLine($“发货订单{message.OrderId}”);等待上下文。SendLocal(新发货订单{OrderId=message.OrderId});}
这将自动创建为NServiceBus创建的调用处理程序活动的子活动。NServiceBus发送消息活动将此自定义活动视为其父活动。
发送CreateOrder处理CreateOrder调用CreateOrderHandler帐单订单<--自定义活动发送BillOrder发送发货订单
添加标签
的处理程序发货订单
将标记添加到环境行为中。
类ShipOrderHandler:IHandleMessages<ShipOrder>{公共任务句柄(ShipOrder消息,IMessageHandlerContext上下文){慰问。WriteLine($“订单已发货{message.OrderId}”);//弄清楚我们要运送到哪个州活动。当前?。AddTag(“sample.shipping.state”,“state”);return任务。已完成任务;}}
在示例中,这些标记将添加到NServiceBus调用处理程序活动中。
发送发货订单处理发货订单调用ShipOrderHandler<--此处添加自定义标记
传出管道中的行为将消息的大小添加为所有传出消息活动的标记。
类TraceOutgoingMessageSizeBehavior:行为{公共重写任务调用(IOutgoingPhysicalMessageContext上下文,趣味<任务>下一步){活动。当前?。AddTag(“sample.message.body.size”,context.body.Length);return next();}}
活动。当前
可能是无效的
如果没有配置的跟踪侦听器。在调用活动
实例,或使用null条件运算符(?.
).