2022-02-02 14:23:28 +01:00
package eu.dnetlib.scholix.api ;
import eu.dnetlib.common.app.AbstractDnetApp ;
2022-02-04 15:52:49 +01:00
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 ;
2022-02-02 14:23:28 +01:00
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 ;
2022-02-04 15:52:49 +01:00
import org.springframework.context.annotation.ComponentScan ;
2022-02-02 14:23:28 +01:00
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 ;
2022-02-04 15:52:49 +01:00
import java.time.Duration ;
2022-02-02 14:23:28 +01:00
@SpringBootApplication
@EnableSwagger2
@EnableCaching
@EnableScheduling
2022-02-04 15:52:49 +01:00
@ComponentScan ( basePackages = " eu.dnetlib " )
2022-02-02 14:23:28 +01:00
public class MainApplication extends AbstractDnetApp {
@Value ( " ${dhp.swagger.api.host} " )
private String swaggetHost ;
@Value ( " ${dhp.swagger.api.basePath} " )
private String swaggerPath ;
final String descriptionAPI = " <p style= \" text-align:center; \" ><img src= \" /logo.png \" alt= \" ScholeXplorer \" > </p> " +
" 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: " +
" <ul><li>Links whose source object has a given PID or PID type</li> " +
" <li>Links whose source object has been published by a given data source ( \" data source as publisher \" )</li> " +
" <li>Links that were collected from a given data source ( \" data source as provider \" ).</li></ul> " ;
public static void main ( final String [ ] args ) {
SpringApplication . run ( MainApplication . class , args ) ;
}
2022-02-04 15:52:49 +01:00
@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 ) ;
}
2022-02-02 14:23:28 +01:00
@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 ;
}
}