Asynchronous 忽略异步等待播放!New Relic中的Scala应用程序

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

在我的戏里!2.1 Rest API应用程序我已安装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
我遇到的问题是,在分析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)
  }
}