忽略异步等待播放!新遗物中的Scala应用程序

时间:2014-01-21 15:00:32

标签: asynchronous playframework-2.0 scala-2.10 newrelic

在我的游戏中! 2.1 Rest API App我已经安装了New Relic。

我的所有控制器操作都继承自一个为响应的未来添加超时的方法。如果任何此类方法花费的时间超过20秒,则终止请求,结果为5XX错误。

代码基本上是这样的:

val timeout = 20

action(request).orTimeout(
     name + " backend timed-out after "+timeout+" seconds", timeout * 1000).map { 
     resultOrTimeout => { //... process response or timeout with fold

我遇到的问题是,在分析新文物中的数据时,我总是得到20秒的平均响应时间。

查看跟踪时,我可以看到新的relic将超时函数解释为响应的容器。

  

Slowest components                         Count    Duration    %
Async Wait                                  7       20,000 ms   100%
Action$$anonfun$apply$1.apply()             2       2 ms         0%
PlayDefaultUpstreamHandler$$an....apply()     1       1 ms         0%
PlayDefaultUpstream....$$anonfun$24.apply() 1      1 ms         0%
SmaugController$class.akkify()               1       0 ms         0%
PlayDefaultUpstreamHandler.handleAction$1() 1       0 ms          0%
Total                                               20,000 ms   100%

有什么方法可以阻止新遗物考虑超时?

谢谢!

编辑:我扩展了交易以获取更多信息:

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毫秒,所有其余的都由异步等待调用消耗

1 个答案:

答案 0 :(得分:1)

不幸的是,目前无法忽略New Relic中的特定超时。

但是,New Relic Java Agent的3.4.1版本支持Play 2.2.1中记录的句柄超时示例代码:http://www.playframework.com/documentation/2.2.1/ScalaAsync

您可以在此处下载:https://download.newrelic.com/newrelic/java-agent/newrelic-agent/3.4.1/

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)
  }
}