如何测量 NServiceBus 中 "Handle" 方法的调用时间?
How to measure invocation time of "Handle" method in NServiceBus?
我需要在 IHandleMessages<> 接口的每个实例中测量 Handle 方法的调用时间。
我尝试使用 Castle Windsor 的拦截器,
public class NsbHandlerMeasurementInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
if (invocation.Method.Name == ExpressionExtender.GetMethodName<IHandleMessages<DummyType>>(b => b.Handle(null)))
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
invocation.Proceed();
stopwatch.Stop();
// save stopwatch.ElapsedMilliseconds value
}
else
{
invocation.Proceed();
}
}
}
安装代码:
container.Register(Component.For<NsbHandlerMeasurementInterceptor>());
container.Kernel.ComponentModelBuilder.AddContributor(new NsbWindsorModelConstructionContributor());
public class NsbWindsorModelConstructionContributor : IContributeComponentModelConstruction
{
public void ProcessModel(global::Castle.MicroKernel.IKernel kernel, global::Castle.Core.ComponentModel model)
{
if (model.Services.Any(s => s.ImplementsGenericInterface(typeof(IHandleMessages<>))))
{
model.Interceptors.AddIfNotInCollection(new InterceptorReference(typeof(NsbHandlerMeasurementInterceptor)));
}
}
}
但从那一刻起,Handle 方法就不会触发。
我知道 NSB 中的性能计数器,但我需要更具体、面向类型的测量。是否可能并且可以实现?
要衡量所有确实有性能计数器,但如果这还不够,那么您可以在 NServiceBus 管道中创建自己的步骤。
http://docs.particular.net/nservicebus/pipeline/customizing
通过继承IBehavior<IncomingContext>
创建自定义行为并实现接口。您现在可以访问包含有关类型信息的 IncomingContext
参数。
看看 InvokeHandlersBehavior
行为的实现。此行为调用实际的处理程序并且可能想要包装它。
class InvokeHandlersBehavior : IBehavior<IncomingContext>
{
public void Invoke(IncomingContext context, Action next)
{
ActiveSagaInstance saga;
if (context.TryGet(out saga) && saga.NotFound && saga.SagaType == context.MessageHandler.Instance.GetType())
{
next();
return;
}
var messageHandler = context.MessageHandler;
messageHandler.Invocation(messageHandler.Instance, context.IncomingLogicalMessage.Instance);
next();
}
}
然后您需要注册它,以便它调用包含在管道中。
class NewStepInPipeline : RegisterStep
{
public NewStepInPipeline()
: base("NewStepInPipeline", typeof(SampleBehavior), "Logs a warning when processing takes too long")
{
// Optional: Specify where it needs to be invoked in the pipeline, for example InsertBefore or InsertAfter
InsertBefore(WellKnownStep.InvokeHandlers);
}
}
class NewStepInPipelineRegistration : INeedInitialization
{
public void Customize(BusConfiguration busConfiguration)
{
// Register the new step in the pipeline
busConfiguration.Pipeline.Register<NewStepInPipeline>();
}
}
请注意此代码需要 v5。查看特定文档网站以获取有关其他版本的帮助。
我需要在 IHandleMessages<> 接口的每个实例中测量 Handle 方法的调用时间。 我尝试使用 Castle Windsor 的拦截器,
public class NsbHandlerMeasurementInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
if (invocation.Method.Name == ExpressionExtender.GetMethodName<IHandleMessages<DummyType>>(b => b.Handle(null)))
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
invocation.Proceed();
stopwatch.Stop();
// save stopwatch.ElapsedMilliseconds value
}
else
{
invocation.Proceed();
}
}
}
安装代码:
container.Register(Component.For<NsbHandlerMeasurementInterceptor>());
container.Kernel.ComponentModelBuilder.AddContributor(new NsbWindsorModelConstructionContributor());
public class NsbWindsorModelConstructionContributor : IContributeComponentModelConstruction
{
public void ProcessModel(global::Castle.MicroKernel.IKernel kernel, global::Castle.Core.ComponentModel model)
{
if (model.Services.Any(s => s.ImplementsGenericInterface(typeof(IHandleMessages<>))))
{
model.Interceptors.AddIfNotInCollection(new InterceptorReference(typeof(NsbHandlerMeasurementInterceptor)));
}
}
}
但从那一刻起,Handle 方法就不会触发。
我知道 NSB 中的性能计数器,但我需要更具体、面向类型的测量。是否可能并且可以实现?
要衡量所有确实有性能计数器,但如果这还不够,那么您可以在 NServiceBus 管道中创建自己的步骤。
http://docs.particular.net/nservicebus/pipeline/customizing
通过继承IBehavior<IncomingContext>
创建自定义行为并实现接口。您现在可以访问包含有关类型信息的 IncomingContext
参数。
看看 InvokeHandlersBehavior
行为的实现。此行为调用实际的处理程序并且可能想要包装它。
class InvokeHandlersBehavior : IBehavior<IncomingContext>
{
public void Invoke(IncomingContext context, Action next)
{
ActiveSagaInstance saga;
if (context.TryGet(out saga) && saga.NotFound && saga.SagaType == context.MessageHandler.Instance.GetType())
{
next();
return;
}
var messageHandler = context.MessageHandler;
messageHandler.Invocation(messageHandler.Instance, context.IncomingLogicalMessage.Instance);
next();
}
}
然后您需要注册它,以便它调用包含在管道中。
class NewStepInPipeline : RegisterStep
{
public NewStepInPipeline()
: base("NewStepInPipeline", typeof(SampleBehavior), "Logs a warning when processing takes too long")
{
// Optional: Specify where it needs to be invoked in the pipeline, for example InsertBefore or InsertAfter
InsertBefore(WellKnownStep.InvokeHandlers);
}
}
class NewStepInPipelineRegistration : INeedInitialization
{
public void Customize(BusConfiguration busConfiguration)
{
// Register the new step in the pipeline
busConfiguration.Pipeline.Register<NewStepInPipeline>();
}
}
请注意此代码需要 v5。查看特定文档网站以获取有关其他版本的帮助。