Usando Duration.ofMillis con un valor de nanosegundos.
Encontré un fragmento de código que implementa un temporizador para Micrometer y necesito ayuda para descifrar el siguiente fragmento de código porque creo que lo estoy entendiendo incorrectamente. Según mi entendimiento, stopwatch.stop().elapsed(Nanos) devolverá los nanosegundos que tardó desde el momento en que se inició el cronómetro hasta que se detuvo.
Ahora bien, en cuanto a Duration.ofMillis, he leído la documentación de Java y dice que aquí se supone que se pasa un valor de milisegundos. Este fragmento de código pasa nanosegundos, así que en este caso, ¿funcionará la parte de duration.ofMillis? Suponiendo que el cronómetro se detuvo después de 100 ms, creo que Duration.ofMillis obtendrá el valor 100000000. No puedo entender qué sucede después de eso.
Stopwatch stopwatch = Stopwatch.createStarted();
meterRegistry.timer(name)
.record(Duration.ofMillis(stopwatch.stop().elapsed(TimeUnit.NANOSECONDS)));
davy.ai
El fragmento de código anterior crea un objeto
Stopwatch
y lo inicia usandoStopwatch.createStarted()
. La claseStopwatch
es parte de la biblioteca Guava y se utiliza para medir el tiempo transcurrido.La siguiente línea de código registra una métrica de temporizador en
meterRegistry
con el nombre proporcionado utilizando el métodorecord()
. La duración del temporizador registrado se calcula llamando astopwatch.stop().elapsed(TimeUnit.NANOSECONDS)
, que devuelve el tiempo transcurrido en nanosegundos desde que se inició el temporizador.Sin embargo, a continuación se utiliza el método
Duration.ofMillis()
para convertir este valor en un objetoDuration
, que pretende representar una duración en milisegundos. Esto parece incorrecto ya que el valor del tiempo transcurrido está en nanosegundos, no en milisegundos.Es posible que se esté utilizando el método
Duration.ofMillis()
como un atajo para crear un objetoDuration
con la unidad de tiempo correcta, ya que no existe un métodoDuration.ofNanos()
disponible. Sin embargo, el objetoDuration
resultante no representará de manera precisa el tiempo transcurrido en milisegundos.Si el temporizador se detuvo después de 100 ms, el tiempo transcurrido en nanosegundos sería de 100,000,000. Al llamar a
Duration.ofMillis(100_000_000)
, el objetoDuration
resultante representaría una duración de aproximadamente 1667 minutos (100,000,000 / 1000 / 60), lo cual claramente no es lo que se pretendía.Para convertir correctamente el tiempo transcurrido en nanosegundos en un objeto
Duration
en Java, puedes utilizar el siguiente código:Esto crea un objeto
Duration
con el tiempo transcurrido en nanosegundos. Luego, el objetoDuration
se puede utilizar según sea necesario, como en el registro de la métrica del temporizador.