adaptive-caching-framework

organizing structure for Tigris

2/24/2020 7:14:08 PM

Changes

framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/aspects/support/Tracer.java 45(+0 -45)

framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/sampling/metrics/LightweightMetricAspect.java 143(+0 -143)

Details

diff --git a/evaluation/applications/AP/CloudStore/pom.xml b/evaluation/applications/AP/CloudStore/pom.xml
index daff975..40730f8 100644
--- a/evaluation/applications/AP/CloudStore/pom.xml
+++ b/evaluation/applications/AP/CloudStore/pom.xml
@@ -185,7 +185,7 @@
         <dependency>
             <groupId>br.ufrgs.inf.prosoft.adaptivecaching</groupId>
             <artifactId>autonomicmanager</artifactId>
-            <version>0.6.0-SNAPSHOT</version>
+            <version>0.7.0-SNAPSHOT</version>
         </dependency>
     </dependencies>
     <build>
diff --git a/evaluation/applications/AP/CloudStore/src/main/java/eu/cloudscale/showcase/Configuration.java b/evaluation/applications/AP/CloudStore/src/main/java/eu/cloudscale/showcase/Configuration.java
index cf4155e..d5f5355 100644
--- a/evaluation/applications/AP/CloudStore/src/main/java/eu/cloudscale/showcase/Configuration.java
+++ b/evaluation/applications/AP/CloudStore/src/main/java/eu/cloudscale/showcase/Configuration.java
@@ -5,10 +5,15 @@ import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.ComponentSc
 import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.types.CacheProviderType;
 import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.types.Modelling;
 import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.types.RepositoryType;
+import br.ufrgs.inf.prosoft.tigrisframework.annotations.TigrisConfiguration;
 
 @AdaptiveCaching(cacheProvider = CacheProviderType.EHCACHE, logRepository = RepositoryType.MEMORY,
         modelling = Modelling.FULLEXPLORATION, analyzerEnabled = true, enabled = true, disableMonitoringAfterAnalysis = false,
         clearMonitoringDataOnStart = true, traceAsync = false, tracerEnabled = true, analyzeOnce = true, expiryInterval = 86400)
 @ComponentScan(allowed = "eu.cloudscale.showcase", denied = {"eu.cloudscale.showcase.db.model", "eu.cloudscale.showcase.servlets", "eu.cloudscale.showcase.db.dao.hibernate"})
+@TigrisConfiguration(
+        samplingEnabled = true,
+        samplingPercentage = 5,
+        staticMetricFile = "/home/jhonnymertz/workspace/adaptive-caching-framework/understand/cloudstore.csv")
 public class Configuration {
 }
diff --git a/evaluation/applications/AP/shopizer/sm-shop/pom.xml b/evaluation/applications/AP/shopizer/sm-shop/pom.xml
index fd88587..dd50189 100755
--- a/evaluation/applications/AP/shopizer/sm-shop/pom.xml
+++ b/evaluation/applications/AP/shopizer/sm-shop/pom.xml
@@ -361,7 +361,7 @@
         <dependency>
             <groupId>br.ufrgs.inf.prosoft.adaptivecaching</groupId>
             <artifactId>autonomicmanager</artifactId>
-            <version>0.6.0-SNAPSHOT</version>
+            <version>0.7.0-SNAPSHOT</version>
         </dependency>
 
         <dependency>
diff --git a/evaluation/applications/AP/shopizer/sm-shop/src/main/java/com/salesmanager/web/Configuration.java b/evaluation/applications/AP/shopizer/sm-shop/src/main/java/com/salesmanager/web/Configuration.java
index 532b6aa..de4a333 100644
--- a/evaluation/applications/AP/shopizer/sm-shop/src/main/java/com/salesmanager/web/Configuration.java
+++ b/evaluation/applications/AP/shopizer/sm-shop/src/main/java/com/salesmanager/web/Configuration.java
@@ -5,6 +5,7 @@ import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.ComponentSc
 import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.types.CacheProviderType;
 import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.types.Modelling;
 import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.types.RepositoryType;
