Рассмотрим этот код:< /p>
Код: Выделить всё
public class SomeController {
private final com.google.common.util.concurrent.TimeLimiter timeLimiter = SimpleTimeLimiter.create(
Executors.newCachedThreadPool(
new ThreadFactoryBuilder()
.setNameFormat("SomePrefix-%d")
.setDaemon(true)
.build()
)
);
@Trace(async = true)
private Result someMethodInternal(Http.Request request, com.newrelic.api.agent.Token token) {
token.link();
... business logic here ...
}
public Result someMethod(Http.Request request) {
var token = NewRelic.getAgent().getTransaction().getToken();
try {
return timeLimiter.callWithTimeout(
() -> someMethodInternal(token),
1L, TimeUnit.MINUTES
);
} finally {
token.expire();
}
}
}
< img alt="Без разбивки сегментов" src="https://i.sstatic.net/M6Jja4fp.png" />
Если timeLimiter не используется, это показывает различные сегменты того, сколько времени затрачивается на выполнение внутренних вызовов, таких как работа с базой данных и т. д.:
[img]https://i.sstatic.net /wKzV4mY8.png[/img]
Документация NewRelic's Token::link предполагает, что @Trace(async=true) требуется для внутреннего метода, который присутствует в приведенном выше коде.
Код: Выделить всё
TimeLimiterЧего еще здесь может не хватать? п>
Подробнее здесь: https://stackoverflow.com/questions/790 ... her-thread
Мобильная версия