【问题标题】:Configuring NewRelic with MassTransit (Similar to NServiceBus)使用 MassTransit 配置 NewRelic(类似于 NServiceBus)
【发布时间】:2016-01-11 07:20:12
【问题描述】:

我一直在尝试在 NewRelic 中为 MassTransit 设置自定义指标,类似于 NServiceBus 与 NewRelic 的工作方式。使用 NewRelic .Net Custom Transactions 文档,这似乎很容易实现。

到目前为止,我没有在 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&lt;ReceiveContext&gt; 接口,我觉得我需要对其进行不同的检测?

【问题讨论】:

  • 添加到 google 组也只是为了增加可见性,将使它们都保持更新。谢谢
  • np。请注意,该组的新海报经过审核,因此可能不会立即显示。
  • 所以这是在检测代码本身,而不是在 API 级别挂钩?
  • 只是检测类似于 Fody 的代码,所以它们只是包装方法调用。

标签: c# .net nservicebus newrelic masstransit


【解决方案1】:

您应该能够以类似的方式挂钩ReceivePipe.Send 方法。

https://github.com/MassTransit/MassTransit/blob/master/src/MassTransit/Pipeline/Pipes/ReceivePipe.cs#L30

<?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 语法的猜测,但方法是合理的。

【讨论】:

  • 啊,这在 3.0.14 中看起来很新,我必须更新软件包并尝试一下。
  • 刚刚更新了软件包,但仍然无法从中获得任何输出。有关更多详细信息,请参见上述问题。
【解决方案2】:

在@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

【讨论】:

    猜你喜欢
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多