package com.googlesource.gerrit.plugins.healthcheck.check;

import com.google.gerrit.metrics.Counter0;
import com.google.gerrit.metrics.Description;
import com.google.gerrit.metrics.MetricMaker;
import com.google.gerrit.metrics.Timer0;
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
import java.util.concurrent.TimeUnit;

public class MetricsHandler {
  private final Timer0 latencyMetric;
  private final Counter0 failureMetric;

  public interface Factory {
    public MetricsHandler create(String name);
  }

  @Inject
  public MetricsHandler(@Assisted String name, MetricMaker metricMaker) {
    this.latencyMetric =
        metricMaker.newTimer(
            name + "/latency",
            new Description(String.format("%s health check latency execution (ms)", name))
                .setCumulative()
                .setUnit(Description.Units.MILLISECONDS));

    this.failureMetric =
        metricMaker.newCounter(
            name + "/failure",
            new Description(String.format("%s healthcheck failures count", name))
                .setCumulative()
                .setRate()
                .setUnit("failures"));
  }

  public void sendMetrics(HealthCheck.Status status) {
    latencyMetric.record(status.elapsed, TimeUnit.MILLISECONDS);
    if (status.isFailure()) {
      failureMetric.increment();
    }
  }
}
