001package io.prometheus.metrics.core.datapoints; 002 003import io.prometheus.metrics.annotations.StableApi; 004import io.prometheus.metrics.model.snapshots.Unit; 005import java.io.Closeable; 006import java.util.function.DoubleConsumer; 007 008/** Helper class for observing durations. */ 009@StableApi 010public class Timer implements Closeable { 011 012 private final DoubleConsumer observeFunction; 013 private final long startTimeNanos = System.nanoTime(); 014 015 /** 016 * Constructor is package private. Use the {@link TimerApi} provided by the implementation of the 017 * {@link DataPoint}. 018 */ 019 Timer(DoubleConsumer observeFunction) { 020 this.observeFunction = observeFunction; 021 } 022 023 /** 024 * Records the observed duration in seconds since this {@code Timer} instance was created. 025 * 026 * @return the observed duration in seconds. 027 */ 028 public double observeDuration() { 029 double elapsed = Unit.nanosToSeconds(System.nanoTime() - startTimeNanos); 030 observeFunction.accept(elapsed); 031 return elapsed; 032 } 033 034 /** Same as {@link #observeDuration()}. */ 035 @Override 036 public void close() { 037 observeDuration(); 038 } 039}