2014-01-21 68 views
0

在我玩! 2.1 Rest API App我已經安裝了New Relic。忽略異步等待玩! Scala 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秒平均響應時間。

查看跟蹤時,我可以看到新遺蹟將超時函數解釋爲響應的容器。

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

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

然而,3.4.1版本中的新文物的Java代理支持播放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) 
    } 
} 
+0

在結束它與Play 2.1.1一起工作。重要的是Promise.timeout和Future.firstCompletedOf方法。新的文物正確地報告時間並不需要Action.async方法。 – dgrandes