adaptive-monitoring-framework

adding more metrics

8/17/2021 2:47:10 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 d7afe7f..d6de8df 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,20 +3,24 @@ package br.ufrgs.inf.prosoft.tigris.sampling;
 public class MonitoringCycle {
     private double averageProcTimesSample;
     private double stdProcTimesSample;
+    private final FrequencyDataSet sample;
     private double averageProcTimesPopulation;
     private double stdProcTimesPopulation;
     private long sampleSize;
     private long populationSize;
+    private final FrequencyDataSet population;
     private long monitoringCycleTime;
 
     public MonitoringCycle(FrequencyDataSet sample, FrequencyDataSet population, long monitoringCycleTime) {
         this.averageProcTimesSample = sample.getMeanExecutionTime();
         this.stdProcTimesSample = sample.getStdExecutionTime();
         this.sampleSize = sample.getTotalItems();
+        this.sample = sample;
 
         this.averageProcTimesPopulation = population.getMeanExecutionTime();
         this.stdProcTimesPopulation = population.getStdExecutionTime();
         this.populationSize = population.getTotalItems();
+        this.population = population;
         this.monitoringCycleTime = monitoringCycleTime;
     }
 
@@ -28,6 +32,8 @@ public class MonitoringCycle {
         this.stdProcTimesPopulation = 0;
         this.populationSize = 0;
         this.monitoringCycleTime = 0;
+        this.sample = new FrequencyDataSet();
+        this.population = new FrequencyDataSet();
     }
 
     public long getMonitoringCycleTime() {
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 846e92a..55ea996 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
@@ -227,14 +227,17 @@ public class Sampling {
 
     //sample proportion is the same as population
     private boolean isSameProportion(double decayingConfidenceFactor) {
+        if (decayingConfidenceFactor == 0.0) //maximum cycle time reached
+            return true;
+
         return population.getGranularities().stream().allMatch(
                 granularity -> {
                     double popProportion = population.getProportion(granularity);
                     double samProportion = sample.getProportion(granularity);
                     double error = popProportion - (popProportion * decayingConfidenceFactor);
 
-                    return samProportion <= popProportion + error &&
-                            samProportion >= popProportion - error;
+                    return (samProportion > popProportion) || (samProportion <= popProportion + error &&
+                            samProportion >= popProportion - error);
                 });
     }
 
@@ -350,6 +353,7 @@ public class Sampling {
         if (samplingRate < 0.01)
             samplingRate = 0.01;
 
+        this.resetSamplingDistribution();
         return getSamplingRate();
     }
 }
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 cacd089..ee10160 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
@@ -3,6 +3,7 @@ package br.ufrgs.inf.prosoft.tigris.sampling;
 import br.ufrgs.inf.prosoft.tigris.configuration.annotation.TigrisConfiguration;
 import br.ufrgs.inf.prosoft.tigris.exceptions.ConfigurationException;
 import br.ufrgs.inf.prosoft.tigris.utils.ConfigurationUtils;
+import org.apache.commons.math3.stat.descriptive.SummaryStatistics;
 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.annotation.Around;
 import org.aspectj.lang.annotation.Aspect;
@@ -10,6 +11,12 @@ import org.aspectj.lang.annotation.Pointcut;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.OptionalDouble;
+import java.util.Set;
+
 import static java.lang.System.nanoTime;
 
 @Aspect
@@ -82,7 +89,7 @@ public class SamplingAspect implements Runnable {
 
     static Logger logger = LoggerFactory.getLogger(SamplingAspect.class);
 
-    public static boolean enabled = false;
+    public static boolean enabled = true;
 
     public static boolean samplingEnabled = true;
 
@@ -118,14 +125,30 @@ public class SamplingAspect implements Runnable {
     }
 
     public static boolean adaptSamplingRateInverselyProportionalOps = false;
-    public static void addOperationsPerSecondAndAdapt (int operationsPerSecond) {
+
+    public static void computeCycle (int sec, Set<Integer> markers) {
+        if (!sampling.isAdaptiveSamplingRate() && markers != null && markers.contains(sec)) {
+            if (samplingEnabled) { //uniform or inversely proportional
+                final MonitoringCycle monitoringCycle = sampling.endMonitoringCycle();
+                mseMap.put(sec, monitoringCycle.getAverageProcTimesSample());
+            } else { //no monitoring
+                OptionalDouble mean = monitoring.currentMonitoring.values().stream().mapToDouble(SummaryStatistics::getMean)
+                        .average();
+                monitoring.currentMonitoring.clear();
+                mseMap.put(sec, mean.getAsDouble());
+            }
+        }
+    }
+
+    public static void addOperationsPerSecondAndAdapt (int operationsPerSecond, int sec, Set<Integer> markers) {
+        computeCycle(sec, markers);
 
         if (adaptSamplingRateInverselyProportionalOps) {
             currentSamplingRate = sampling.adaptSamplingRateInverselyProportional(operationsPerSecond);
             return;
         }
 
-        if (SamplingAspect.enabled && sampling.isAdaptiveSamplingRate()) {
+        if (sampling.isAdaptiveSamplingRate()) {
             currentSamplingRate = sampling.getSamplingRate();
             currentNormalBehavior = monitoring.baselinesPerSecondToNormal.getPercentile(50);
             currentNormalMonitoring = monitoring.monitoringPerSecondToNormal.getPercentile(50);
@@ -141,11 +164,16 @@ public class SamplingAspect implements Runnable {
 
             if (!sampling.isPerformanceBaselineEnabled() && sampling.isReady()) {
                 logger.info("Sample is ready, releasing for analysis and resetting...");
+                mseMap.put(sec, sampling.getSample().getMeanExecutionTime());
+                cycleMarkers.add(sec);
                 cycle = sampling.endMonitoringCycle();
             }
         }
     }
 
+    public static Map<Integer, Double> mseMap = new HashMap<>();
+    public static Set<Integer> cycleMarkers = new HashSet<>();
+
     public static PerformanceBaselineDataSet monitoring = new PerformanceBaselineDataSet();
 
     static double currentSamplingRate;