adaptive-monitoring-framework

working version

2/6/2021 8:28:15 PM

Details

diff --git a/tigris/src/main/java/br/ufrgs/inf/prosoft/tigris/sampling/MonitoringCycle.java b/tigris/src/main/java/br/ufrgs/inf/prosoft/tigris/sampling/MonitoringCycle.java
index c49e89b..a7eb693 100644
--- a/tigris/src/main/java/br/ufrgs/inf/prosoft/tigris/sampling/MonitoringCycle.java
+++ b/tigris/src/main/java/br/ufrgs/inf/prosoft/tigris/sampling/MonitoringCycle.java
@@ -3,10 +3,10 @@ package br.ufrgs.inf.prosoft.tigris.sampling;
 public class MonitoringCycle {
     private double averageProcTimesSample;
     private double averageProcTimesPopulation;
-    private double sampleSize;
-    private double populationSize;
+    private long sampleSize;
+    private long populationSize;
 
-    public MonitoringCycle(double averageProcTimesSample, double averageProcTimesPopulation, double sampleSize, double populationSize) {
+    public MonitoringCycle(double averageProcTimesSample, double averageProcTimesPopulation, long sampleSize, long populationSize) {
         this.averageProcTimesSample = averageProcTimesSample;
         this.averageProcTimesPopulation = averageProcTimesPopulation;
         this.sampleSize = sampleSize;
@@ -22,4 +22,20 @@ public class MonitoringCycle {
                 ", populationSize=" + populationSize +
                 '}';
     }
+
+    public double getAverageProcTimesSample() {
+        return averageProcTimesSample;
+    }
+
+    public double getAverageProcTimesPopulation() {
+        return averageProcTimesPopulation;
+    }
+
+    public long getSampleSize() {
+        return sampleSize;
+    }
+
+    public long getPopulationSize() {
+        return populationSize;
+    }
 }
diff --git a/tigris/src/main/java/br/ufrgs/inf/prosoft/tigris/sampling/Sampling.java b/tigris/src/main/java/br/ufrgs/inf/prosoft/tigris/sampling/Sampling.java
index c2ec0a9..d8f4059 100644
--- a/tigris/src/main/java/br/ufrgs/inf/prosoft/tigris/sampling/Sampling.java
+++ b/tigris/src/main/java/br/ufrgs/inf/prosoft/tigris/sampling/Sampling.java
@@ -108,7 +108,7 @@ public class Sampling {
         synchronized (samplingRateLock) {
             if (this.sampledDataSet.isEmpty()) {
                 logger.info("No sampled data, doing nothing...");
-//                if no impact, increase by 1%
+//                if no monitoringImpact, increase by 1%
                 samplingRate += 0.01;
 
                 if (samplingRate > 1)
@@ -121,26 +121,23 @@ public class Sampling {
 
 //            Apdex apdex = this.performanceBaselineDataSet.getApdexResults(this.sampledDataSet, this.lastSampledTimes);
 //            double baselineImpact = performanceBaselineDataSet.getBaselineImpactedByWorkload();
-            Apdex apdex = this.performanceBaselineDataSet.getApdexResultsPerEvent(this.sampledDataSet);
-            double impact = (1 - ((apdex.getSatisfied() + 0.5 * apdex.getTolerated()) / apdex.getN()));
-
             if (!this.performanceBaselineDataSet.isAppStruggling()) {
-
-                logger.info("App is not struggling, increasing the current sampling rate {} by {}%", samplingRate, impact);
-                samplingRate += impact;
-
-//                //if we have just 1 tolerated, the impact will not be zero anymore
-//                if (impact <= 0.1) {
-//                    logger.info("No monitoring impact detected: {}, increasing the sampling rate...", impact);
-//                    //if no impact, increase by 10%
+                //TODO decreases based on how the average compares to the history?
+                logger.info("App is not struggling, increasing the current sampling rate {} by {}%", samplingRate, 0.25);
+                samplingRate = samplingRate + (samplingRate * 0.25);
+
+//                //if we have just 1 tolerated, the monitoringImpact will not be zero anymore
+//                if (monitoringImpact <= 0.1) {
+//                    logger.info("No monitoring monitoringImpact detected: {}, increasing the sampling rate...", monitoringImpact);
+//                    //if no monitoringImpact, increase by 10%
 //                    samplingRate += 0.1;
 //                } else
 //                    //otherwise stays the same - not necessary here
-//                    if (impact > 0.1 && impact <= 0.2) {
-//                        logger.info("Minimal monitoring impact detected: {}, keeping it the same...", impact);
-//                    } else if (impact > 0.2) {
-//                        double reduction = impact - 0.2;
-//                        logger.info("Monitoring impact detected: {}, decreasing the current sampling rate {} by {}%", impact, samplingRate, reduction);
+//                    if (monitoringImpact > 0.1 && monitoringImpact <= 0.2) {
+//                        logger.info("Minimal monitoring monitoringImpact detected: {}, keeping it the same...", monitoringImpact);
+//                    } else if (monitoringImpact > 0.2) {
+//                        double reduction = monitoringImpact - 0.2;
+//                        logger.info("Monitoring monitoringImpact detected: {}, decreasing the current sampling rate {} by {}%", monitoringImpact, samplingRate, reduction);
 ////                logger.info("{}, {}, {}", apdex.getSatisfied(), apdex.getTolerated(), apdex.getN());
 ////                logger.info("{}", this.performanceBaselineDataSet.getOverallAvg());
 ////                logger.info("{}", this.performanceBaselineDataSet.getOverallStd());
@@ -150,12 +147,14 @@ public class Sampling {
 //                        samplingRate = samplingRate - (samplingRate * (reduction / 1d));
 //                    }
             } else { //app is struggling
-                logger.info("App is struggling, decreasing the current sampling rate {} by {}%", samplingRate, impact);
-                samplingRate -= impact;
+                Apdex apdex = this.performanceBaselineDataSet.getApdexResultsPerEvent(this.sampledDataSet);
+                double monitoringImpact = (1 - ((apdex.getSatisfied() + 0.5 * apdex.getTolerated()) / apdex.getN()));
+                logger.info("App is struggling, decreasing the current sampling rate {} by {}%", samplingRate, monitoringImpact);
+                samplingRate = samplingRate - (samplingRate * monitoringImpact);
             }
 
-            if (samplingRate < 0)
-                samplingRate = 0;
+            if (samplingRate < 0.01)
+                samplingRate = 0.01;
 
             if (samplingRate > 1)
                 samplingRate = 1;
@@ -291,14 +290,14 @@ public class Sampling {
             return;
         }
 
-        double chance = new BinomialDistribution(1, 0.1d).sample();
-        if (chance == 1) {
+//        double chance = new BinomialDistribution(1, 0.1d).sample();
+//        if (chance == 1) {
             minimumSampleSize = getMinimumSampleSize(this.population.getTotalItems());
             if (minimumSampleSize > 0) {
                 logger.info("Enabling performance baseline that needs {} traces.", minimumSampleSize);
                 performanceBaselineEnabled = true;
             }
-        }
+//        }
     }
 
     public FrequencyDataSet getSample() {
diff --git a/tigris/src/main/java/br/ufrgs/inf/prosoft/tigris/sampling/SamplingAspect.java b/tigris/src/main/java/br/ufrgs/inf/prosoft/tigris/sampling/SamplingAspect.java
index 2eaeef6..309d9d4 100644
--- a/tigris/src/main/java/br/ufrgs/inf/prosoft/tigris/sampling/SamplingAspect.java
+++ b/tigris/src/main/java/br/ufrgs/inf/prosoft/tigris/sampling/SamplingAspect.java
@@ -27,7 +27,8 @@ public class SamplingAspect implements Runnable {
             //any execution except the own framework
             "(" +
                     "(execution(* org.dacapo.h2.TPCCSubmitter.runTransaction(..)) || " + //h2
-                    "execution(* org.dacapo.lusearch.Search.doPagingSearch(..))) " + //lusearch
+                    "execution(* org.dacapo.lusearch.QueryProcessor.doPagingSearch(..)) || " + //lusearch
+                    "execution(* org.dacapo.xalan.XalanWorker.transform(..))) " + //xalan
 //            "(execution(* *(..)) && !within(br.ufrgs.inf.prosoft..*) " +
                     //avoid calls from repository while serializing objects, it is necessary if a hash could not be used
                     //"&& !cflow(call(* br.ufrgs.inf.prosoft.tigris.monitoring.storage..*(..))) " +
@@ -40,7 +41,7 @@ public class SamplingAspect implements Runnable {
 
     //tigris config
     private final TigrisConfiguration tigrisConfiguration;
-    private final Sampling sampling;
+    private static Sampling sampling;
 
     public SamplingAspect() {
         Class<?> configClass = ConfigurationUtils.getAvailableConfigurationClass(TigrisConfiguration.class);
@@ -79,7 +80,7 @@ public class SamplingAspect implements Runnable {
 
         if (samplingEnabled) {
             String signature = joinPoint.getSignature().toString() +
-                    joinPoint.getArgs()[0].toString(); //TODO this is to distinguish traces, need to change for other than h2
+                    joinPoint.getArgs()[0].toString(); //TODO this is to distinguish traces, need to change for other than h2 or lusearch
             Granularity granularity = new Granularity(GranularityType.METHOD, signature);
             if (sampling.isPerformanceBaselineEnabled()) {
                 sampling.addPerformanceBaselineItem(granularity, endTime - startTime);
@@ -95,24 +96,31 @@ public class SamplingAspect implements Runnable {
         return result;
     }
 
-    static List<Double> samplingRates = new ArrayList<>();
-    static List<MonitoringCycle> cycles = new ArrayList<>();
+    static double currentSamplingRate;
+    static MonitoringCycle cycle = new MonitoringCycle(0,0,0,0);
 
     @Override
     public void run() {
         if (SamplingAspect.enabled && sampling.isAdaptiveSamplingRate()) {
             sampling.managePerformanceBaseline();
-            samplingRates.add(sampling.getSamplingRate());
+            currentSamplingRate = sampling.getSamplingRate();
 
             if (!sampling.isPerformanceBaselineEnabled() && sampling.isReady()) {
                 logger.info("Sample is ready, releasing for analysis and resetting...");
-                cycles.add(sampling.endMonitoringCycle());
+                cycle = sampling.endMonitoringCycle();
             }
         }
     }
 
-    public static void printResults(){
-        logger.info("Sampling Rates: {}", samplingRates);
-        logger.info("Finished cycles {}: {}", cycles.size(), cycles);
+    public static double getCurrentSamplingRate() {
+        return currentSamplingRate;
+    }
+
+    public static MonitoringCycle getCycle() {
+        return cycle;
+    }
+
+    public static MonitoringCycle endMonitoringCycle() {
+        return sampling.endMonitoringCycle();
     }
 }
\ No newline at end of file