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}