用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&lt;MassTransit.ReceiveContext&gt;,MassTransit.Pipeline.IConsumePipe" />
  </match>

我有一种感觉,我需要仪器不同,由于类隐式实现IPipe<ReceiveContext>接口?

用MassTransit配置NewRelic(类似于NServiceBus)

您应该能够以类似的方式挂钩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&lt;MassTransit.ReceiveContext&gt;.Send" parameters="MassTransit.ReceiveContext" />
            </match>
        </tracerFactory>
    </instrumentation>
</extension>

似乎方法签名完全改变了,因为隐式实现了IPipe接口。

我还将其添加到github存储库- https://github.com/LiberisLabs/NewRelic.Agent.CustomTransactions