+import br.ufrgs.inf.prosoft.tigrisframework.annotations.TigrisConfiguration;
 
 @AdaptiveCaching(cacheProvider = CacheProviderType.EHCACHE, logRepository = RepositoryType.MEMORY,
         modelling = Modelling.FULLEXPLORATION, analyzerEnabled = true, enabled = true, disableMonitoringAfterAnalysis = true, traceAsync = false, tracerEnabled = true, analyzeOnce = true)
@@ -12,5 +13,9 @@ import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.types.Repos
         "com.salesmanager.web.utils.BreadcrumbsUtils.buildProductBreadcrumb",
         "com.salesmanager.web.utils.BreadcrumbsUtils.buildCategoryBreadcrumb",
         "com.salesmanager.web.filter.AdminFilter"})
+@TigrisConfiguration(
+        samplingEnabled = true,
+        samplingPercentage = 100,
+        staticMetricFile = "/home/jhonnymertz/workspace/adaptive-caching-framework/understand/shopizer.csv")
 public class Configuration {
 }
diff --git a/evaluation/applications/AP/spring-petclinic/pom.xml b/evaluation/applications/AP/spring-petclinic/pom.xml
index 7974415..519ece2 100644
--- a/evaluation/applications/AP/spring-petclinic/pom.xml
+++ b/evaluation/applications/AP/spring-petclinic/pom.xml
@@ -229,7 +229,7 @@
         <dependency>
             <groupId>br.ufrgs.inf.prosoft.adaptivecaching</groupId>
             <artifactId>autonomicmanager</artifactId>
-            <version>0.6.0-SNAPSHOT</version>
+            <version>0.7.0-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>org.mongodb</groupId>
diff --git a/evaluation/applications/AP/spring-petclinic/src/main/java/org/springframework/samples/petclinic/Configuration.java b/evaluation/applications/AP/spring-petclinic/src/main/java/org/springframework/samples/petclinic/Configuration.java
index cd3eda3..bfb6eb0 100644
--- a/evaluation/applications/AP/spring-petclinic/src/main/java/org/springframework/samples/petclinic/Configuration.java
+++ b/evaluation/applications/AP/spring-petclinic/src/main/java/org/springframework/samples/petclinic/Configuration.java
@@ -5,13 +5,17 @@ import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.ComponentSc
 import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.types.CacheProviderType;
 import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.types.Modelling;
 import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.types.RepositoryType;
-import br.ufrgs.inf.prosoft.adaptivecaching.sampling.annotations.Criteria;
+import br.ufrgs.inf.prosoft.tigrisframework.annotations.Criteria;
+import br.ufrgs.inf.prosoft.tigrisframework.annotations.TigrisConfiguration;
 
 @AdaptiveCaching(cacheProvider = CacheProviderType.EHCACHE, logRepository = RepositoryType.MEMORY,
     modelling = Modelling.FULLEXPLORATION, analyzerEnabled = true, enabled = true, disableMonitoringAfterAnalysis = false,
     clearMonitoringDataOnStart = true, traceAsync = false, tracerEnabled = true, analyzeOnce = true, expiryInterval = 60)
