2021-04-09 18:05:04 +02:00
package eu.eudat.logic.managers ;
import io.prometheus.client.Gauge ;
2021-04-12 11:00:07 +02:00
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
2021-04-09 18:05:04 +02:00
import org.springframework.beans.factory.annotation.Autowired ;
2021-04-12 11:00:07 +02:00
import org.springframework.core.env.Environment ;
import org.springframework.scheduling.annotation.Scheduled ;
2021-04-09 18:05:04 +02:00
import org.springframework.stereotype.Component ;
import javax.annotation.PostConstruct ;
import javax.transaction.Transactional ;
2021-04-12 11:00:07 +02:00
import java.io.IOException ;
import java.nio.file.Files ;
import java.nio.file.Paths ;
2021-04-09 18:05:04 +02:00
import java.util.Map ;
import java.util.stream.Collectors ;
import java.util.stream.Stream ;
@Component
public class MetricsManager {
2021-04-12 11:00:07 +02:00
private final static Logger logger = LoggerFactory . getLogger ( MetricsManager . class ) ;
2021-04-09 18:05:04 +02:00
private static Map < String , Gauge > gauges = Stream . of ( new Object [ ] [ ] {
2021-04-15 17:30:16 +02:00
{ " argos_managed_dmps " , Gauge . build ( ) . name ( " argos_managed_dmps " ) . help ( " Number of managed DMPs " ) . labelNames ( " status " ) . register ( ) } ,
{ " argos_funders " , Gauge . build ( ) . name ( " argos_funders " ) . help ( " Number of registered Funders " ) . register ( ) } ,
{ " argos_grants " , Gauge . build ( ) . name ( " argos_grants " ) . help ( " Number of registered Grants " ) . register ( ) } ,
{ " argos_projects " , Gauge . build ( ) . name ( " argos_projects " ) . help ( " Number of registered Projects " ) . register ( ) } ,
{ " argos_researchers " , Gauge . build ( ) . name ( " argos_researchers " ) . help ( " Number of Colaborators/Researchers " ) . register ( ) } ,
{ " argos_managed_dataset_descriptions " , Gauge . build ( ) . name ( " argos_managed_dataset_descriptions " ) . help ( " Number of managed Dataset Descriptions " ) . labelNames ( " status " ) . register ( ) } ,
{ " argos_dataset_templates " , Gauge . build ( ) . name ( " argos_dataset_templates " ) . help ( " Number of dataset Templates " ) . labelNames ( " status " ) . register ( ) } ,
{ " argos_users " , Gauge . build ( ) . name ( " argos_users " ) . help ( " Number of users " ) . labelNames ( " type " ) . register ( ) } ,
{ " argos_languages " , Gauge . build ( ) . name ( " argos_languages " ) . help ( " Number of Languages " ) . register ( ) } ,
2021-04-09 18:05:04 +02:00
} ) . collect ( Collectors . toMap ( data - > ( String ) data [ 0 ] , data - > ( Gauge ) data [ 1 ] ) ) ;
2021-04-15 17:30:16 +02:00
public static void increaseValue ( String name , int amount , String label ) {
if ( label ! = null ) {
gauges . get ( name ) . labels ( label ) . inc ( amount ) ;
} else {
gauges . get ( name ) . inc ( amount ) ;
}
2021-04-09 18:05:04 +02:00
}
2021-04-15 17:30:16 +02:00
public static void decreaseValue ( String name , int amount , String label ) {
if ( label ! = null ) {
gauges . get ( name ) . labels ( label ) . dec ( amount ) ;
} else {
gauges . get ( name ) . dec ( amount ) ;
}
2021-04-09 18:05:04 +02:00
}
2021-04-15 17:30:16 +02:00
public static Integer getValue ( String name , String label ) {
if ( label ! = null ) {
return Double . valueOf ( gauges . get ( name ) . labels ( label ) . get ( ) ) . intValue ( ) ;
} else {
return Double . valueOf ( gauges . get ( name ) . get ( ) ) . intValue ( ) ;
}
2021-04-09 18:05:04 +02:00
}
2021-04-15 17:30:16 +02:00
public static void calculateValue ( String name , int amount , String label ) {
Integer orig = getValue ( name , label ) ;
2021-04-09 18:05:04 +02:00
int diff = orig - amount ;
if ( diff ! = 0 ) {
if ( diff > 0 ) {
2021-04-15 17:30:16 +02:00
decreaseValue ( name , diff , label ) ;
2021-04-09 18:05:04 +02:00
} else {
2021-04-15 17:30:16 +02:00
increaseValue ( name , Math . abs ( diff ) , label ) ;
2021-04-09 18:05:04 +02:00
}
}
}
private final DatasetManager datasetManager ;
private final DataManagementPlanManager dataManagementPlanManager ;
private final DatasetProfileManager datasetProfileManager ;
2021-04-12 11:00:07 +02:00
private final UserManager userManager ;
private final Environment environment ;
2021-04-09 18:05:04 +02:00
@Autowired
2021-04-12 11:00:07 +02:00
public MetricsManager ( DatasetManager datasetManager , DataManagementPlanManager dataManagementPlanManager , DatasetProfileManager datasetProfileManager , UserManager userManager , Environment environment ) {
2021-04-09 18:05:04 +02:00
this . datasetManager = datasetManager ;
this . dataManagementPlanManager = dataManagementPlanManager ;
this . datasetProfileManager = datasetProfileManager ;
2021-04-12 11:00:07 +02:00
this . userManager = userManager ;
this . environment = environment ;
2021-04-09 18:05:04 +02:00
}
@PostConstruct
@Transactional
2021-04-12 11:00:07 +02:00
@Scheduled ( initialDelay = 1000 * 60 * 60 , fixedDelay = 1000 * 60 * 60 )
public void init ( ) throws IOException {
logger . info ( " Start calculating Metrics " ) ;
2021-04-15 17:30:16 +02:00
calculateValue ( " argos_managed_dmps " , ( int ) dataManagementPlanManager . countAllDrafts ( ) , " draft " ) ;
calculateValue ( " argos_managed_dmps " , ( int ) dataManagementPlanManager . countAllFinalized ( ) , " finalized " ) ;
calculateValue ( " argos_managed_dmps " , ( int ) dataManagementPlanManager . countAllPublished ( ) , " published " ) ;
calculateValue ( " argos_managed_dmps " , ( int ) dataManagementPlanManager . countAllDoied ( ) , " doied " ) ;
calculateValue ( " argos_funders " , ( int ) dataManagementPlanManager . countAllFunders ( ) , null ) ;
calculateValue ( " argos_grants " , ( int ) dataManagementPlanManager . countAllGrants ( ) , null ) ;
calculateValue ( " argos_projects " , ( int ) dataManagementPlanManager . countAllProjects ( ) , null ) ;
calculateValue ( " argos_researchers " , ( int ) dataManagementPlanManager . countAllResearchers ( ) , null ) ;
calculateValue ( " argos_managed_dataset_descriptions " , ( int ) datasetManager . countAllDraft ( ) , " draft " ) ;
calculateValue ( " argos_managed_dataset_descriptions " , ( int ) datasetManager . countAllFinalized ( ) , " finalized " ) ;
calculateValue ( " argos_managed_dataset_descriptions " , ( int ) datasetManager . countAllPublic ( ) , " published " ) ;
calculateValue ( " argos_managed_dataset_descriptions " , ( int ) datasetManager . countAllWithDoi ( ) , " doied " ) ;
2021-06-15 14:43:45 +02:00
calculateValue ( " argos_dataset_templates " , ( int ) datasetProfileManager . countAlldraft ( ) , " draft " ) ;
2021-04-15 17:30:16 +02:00
calculateValue ( " argos_dataset_templates " , ( int ) datasetProfileManager . countAllFinalized ( ) , " active " ) ;
calculateValue ( " argos_dataset_templates " , ( int ) datasetProfileManager . countAllUsed ( ) , " used " ) ;
calculateValue ( " argos_users " , ( int ) userManager . countActiveUsers ( ) . intValue ( ) , " loggedin " ) ;
calculateValue ( " argos_users " , ( int ) userManager . countAllUsers ( ) . intValue ( ) , " total " ) ;
2021-04-12 11:00:07 +02:00
long files = Files . list ( Paths . get ( this . environment . getProperty ( " userguide.path " ) ) ) . count ( ) ;
2021-04-15 17:30:16 +02:00
calculateValue ( " argos_languages " , ( int ) files , null ) ;
2021-04-12 11:00:07 +02:00
logger . info ( " Metrics calculation Completed " ) ;
2021-04-09 18:05:04 +02:00
}
}