我希望为系统中的某些重要功能调用发布自定义性能计数器。我想在生产环境中持续监控这些性能计数器。
我有没有办法用自定义属性标记某些函数,这些属性可以衡量执行给定函数所花费的时间?我希望避免注入自定义代码,从而使用监控代码污染与业务相关的功能。
属性中的代码如何跟踪执行函数所花费的时间?
请不要建议使用Profiler。我不打算调试或基准性能。但只是想在每周7天的生产中跟踪它。
答案 0 :(得分:6)
嗯,你需要一些代码来执行你的函数并分析你的attribute
所以它会知道它需要在你的函数之前和之后执行某些东西(例如你的情况下执行时间测量) - 它可能是使用Decorator设计模式,Reflection,Proxy object等等。
在标记时,这是一个方面编程问题,您可以利用PostSharp第三方来实现它。
使用PostSharp查看有关性能计数器的这个特定页面,确实使用了属性:http://www.postsharp.net/aspects/examples/performance
要详细说明@ pasty的注释,你可以用Interception using Unity DI Container拦截你的方法调用,确实需要更多代码来编写,这里是Unity拦截功能的简单示例流程图:
注意步骤 3 ,其中代理对象实际返回给客户端,并且由此实现了拦截行为。