用MassTransit配置NewRelic(类似于NServiceBus)
本文关键字:类似于 NServiceBus NewRelic MassTransit 配置 | 更新日期: 2023-09-27 18:17:32
我一直在尝试为MassTransit设置NewRelic内部的自定义指标,类似于NServiceBus与NewRelic的工作方式。使用NewRelic . net自定义事务文档似乎很容易实现。
到目前为止,我还没有检查出GitHub上的MassTransit代码,我已经设法为MassTransit组合了一个简单的仪器文件,但这只包含消息发送,但我真的想要收到消息,但我似乎找不到第一个拦截,这与传输实现无关。
<?xml version="1.0" encoding="utf-8"?>
<extension xmlns="urn:newrelic-extension">
<instrumentation>
<tracerFactory metricName="MassTransit/Send">
<match assemblyName="MassTransit" className="MassTransit.Transports.SendEndpoint">
<exactMethodMatcher methodName="Send" parameters="!!0,System.Threading.CancellationToken" />
<exactMethodMatcher methodName="Send" parameters="!!0,MassTransit.Pipeline.IPipe`1[MassTransit.SendContext`1[!!0]],System.Threading.CancellationToken" />
</match>
</tracerFactory>
</instrumentation>
</extension>
我试图创建等效的MassTransit的NServiceBus仪器文件的例子如下:
<?xml version="1.0" encoding="utf-8"?>
<extension xmlns="urn:newrelic-extension">
<instrumentation>
<tracerFactory>
<match assemblyName="NServiceBus.Core" className="NServiceBus.InvokeHandlersBehavior">
<exactMethodMatcher methodName="Invoke" parameters="NServiceBus.Pipeline.Contexts.IncomingContext,System.Action" />
</match>
</tracerFactory>
<tracerFactory>
<match assemblyName="NServiceBus.Core" className="NServiceBus.Unicast.UnicastBus">
<exactMethodMatcher methodName="SendMessage" parameters="NServiceBus.Unicast.SendOptions,NServiceBus.Unicast.Messages.LogicalMessage" />
</match>
</tracerFactory>
</instrumentation>
</extension>
根据Chris Patterson的建议,我已经更新到新的包,所以有一个方法我可以在ReceivePipe
中挂钩。
我试过仪器这个方法,但没有成功,我怎么能看到,它可能仪器在日志中打开所有日志记录:
[Trace] 2015-10-19 09:08:45 Possibly instrumenting: (Module: D:'Liberis'Services'Liberis.Salesforce.Service'MassTransit.dll, AppDomain: Liberis.Salesforce.Service.exe)[MassTransit]MassTransit.Pipeline.Pipes.ReceivePipe.MassTransit.Pipeline.IPipe<MassTransit.ReceiveContext>.Send(MassTransit.ReceiveContext)
我也尝试将配置更新为以下内容以匹配上面的内容,但仍然没有成功:
<?xml version="1.0" encoding="utf-8"?>
<extension xmlns="urn:newrelic-extension">
<instrumentation>
<tracerFactory name="NewRelic.Agent.Core.Tracer.Factories.BackgroundThreadTracerFactory" metricName="MassTransit/Receive">
<match assemblyName="MassTransit" className="MassTransit.Pipeline.Pipes.ReceivePipe.MassTransit.Pipeline.IPipe<MassTransit.ReceiveContext>">
<exactMethodMatcher methodName="Send" parameters="MassTransit.ReceiveContext" />
</match>
</tracerFactory>
</instrumentation>
</extension>
我也尝试使用nrconfig工具,但只输出以下ReceivePipe
类:
<match assemblyName="MassTransit" className="MassTransit.Pipeline.Pipes.ReceivePipe">
<exactMethodMatcher methodName=".ctor" parameters="MassTransit.Pipeline.IPipe`1<MassTransit.ReceiveContext>,MassTransit.Pipeline.IConsumePipe" />
</match>
我有一种感觉,我需要仪器不同,由于类隐式实现IPipe<ReceiveContext>
接口?
您应该能够以类似的方式挂钩ReceivePipe.Send
方法。
https://github.com/MassTransit/MassTransit/blob/master/src/MassTransit/Pipeline/Pipes/ReceivePipe.cs翻译
<?xml version="1.0" encoding="utf-8"?>
<extension xmlns="urn:newrelic-extension">
<instrumentation>
<tracerFactory metricName="MassTransit/Receive">
<match assemblyName="MassTransit" className="MassTransit.Pipeline.Pipe.ReceivePipe">
<exactMethodMatcher methodName="Send" parameters="ReceiveContext" />
</match>
</tracerFactory>
</instrumentation>
</extension>
至少,这是我对XML语法的猜测,但是这个方法是合理的。
在@Chris Patterson的帮助下,我已经设法弄清楚了,比我想象的要付出更多的努力。
下面是需要的配置xml:
<?xml version="1.0" encoding="utf-8"?>
<extension xmlns="urn:newrelic-extension">
<instrumentation>
<tracerFactory name="NewRelic.Agent.Core.Tracer.Factories.BackgroundThreadTracerFactory" metricName="MassTransit/Send">
<match assemblyName="MassTransit" className="MassTransit.Transports.SendEndpoint">
<exactMethodMatcher methodName="Send" parameters="!!0,System.Threading.CancellationToken" />
<exactMethodMatcher methodName="Send" parameters="!!0,MassTransit.Pipeline.IPipe`1[MassTransit.SendContext`1[!!0]],System.Threading.CancellationToken" />
</match>
</tracerFactory>
<tracerFactory name="NewRelic.Agent.Core.Tracer.Factories.BackgroundThreadTracerFactory" metricName="MassTransit/Receive">
<match assemblyName="MassTransit" className="MassTransit.Pipeline.Pipes.ReceivePipe">
<exactMethodMatcher methodName="MassTransit.Pipeline.IPipe<MassTransit.ReceiveContext>.Send" parameters="MassTransit.ReceiveContext" />
</match>
</tracerFactory>
</instrumentation>
</extension>
似乎方法签名完全改变了,因为隐式实现了IPipe接口。
我还将其添加到github存储库- https://github.com/LiberisLabs/NewRelic.Agent.CustomTransactions