From e0a3e6a14f54c11e3a68b7759f110586aed5e861 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Fri, 26 Nov 2021 16:31:31 +0100 Subject: [PATCH] first temptative --- .../organizations/MainApplication.java | 2 +- .../organizations/MockSecurityConfig.java | 2 +- .../OAuth2WebSecurityConfig.java | 2 +- .../controller/KpiMetricsController.java | 33 +++++++++++++++++ .../metrics/ValidOrganizationsMetric.java | 3 ++ .../eu/dnetlib/common/metrics/MetricInfo.java | 4 +-- .../dnetlib/common/metrics/MetricUtils.java | 35 +++++++++++++++++++ 7 files changed, 75 insertions(+), 6 deletions(-) create mode 100644 apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/KpiMetricsController.java create mode 100644 libs/dnet-apps-common/src/main/java/eu/dnetlib/common/metrics/MetricUtils.java diff --git a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/MainApplication.java b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/MainApplication.java index 7e24b9d0..ec4fa96f 100644 --- a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/MainApplication.java +++ b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/MainApplication.java @@ -12,7 +12,7 @@ import springfox.documentation.service.ApiInfo; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; -@SpringBootApplication +@SpringBootApplication(scanBasePackages = "eu.dnetlib") @EnableSwagger2 @EnableCaching @EnableScheduling diff --git a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/MockSecurityConfig.java b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/MockSecurityConfig.java index 17fc36c2..dccbd71b 100644 --- a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/MockSecurityConfig.java +++ b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/MockSecurityConfig.java @@ -49,7 +49,7 @@ public class MockSecurityConfig extends WebSecurityConfigurerAdapter { .hasAnyRole(OpenOrgsConstants.VALID_ROLES) .antMatchers("/registration_api/**") .hasRole(OpenOrgsConstants.NOT_AUTORIZED_ROLE) - .antMatchers("/common/**", "/resources/**", "/webjars/**", "/metrics", "/health", "/dbmodel/**") + .antMatchers("/common/**", "/resources/**", "/webjars/**", "/metrics", "/health", "/kpis", "/dbmodel/**") .permitAll() .antMatchers("/oa_api/**") .permitAll() diff --git a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/OAuth2WebSecurityConfig.java b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/OAuth2WebSecurityConfig.java index 7125793a..2ff636dc 100644 --- a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/OAuth2WebSecurityConfig.java +++ b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/OAuth2WebSecurityConfig.java @@ -62,7 +62,7 @@ public class OAuth2WebSecurityConfig extends WebSecurityConfigurerAdapter { .hasAnyRole(OpenOrgsConstants.VALID_ROLES) .antMatchers("/registration_api/**") .hasRole(OpenOrgsConstants.NOT_AUTORIZED_ROLE) - .antMatchers("/", "/common/**", "/resources/**", "/webjars/**", "/metrics", "/health", "/dbmodel/**") + .antMatchers("/", "/common/**", "/resources/**", "/webjars/**", "/metrics", "/health", "/kpis", "/dbmodel/**") .permitAll() .antMatchers("/oa_api/**") .hasIpAddress(openaireApiValidSubnet) diff --git a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/KpiMetricsController.java b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/KpiMetricsController.java new file mode 100644 index 00000000..a5336c60 --- /dev/null +++ b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/controller/KpiMetricsController.java @@ -0,0 +1,33 @@ +package eu.dnetlib.organizations.controller; + +import static org.springframework.http.HttpHeaders.CONTENT_TYPE; + +import java.util.Set; + +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import eu.dnetlib.common.metrics.MetricUtils; +import io.prometheus.client.exporter.common.TextFormat; + +@Controller +public class KpiMetricsController { + + @ResponseBody + @RequestMapping(value = "/kpis", method = RequestMethod.GET, produces = "*/*") + public ResponseEntity kpiMetrics( + @RequestParam(value = "name[]", required = false, defaultValue = "") final Set name, + @RequestHeader(value = "Accept", required = false, defaultValue = "") final String accept) { + + final String contentType = TextFormat.chooseContentType(accept); + final String result = MetricUtils.output(name, contentType); + return ResponseEntity.ok() + .header(CONTENT_TYPE, contentType) + .body(result); + } +} diff --git a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/metrics/ValidOrganizationsMetric.java b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/metrics/ValidOrganizationsMetric.java index f36af5a7..561a75bb 100644 --- a/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/metrics/ValidOrganizationsMetric.java +++ b/apps/dnet-orgs-database-application/src/main/java/eu/dnetlib/organizations/metrics/ValidOrganizationsMetric.java @@ -15,6 +15,9 @@ public class ValidOrganizationsMetric extends MetricInfo { @Override public double obtainValue() { + + System.out.println("xxxxxxxxxxxxxx"); + return organizationRepository.countByStatus(OrganizationStatus.approved.toString()); } diff --git a/libs/dnet-apps-common/src/main/java/eu/dnetlib/common/metrics/MetricInfo.java b/libs/dnet-apps-common/src/main/java/eu/dnetlib/common/metrics/MetricInfo.java index a8f59312..c15e04d0 100644 --- a/libs/dnet-apps-common/src/main/java/eu/dnetlib/common/metrics/MetricInfo.java +++ b/libs/dnet-apps-common/src/main/java/eu/dnetlib/common/metrics/MetricInfo.java @@ -6,8 +6,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.BeanNameAware; -import io.micrometer.core.instrument.Metrics; - public abstract class MetricInfo implements BeanNameAware { private static final Log log = LogFactory.getLog(MetricInfo.class); @@ -28,7 +26,7 @@ public abstract class MetricInfo implements BeanNameAware { @PostConstruct public void register() { log.info("Prometheus - new metric registered: " + getBeanName()); - Metrics.gauge(getBeanName(), this, o -> obtainValue()); + MetricUtils.register(beanName, this); } } diff --git a/libs/dnet-apps-common/src/main/java/eu/dnetlib/common/metrics/MetricUtils.java b/libs/dnet-apps-common/src/main/java/eu/dnetlib/common/metrics/MetricUtils.java new file mode 100644 index 00000000..43c1d87f --- /dev/null +++ b/libs/dnet-apps-common/src/main/java/eu/dnetlib/common/metrics/MetricUtils.java @@ -0,0 +1,35 @@ +package eu.dnetlib.common.metrics; + +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.util.Set; + +import io.micrometer.core.instrument.composite.CompositeMeterRegistry; +import io.prometheus.client.CollectorRegistry; +import io.prometheus.client.Gauge; +import io.prometheus.client.exporter.common.TextFormat; + +public class MetricUtils { + + private static final CompositeMeterRegistry meterRegistry = new CompositeMeterRegistry(); + private static final CollectorRegistry collectorRegistry = new CollectorRegistry(true); + + public static MetricInfo register(final String name, final MetricInfo metric) { + final MetricInfo meter = meterRegistry.gauge(name, metric, MetricInfo::obtainValue); + Gauge.build(name, name).register(collectorRegistry); + return meter; + } + + public static String output(final Set metricsToInclude, final String contentType) { + try { + final Writer writer = new StringWriter(); + TextFormat.writeFormat(contentType, writer, collectorRegistry.filteredMetricFamilySamples(metricsToInclude)); + return writer.toString(); + } catch (final IOException e) { + // This actually never happens since StringWriter::write() doesn't throw any IOException + throw new RuntimeException("Writing metrics failed", e); + } + } + +}