2014-01-21 6 views
0

В моей игре! 2.1. Приложение Rest API. Я установил новую реликвию.Игнорирование Async Ожидание воспроизведения! 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 

Проблема у меня в том, что при анализе данных в новой реликвии, Im получая, что среднее время отклика 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% 

Есть ли способ я могу предотвратить новый реликтовых от считая, что тайм-аут?

Спасибо!

EDIT: Я расширил сделку, чтобы получить больше информации:

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 мс, все остальное время потребляемую Async Ожидание вызова

ответ

1

К сожалению, в настоящее время невозможно игнорировать этот конкретный тайм-аут в New Relic.

Однако выпуск нового 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) 
    } 
} 
+0

В в конце он работал с Play 2.1.1. Важны были методы Promise.timeout и Future.firstCompletedOf. Метод Action.async не был необходим, чтобы новая реликвия своевременно сообщила о времени. – dgrandes