package eu.dnetlib.repo.manager.controllers; import eu.dnetlib.repo.manager.service.PiWikService; import eu.dnetlib.repo.manager.service.RepositoryService; import io.micrometer.core.instrument.binder.jvm.DiskSpaceMetrics; import io.micrometer.core.instrument.binder.jvm.JvmGcMetrics; import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics; import io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics; import io.micrometer.core.instrument.binder.system.ProcessorMetrics; import io.micrometer.core.instrument.binder.system.UptimeMetrics; import io.micrometer.prometheus.PrometheusConfig; import io.micrometer.prometheus.PrometheusMeterRegistry; import io.prometheus.client.exporter.common.TextFormat; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import java.io.File; @RestController @RequestMapping("/actuator/prometheus") public class PrometheusController { // TODO: remove this with migration to Spring Boot 2 private static final Logger LOGGER = Logger.getLogger(PrometheusController.class); private final PiWikService piWikService; private final RepositoryService repositoryService; @Autowired public PrometheusController(PiWikService piWikService, RepositoryService repositoryService) { this.piWikService = piWikService; this.repositoryService = repositoryService; } @RequestMapping(method = RequestMethod.GET, path = "", produces = MediaType.TEXT_PLAIN_VALUE) public String getPiwikMetrics() { PrometheusMeterRegistry registry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT); registry.counter("provide_repositories_registered").increment(repositoryService.getTotalRegisteredRepositories()); registry.counter("provide_usagecounts_repositories_registered").increment(piWikService.getTotal()); registry.counter("provide_usagecounts_repositories_validated").increment(piWikService.getValidated(true)); return registry.scrape(TextFormat.CONTENT_TYPE_OPENMETRICS_100); } @RequestMapping(method = RequestMethod.GET, path = "metrics", produces = MediaType.TEXT_PLAIN_VALUE) public String getMetrics() { PrometheusMeterRegistry registry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT); new JvmThreadMetrics().bindTo(registry); try (JvmGcMetrics jvmGcMetrics = new JvmGcMetrics() ) { jvmGcMetrics.bindTo(registry); } catch (Exception e) { LOGGER.error("", e); } new JvmMemoryMetrics().bindTo(registry); new DiskSpaceMetrics(new File("/")).bindTo(registry); new ProcessorMetrics().bindTo(registry); // metrics related to the CPU stats new UptimeMetrics().bindTo(registry); return registry.scrape(TextFormat.CONTENT_TYPE_OPENMETRICS_100); } }