在我的游戏中! 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毫秒,所有其余的都由异步等待调用消耗
答案 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)
}
}