package eu.dnetlib.scholix.api; import eu.dnetlib.common.app.AbstractDnetApp; import io.micrometer.core.aop.TimedAspect; import io.micrometer.core.instrument.DistributionSummary; import io.micrometer.core.instrument.Meter; import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.Timer; import io.micrometer.core.instrument.config.MeterFilter; import io.micrometer.core.instrument.distribution.DistributionStatisticConfig; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.scheduling.annotation.EnableScheduling; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; import java.time.Duration; @SpringBootApplication @EnableSwagger2 @EnableCaching @EnableScheduling @ComponentScan(basePackages = "eu.dnetlib") public class MainApplication extends AbstractDnetApp { @Value("${dhp.swagger.api.host}") private String swaggetHost; @Value("${dhp.swagger.api.basePath}") private String swaggerPath; final String descriptionAPI = "

\"ScholeXplorer\"

" + "The Scholix Swagger API allows clients to run REST queries over the Scholexplorer index in order to fetch links matching given criteria. In the current version, clients can search for:" + ""; public static void main(final String[] args) { SpringApplication.run(MainApplication.class, args); } @Bean public TimedAspect timedAspect(MeterRegistry meterRegistry) { double scale = 1000000; MeterFilter mf = new MeterFilter() { @Override public DistributionStatisticConfig configure(Meter.Id id, DistributionStatisticConfig config) { if (id.getName().startsWith("scholix")) { return DistributionStatisticConfig.builder() .percentiles(0.20, 0.50, 0.75,0.95) .percentilesHistogram(false) .serviceLevelObjectives(5.0*scale, 10.0*scale, 250*scale, 500*scale, 750*scale ,1000.0*scale,2500.0*scale,5000.0*scale,7500.0*scale,10000.0*scale ) // .minimumExpectedValue(0.008) //// .maximumExpectedValue(1000000.0) .build() .merge(config); } return config; } }; meterRegistry.config().meterFilter(mf); return new TimedAspect(meterRegistry); } @Override protected void configSwagger(final Docket docket) { docket .host(swaggetHost) .pathMapping(swaggerPath) .groupName("Scholexplorer V1") .select() .apis(RequestHandlerSelectors.any()) .paths(p -> p.startsWith("/v1")) .build() .apiInfo(new ApiInfoBuilder() .title("Scholexplorer API V1.0") .description(descriptionAPI) .version("1.0") .contact(ApiInfo.DEFAULT_CONTACT) .license("Apache 2.0") .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0") .build()); } @Bean (name = "SpringDOcketv2") public Docket v2Docket() { final Docket docket = new Docket(DocumentationType.SWAGGER_2); docket .host(swaggetHost) .pathMapping(swaggerPath) .groupName("Scholexplorer V2") .select() .apis(RequestHandlerSelectors.any()) .paths(p -> p.startsWith("/v2")) .build() .apiInfo(new ApiInfoBuilder() .title("Scholexplorer API V2.0") .description(descriptionAPI) .version("2.0") .contact(ApiInfo.DEFAULT_CONTACT) .license("Apache 2.0") .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0") .build()); return docket; } }