PrometheusPingTask.java

/*
 * Copyright (C) 2025 B3Partners B.V.
 *
 * SPDX-License-Identifier: MIT
 */
package org.tailormap.api.scheduling;

import io.micrometer.core.annotation.Timed;
import java.lang.invoke.MethodHandles;
import java.time.Instant;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.PersistJobDataAfterExecution;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.lang.NonNull;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.tailormap.api.prometheus.PrometheusService;

@DisallowConcurrentExecution
@PersistJobDataAfterExecution
public class PrometheusPingTask extends QuartzJobBean implements Task {
  private static final Logger logger =
      LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
  private final PrometheusService prometheusService;

  public PrometheusPingTask(PrometheusService prometheusService) {
    this.prometheusService = prometheusService;
  }

  @Timed(value = "prometheusServiceTask", description = "Time taken to ping prometheus")
  @Override
  protected void executeInternal(@NonNull JobExecutionContext context) throws JobExecutionException {
    final JobDataMap persistedJobData = context.getJobDetail().getJobDataMap();
    if (prometheusService.isPrometheusAvailable()) {
      persistedJobData.put(LAST_RESULT_KEY, "Prometheus is available. Check succeeded.");
      context.setResult("Prometheus is available");
    } else {
      logger.warn("PrometheusService is not available");
      persistedJobData.put(LAST_RESULT_KEY, "Prometheus is not available. Check failed.");
      context.setResult("Prometheus is not available");
    }
    persistedJobData.put(EXECUTION_FINISHED_KEY, Instant.now());
  }

  @Override
  public TaskType getType() {
    return TaskType.PROMETHEUS_PING;
  }

  @Override
  public String getDescription() {
    return "Ping Prometheus to ensure it is available.";
  }
}