Asynchronous 忽略异步等待播放!New Relic中的Scala应用程序
在我的戏里!2.1 Rest API应用程序我已安装New Relic 我的所有控制器操作都继承自一个为响应的未来添加超时的方法。如果任何此类方法花费的时间超过20秒,则终止请求,结果为5XX错误 代码基本上是这样的:Asynchronous 忽略异步等待播放!New Relic中的Scala应用程序,asynchronous,playframework-2.0,scala-2.10,newrelic,Asynchronous,Playframework 2.0,Scala 2.10,Newrelic,在我的戏里!2.1 Rest API应用程序我已安装New Relic 我的所有控制器操作都继承自一个为响应的未来添加超时的方法。如果任何此类方法花费的时间超过20秒,则终止请求,结果为5XX错误 代码基本上是这样的: val timeout = 20 action(request).orTimeout( name + " backend timed-out after "+timeout+" seconds", timeout * 1000).map { resultO
val timeout = 20
action(request).orTimeout(
name + " backend timed-out after "+timeout+" seconds", timeout * 1000).map {
resultOrTimeout => { //... process response or timeout with fold
我遇到的问题是,在分析NewRelic中的数据时,我总是得到20秒的平均响应时间
当查看跟踪时,我可以看到newrelic将timeout函数解释为响应的容器
我有没有办法阻止new relic考虑超时
谢谢
编辑:我扩展了事务以获取更多信息:
Duration (ms) Duration (%) Segment Drilldown Timestamp
20,000 100.00% HttpRequestDecoder.unfoldAndFireMessageReceived()
20,000 100.00% Async Wait
Stack trace
scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:23)
java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1146)
java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:615)
java.lang.Thread.run (Thread.java:679)
107 0.53% SmaugController$class.akkify()
如您所见,真正的工作是在akkify方法中完成的,这需要107毫秒,其余的都被异步等待调用消耗掉了。不幸的是,在NewRelic中,目前不可能忽略这个特定的超时 但是,New Relic Java Agent的3.4.1版本支持Play 2.2.1中记录的句柄超时示例代码: 你可以在这里下载:
最后,它与Play 2.1.1一起工作。重要的是Promise.timeout和Future.firstCompletedOf方法。new relic不需要Action.async方法来正确报告时间。
Duration (ms) Duration (%) Segment Drilldown Timestamp
20,000 100.00% HttpRequestDecoder.unfoldAndFireMessageReceived()
20,000 100.00% Async Wait
Stack trace
scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:23)
java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1146)
java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:615)
java.lang.Thread.run (Thread.java:679)
107 0.53% SmaugController$class.akkify()
import play.api.libs.concurrent.Execution.Implicits.defaultContext
import scala.concurrent.duration._
def index = Action.async {
val futureInt = scala.concurrent.Future { intensiveComputation() }
val timeoutFuture = play.api.libs.concurrent.Promise.timeout("Oops", 1.second)
Future.firstCompletedOf(Seq(futureInt, timeoutFuture)).map {
case i: Int => Ok("Got result: " + i)
case t: String => InternalServerError(t)
}
}