-
-@Criteria("more frequent I more expensive")
+@TigrisConfiguration(
+    samplingEnabled = true,
+    samplingPercentage = 5,
+    staticMetricFile = "/home/jhonnymertz/workspace/adaptive-caching-framework/understand/petclinic.csv")
+@Criteria("more frequent OR more expensive")
 //Jhonny: workaround below. a better solution involve filter by serialization methods in aspect to avoid it
 @ComponentScan(allowed = "org.springframework.samples.petclinic", denied = "org.springframework.samples.petclinic.model")
 public class Configuration {
diff --git a/framework/autonomicmanager/pom.xml b/framework/autonomicmanager/pom.xml
index 1af3d54..bbdf139 100644
--- a/framework/autonomicmanager/pom.xml
+++ b/framework/autonomicmanager/pom.xml
@@ -6,7 +6,7 @@
 
     <groupId>br.ufrgs.inf.prosoft.adaptivecaching</groupId>
     <artifactId>autonomicmanager</artifactId>
-    <version>0.6.0-SNAPSHOT</version>
+    <version>0.7.0-SNAPSHOT</version>
 
     <properties>
         <aspectj.version>1.8.10</aspectj.version>
diff --git a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/aspects/TracerAspect.java b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/aspects/TracerAspect.java
index 5c12a4c..9a9ae42 100644
--- a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/aspects/TracerAspect.java
+++ b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/adaptivecaching/monitoring/application/aspects/TracerAspect.java
@@ -4,7 +4,6 @@ import br.ufrgs.inf.prosoft.adaptivecaching.analysis.Analyzer;
 import br.ufrgs.inf.prosoft.adaptivecaching.analysis.decision.flowchart.model.MethodEntry;
 import br.ufrgs.inf.prosoft.adaptivecaching.cachemanager.cacher.AdaptiveMethodCacher;
 import br.ufrgs.inf.prosoft.adaptivecaching.cachemanager.cacher.key.Key;
-import br.ufrgs.inf.prosoft.adaptivecaching.cachemanager.model.ValueWrapper;
 import br.ufrgs.inf.prosoft.adaptivecaching.cachemanager.util.threads.NamedThreads;
 import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.AdaptiveCaching;
 import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.ComponentScan;
@@ -20,11 +19,9 @@ import br.ufrgs.inf.prosoft.adaptivecaching.monitoring.cache.CacheMonitor;
 import br.ufrgs.inf.prosoft.adaptivecaching.monitoring.cache.CacheMonitorFactory;
 import br.ufrgs.inf.prosoft.adaptivecaching.monitoring.storage.Repository;
 import br.ufrgs.inf.prosoft.adaptivecaching.monitoring.storage.RepositoryFactory;
-import br.ufrgs.inf.prosoft.adaptivecaching.sampling.metrics.LightweightAnalyzer;
-import br.ufrgs.inf.prosoft.adaptivecaching.sampling.metrics.LightweightMetricAspect;
-import br.ufrgs.inf.prosoft.adaptivecaching.sampling.metrics.LightweightMetrics;
-import br.ufrgs.inf.prosoft.adaptivecaching.sampling.metrics.StaticMetrics;
-import org.apache.commons.math3.stat.descriptive.SummaryStatistics;
+import br.ufrgs.inf.prosoft.tigrisframework.metrics.LightweightAnalyzer;
+import br.ufrgs.inf.prosoft.tigrisframework.metrics.LightweightMetrics;
+import br.ufrgs.inf.prosoft.tigrisframework.annotations.TigrisConfiguration;
 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.annotation.Around;
 import org.aspectj.lang.annotation.Aspect;
@@ -40,11 +37,7 @@ import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
 import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentSkipListSet;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
+import java.util.concurrent.*;
 
 import static java.lang.System.currentTimeMillis;
 
@@ -67,21 +60,10 @@ public class TracerAspect {
      */
     public static boolean enabled = true;
     public static boolean tracerEnabled = true;
-    public static boolean samplingEnabled = true;
-    public static int samplingPercentage = 50;
     public static boolean analyzerEnabled = true;
     public static boolean lightweightTracerEnabled = true;
     public static boolean lightweightAnayzerEnabled = true;
 
-//    public static String staticFile = "/home/jhonnymertz/workspace/adaptive-caching-framework/understand/petclinic.csv";
-//    public static String staticFile = "/home/jhonnymertz/workspace/adaptive-caching-framework/understand/cloudstore.csv";
-    public static String staticFile = "/home/jhonnymertz/workspace/adaptive-caching-framework/understand/shopizer.csv";
-
-
-//    public static SummaryStatistics timeToLightweightTrace = new SummaryStatistics();
-//    public static SummaryStatistics timeToStatefulTrace = new SummaryStatistics();
-//    public static SummaryStatistics timeToCheckAllowedTrace = new SummaryStatistics();
-
     public static Map<String, Boolean> traceMethods = null;
 
     private final ScheduledExecutorService analyzerExecutor = Executors.newSingleThreadScheduledExecutor(new NamedThreads(
@@ -109,6 +91,10 @@ public class TracerAspect {
     private Repository repository;
     private Repository repositoryMongo;
 
+    //tigris config
+    private TigrisConfiguration tigrisConfiguration;
+    public static String staticFile;
+
     public static Map<String, LightweightMetrics> metrics;
 
     @Pointcut(
@@ -144,14 +130,28 @@ public class TracerAspect {
                 return;
             }
 
+            tigrisConfiguration = configClass.getAnnotation(TigrisConfiguration.class);
+            logger.info("TigrisConfiguration found, loading options...");
+
+            if (!tigrisConfiguration.enabled()) {
+                turnoff();
+                logger.info("Tigris disabled manually on @TigrisConfiguration.");
+                return;
+            }
+
+            staticFile = tigrisConfiguration.staticMetricFile();
+
+            //TODO getting criteria DSL
+//        Criteria criteria = configClass.getAnnotation(Criteria.class);
+//        criteriaDSL = criteria.value();
+
+
             //getting allowed packages from @ComponentScan
             ComponentScan componentScanConfig = configClass.getAnnotation(ComponentScan.class);
             if (componentScanConfig == null) {
                 //if not specified, it assumes the same package where @AdaptiveCaching were declared
                 allowed = new String[]{configClass.getPackage().getName()};
-                //logger.error("ComponenScan for AdaptiveCaching not found, adaptive caching disabled.");
-                //enabled = false;
-                //return;
+                logger.info("ComponenScan for AdaptiveCaching not found, assuming the same package where @AdaptiveCaching were declared.");
             }
             allowed = componentScanConfig.allowed();
             notAllowed = componentScanConfig.denied();
@@ -243,18 +243,12 @@ public class TracerAspect {
         //DEBUG: see if a method is being caught
         //DEBUG: traceSpecificMethod(joinPoint);
 
-//        long timeToCheckAllowed = currentTimeMillis();
-
-        if (!isAllowed(joinPoint))
+        if (!enabled || !isAllowed(joinPoint))
             return joinPoint.proceed();
 
         boolean detailedTrace = (!lightweightTracerEnabled ||
                 (lightweightTracerEnabled && LightweightAnalyzer.allowedFineGrained
                         .contains(joinPoint.getSignature().toLongString())));
-//        boolean detailedTrace = (LightweightAnalyzer.allowedFineGrained
-//                        .contains(joinPoint.getSignature().toLongString()));
-
-//        timeToCheckAllowedTrace.addValue(currentTimeMillis() - timeToCheckAllowed);
 
         boolean cacheable = false;
         Key key = null;
@@ -281,24 +275,9 @@ public class TracerAspect {
         return result;
     }
 
-//    private int samplingIndex = 0;
-//    private boolean shouldBeSampled() {
-//        if(!samplingEnabled)
-//            return true;
-//
-////        if((rand.nextInt(10) + 1) > samplingChance)
-////            return true;
-////        synchronized (this){
-//            samplingIndex++;
-//            if ((samplingIndex % samplingEach) == 0)
-//                return true;
-//            else return false;
-////        }
-//    }
-
     private Random rand = new Random();
     private boolean shouldBeSampled() {
-        return !samplingEnabled || ((rand.nextInt(100) + 1) > (100 - samplingPercentage));
+        return !tigrisConfiguration.samplingEnabled() || ((rand.nextInt(100) + 1) > (100 - tigrisConfiguration.samplingPercentage()));
     }
 
     private boolean isAllowed(ProceedingJoinPoint joinPoint) throws Throwable {
@@ -349,7 +328,6 @@ public class TracerAspect {
         String user = userGetter.getCurrentUser();
 
         if(lightweightTracerEnabled) {
-//            long timeToLightTrace = currentTimeMillis();
             LightweightMetrics metric = metrics.get(signature);
             if (metric != null)
                 metric.incOccurrence();
@@ -364,16 +342,14 @@ public class TracerAspect {
             metric.addTime(startTime, endTime - startTime);
             metric.addReturnSize(result);
             metric.addUser(user);
-//            timeToLightweightTrace.addValue(currentTimeMillis() - timeToLightTrace);
         }
 
         //trace only allowed by lightweight metrics
         if(tracerEnabled
             && detailedTrace
             && shouldBeSampled()) {
-//            System.out.println("New trace: " + signature + LightweightAnalyzer.allowedFineGrained
-//                    .contains(joinPoint.getSignature().toLongString()));
-//            long timeToTrace = currentTimeMillis();
+            logger.debug("New trace: " + signature + LightweightAnalyzer.allowedFineGrained
+                    .contains(joinPoint.getSignature().toLongString()));
 
             //we do not cache null returns, but we trace them
             //maybe the method can sometimes return null... so there is not verification here
@@ -398,7 +374,6 @@ public class TracerAspect {
                 logger.debug("Adding " + logTrace.getMethodInfo().getSignature() + " to blacklist");
                 TracerAspect.methodBlackList.add(logTrace.getMethodInfo().getSignature());
             }
-//            timeToStatefulTrace.addValue(currentTimeMillis() - timeToTrace);
         }
 
         return result;
@@ -429,8 +404,6 @@ public class TracerAspect {
 
     private Properties getPropertiesFile() throws IOException {
         Properties properties = new Properties();
-        //file location:
-        //System.out.println(getClass().getClassLoader().getResource("adaptivecaching.properties").getPath());
         properties.load(getClass().getClassLoader().getResourceAsStream("adaptivecaching.properties"));
         return properties;
     }
diff --git a/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/tigrisframework/annotations/TigrisConfiguration.java b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/tigrisframework/annotations/TigrisConfiguration.java
new file mode 100644
index 0000000..d77bd88
--- /dev/null
+++ b/framework/autonomicmanager/src/main/java/br/ufrgs/inf/prosoft/tigrisframework/annotations/TigrisConfiguration.java
@@ -0,0 +1,24 @@
+package br.ufrgs.inf.prosoft.tigrisframework.annotations;
+
+import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.types.CacheProviderType;
+import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.types.Modelling;
+import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.types.RepositoryType;
+import br.ufrgs.inf.prosoft.adaptivecaching.configuration.annotation.types.TriggerType;
+
+import java.lang.annotation.*;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+@Documented
+public @interface TigrisConfiguration {
+
+    //enabling configurations
+    boolean enabled() default true;
+    boolean coarseMonitoringEnabled() default true;
+    boolean fineMonitoringEnabled() default true;
+    boolean samplingEnabled() default true;
+    int samplingPercentage() default 50;
+
+    String staticMetricFile();
+
+}
diff --git a/framework/autonomicmanager/src/test/java/br/ufrgs/inf/prosoft/sampling/StaticMetricsTest.java b/framework/autonomicmanager/src/test/java/br/ufrgs/inf/prosoft/sampling/StaticMetricsTest.java
index 70a4e26..0f7e98f 100644
--- a/framework/autonomicmanager/src/test/java/br/ufrgs/inf/prosoft/sampling/StaticMetricsTest.java
+++ b/framework/autonomicmanager/src/test/java/br/ufrgs/inf/prosoft/sampling/StaticMetricsTest.java
@@ -1,6 +1,6 @@
 package br.ufrgs.inf.prosoft.sampling;
 
-import br.ufrgs.inf.prosoft.adaptivecaching.sampling.metrics.StaticMetrics;
+import br.ufrgs.inf.prosoft.tigrisframework.metrics.StaticMetrics;
 import org.junit.Test;
 
 import java.io.IOException;
diff --git a/framework/autonomicmanager/src/test/java/br/ufrgs/inf/prosoft/sampling/Statistics.java b/framework/autonomicmanager/src/test/java/br/ufrgs/inf/prosoft/sampling/Statistics.java
index b2d4956..0d7db9b 100644
--- a/framework/autonomicmanager/src/test/java/br/ufrgs/inf/prosoft/sampling/Statistics.java
+++ b/framework/autonomicmanager/src/test/java/br/ufrgs/inf/prosoft/sampling/Statistics.java
@@ -1,6 +1,6 @@
 package br.ufrgs.inf.prosoft.sampling;
 
-import br.ufrgs.inf.prosoft.adaptivecaching.sampling.statistics.StatisticalTest;
+import br.ufrgs.inf.prosoft.tigrisframework.statistics.StatisticalTest;
 import org.apache.commons.math3.random.EmpiricalDistribution;
 import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
 import org.junit.Assert;