Мы используем com.codahale.metrics.Timer
для определения времени, необходимого для завершения метода completeableFuture
.
У нас есть этот код:
import com.codahale.metrics.Timer;
import com.codahale.metrics.MetricRegistry;
...
Timer timer = MetricsRegistry.timer("older-Cat-latency");
Timer.Context context = timer.time();
DeferredResult<OlderCat> deferredResult = new DeferredResult<>();
catService.getOlderCat(catName)
.handle((result, err) -> {
if(err != null){
deferredResult.setErrorResult(new OlderCat(...));
return null;
}
context.stop(); <---- // here we stop the timer
deferredResult.setResult(result);
return null;
});
return deferredResult;
Теоретически этот код должен бытьХорошо, но при проверке времени в Prometheus
мы видим очень низкую задержку синхронизации, которая, кажется, не соответствует фактическим результатам, которые мы получаем (например, 15 миллисекунд измеряются таймером, по сравнению с фактическими 2 секундами, которые мы измеряем«от руки»)
Таким образом, кажется, есть два варианта:
- Код выше не синхронизируется правильно
- Код синхронизируется правильно, нографики в Графане как-то вводят в заблуждение.
Знаете ли вы, правильный ли временной код?