我有各种Web服务向用户返回数据:
伪代码:
MyController {
SoapRequest1 {
processRequest
return data1
}
SoapRequest2 {
return data2
}
}
我希望单独监控这些请求的性能。这就是我在考虑的问题:
伪代码:
MyController {
List latency
SoapRequest1 {
timeStamp1
processRequest
return data1
latency.add(timeStamp2 - timeStamp1)
timeStamp2
}
SoapRequest2 {
timeStamp1
processRequest
timeStamp2
latency.add(timeStamp2 - timeStamp1)
return data2
}
getRequestLatencies{
return latency
}
}
然后,我可以随时调用getRequestLatencies
来访问请求的延迟。这些只是一个很高的水平,但我认为这应该有效。需要进一步的工作来过滤特定的延迟,但在高水平这是否足够?我不想修改控制器来访问每个请求的延迟,但我不知道任何其他方法?是否有我不知道的设计模式?
需要从UI前端访问延迟。所以我将通过服务公开延迟值。
答案 0 :(得分:0)
我们在这里使用Servlet过滤器来实现基本相同的结果。我很确定Spring MVC有自己的Filter概念。这个概念是在入站侧停止时启动一个秒表,并在响应出站时记录它。通过JMX MBean或其他东西暴露这个孩子,现在你只需要一两个小时的工作就可以监控它。像冠军一样工作。
然后挑战不是跟踪延迟,而是在过滤器抓取所有请求时“分类”请求,你通常需要知道诸如“/ somerequest2平均2ms而/ somerequest3平均8ms”之类的东西。已编译的正则表达式列表在这里有一些“全部捕获”来处理我们有一些我们不太关心的API的情况。
原始但有效。
答案 1 :(得分:0)
我认为混合(性能)监控和业务代码不是好设计 - 我更喜欢外部监控解决方案/代码,您可以在本地监控服务(来自同一服务器)以防止网络延迟或监控该服务使用您的实际网络连接来测试网络延迟。在这两种情况下,延迟计算的逻辑都会在方法调用之前和之后发生。
编辑我对弹簧控制器没有经验,但您是否需要任何特殊配置来运行控制器,如容器或什么?