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