diff --git a/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/PerformanceMetricsQueryConnectorImpl.java b/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/PerformanceMetricsQueryConnectorImpl.java index c77af396996e8de3c0b98b0850211661691c5ccd..5bd4f127e99824fb4103a78ad857e7266d5d87b8 100644 --- a/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/PerformanceMetricsQueryConnectorImpl.java +++ b/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/PerformanceMetricsQueryConnectorImpl.java @@ -1,13 +1,32 @@ package tools.descartes.dql.connector.kieker; +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.math.BigDecimal; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.Date; +import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Properties; +import org.apache.log4j.Logger; +import org.eclipse.emf.common.notify.Adapter; +import org.eclipse.emf.common.notify.Notification; +import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.common.util.TreeIterator; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EOperation; +import org.eclipse.emf.ecore.EReference; +import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.util.EcoreUtil; +import kieker.common.record.system.CPUUtilizationRecord; import tools.descartes.dql.connector.AbstractOSGiQueryConnector; import tools.descartes.dql.connector.PerformanceMetricsQueryConnector; import tools.descartes.dql.connector.QueryProgressListener; @@ -15,6 +34,7 @@ import tools.descartes.dql.connector.kieker.filter.SessionFilter; import tools.descartes.dql.connector.kieker.structures.Component; import tools.descartes.dql.connector.kieker.structures.Resource; import tools.descartes.dql.connector.kieker.structures.ResourceContent; +import tools.descartes.dql.connector.kieker.structures.ResourceContent.ResourceContentType; import tools.descartes.dql.connector.kieker.structures.Session; import tools.descartes.dql.connector.kieker.structures.Trace; import tools.descartes.dql.connector.kieker.structures.identifier.ResourceIdentifier; @@ -22,12 +42,17 @@ import tools.descartes.dql.connector.kieker.structures.records.EventRecord; import tools.descartes.dql.connector.kieker.structures.records.ResourceRecord; import tools.descartes.dql.connector.kieker.util.KiekerHelper; import tools.descartes.dql.connector.kieker.util.KiekerManager; +import tools.descartes.dql.core.engine.util.DQLLogger; +import tools.descartes.dql.core.engine.util.DoFCrossProductHelper; import tools.descartes.dql.models.mapping.domain.ContinuousSeriesResult; +import tools.descartes.dql.models.mapping.domain.DecimalResult; +import tools.descartes.dql.models.mapping.domain.DoF; import tools.descartes.dql.models.mapping.domain.DomainFactory; import tools.descartes.dql.models.mapping.domain.Entity; import tools.descartes.dql.models.mapping.domain.Probe; import tools.descartes.dql.models.mapping.domain.SeriesResultElement; import tools.descartes.dql.models.mapping.domain.StatType; +import tools.descartes.dql.models.mapping.domain.StringResult; import tools.descartes.dql.models.mapping.mapping.EntityMapping; import tools.descartes.dql.models.mapping.mapping.MappingFactory; @@ -35,6 +60,9 @@ public class PerformanceMetricsQueryConnectorImpl extends AbstractOSGiQueryConne implements PerformanceMetricsQueryConnector { private final DomainFactory domainFactory = DomainFactory.eINSTANCE; + + private static final Logger log = DQLLogger.getLogger(PerformanceMetricsQueryConnectorImpl.class.getName()); + @Override public EntityMapping requestMetrics(final EntityMapping request) { @@ -45,15 +73,92 @@ public class PerformanceMetricsQueryConnectorImpl extends AbstractOSGiQueryConne manager.run(); Trace result = manager.getAnalysisResult(); long firstTs = manager.getStartingTime(); + long lastTs = manager.getEndTime(); // Process the trace back to a DQL result // Kieker ergebnisse filtern - processPerformanceResults(response, result, firstTs); + processPerformanceResults(response, result, firstTs, lastTs); return response; } + + @Override + public List<EntityMapping> requestDoFMetrics(final EntityMapping request) { + final ArrayList<EntityMapping> results = new ArrayList<EntityMapping>(); + + String location = request.getModelLocation(); + int index = location.lastIndexOf(File.separator); + String substring = location.substring(index); + boolean isPropertiesFileVariation; + if(substring.contains(".properties")) { + log.info("Varying properties configuration"); + isPropertiesFileVariation = true; + substring = substring.replace(".properties", ""); + substring.replaceAll("\\d",""); + }else{ + log.info("Varying path to search subdirectories"); + isPropertiesFileVariation = false; + } + + List<HashMap<DoF, String>> doFs = new DoFCrossProductHelper().calculateCrossProduct(request); + for (HashMap<DoF, String> configuration : doFs) { + for (Entry<DoF, String> configurationPoint : configuration.entrySet()) { + if(isPropertiesFileVariation) { + String newLocation = location.substring(0, index) + File.separator+substring+ configurationPoint.getValue()+".properties"; + File f = new File(newLocation); + if(f.exists() && !f.isDirectory()) { + request.setModelLocation(newLocation); + }else { + log.error("No configuration file at:" + newLocation); + log.info("Skipping DoF " +configurationPoint.getValue()); + continue; + } + + }else{ + request.setModelLocation(location.substring(0, index) + File.separator+ configurationPoint.getValue()+ File.separator); + } + EntityMapping subResult = requestMetrics(request); + addDoFSetting(configurationPoint.getKey().getIdentifier(), configurationPoint.getValue(), subResult); + results.add(subResult); + } + } + return results; + } + + private void addDoFSetting(String identifier, String value, EntityMapping newRequest) { + for (DoF dof : newRequest.getDoF()) + if (dof.getIdentifier().contains(identifier)) { + dof.setEntityType("DOF"); + dof.setAlias(dof.getIdentifier()); + Probe p = DomainFactory.eINSTANCE.createProbe(); + dof.getProbes().add(p); + StatType st = DomainFactory.eINSTANCE.createStatType(); + p.getStatTypes().add(st); + StringResult result = DomainFactory.eINSTANCE.createStringResult(); + // instruction variation e.g. migrate + if (value.contains(";;;;;")) + result.setValue("Target deployment ID " + value.split(";;;;;")[1]); + // value variation e.g. ADD 10 + else + result.setValue(value); + result.setValid(true); + st.setResult(result); + } + } + +// private EntityMapping requestMetrics(EntityMapping request, HashMap<DoF, String> configuration, +// Properties properties, String outputDirectory) { +// final EntityMapping response = EcoreUtil.copy(request); +// for (Entry<DoF, String> configurationPoint : configuration.entrySet()) { +//// addDoFSetting(configurationPoint.getKey().getIdentifier(), configurationPoint.getValue(), response); +//// models = ModelAdapter.adaptModel(models, configurationPoint.getKey(), configurationPoint.getValue()); +// +// } +// return requestMetrics(properties, response, outputDirectory); +// } + /* Modifies response to include the results of Kieker */ - private void processPerformanceResults(EntityMapping response, Trace kiekerResults, long firstTs) { + private void processPerformanceResults(EntityMapping response, Trace kiekerResults, long firstTs, long lastTs) { Map<Resource, Trace> resources = kiekerResults.getResourceToTraceMap(); Map<ResourceIdentifier, Resource> resourceIds = kiekerResults.getResourceIdentifierToResourceMap(); @@ -63,37 +168,43 @@ public class PerformanceMetricsQueryConnectorImpl extends AbstractOSGiQueryConne // and try to replace the probe with a result for (Entity ent : response.getEntities()) { if (ent.getIdentifier().equals("session") | ent.getAlias().equals("session")) { - addSessionResults(ent, resourceIds, firstTs); - }else if (ent.getIdentifier().equals("system") | ent.getAlias().equals("system")) { - ResourceIdentifier systemidentifier = ResourceIdentifier.createResourceIdentifier("system", "system"); - ContinuousSeriesResult result = DomainFactory.eINSTANCE.createContinuousSeriesResult(); - result.setXAxisDescription("time in ms"); - result.setYAxisDescription("%"); // (between 0 and 1)"); - - List<ResourceRecord> system_utilization = new ArrayList<ResourceRecord>(); - for (ResourceIdentifier resourceID : resourceIds.keySet()) { - List<ResourceRecord> cpu_utilization = resources.get(resourceID).getResources(); - for(int i=0; i<cpu_utilization.size(); i++) { - if(i < system_utilization.size()) { - if(system_utilization.get(i).getTimestamp() == cpu_utilization.get(i).getTimestamp()) { - double sum = system_utilization.get(i).getContent().get(ResourceContent.UTILIZATION) + cpu_utilization.get(i).getContent().get(ResourceContent.UTILIZATION); - system_utilization.get(i).getContent().set(ResourceContent.UTILIZATION, sum); - }else { - //log.error(); - } - }else { - system_utilization.add(new ResourceRecord(systemidentifier, cpu_utilization.get(i).getTimestamp(), cpu_utilization.get(i).getContent())); - } + for (Probe dqlProbe : ent.getProbes()) { + if(dqlProbe.getMetricName().equals(KiekerHelper.METRIC_THROUGHPUT)) { + addSessionThroughput(ent, dqlProbe, firstTs, lastTs); + }else { + addSessionResponseTimes(ent, dqlProbe, firstTs); } - ent.getProbes().get(0).setMetricName("UTILIZTATION"); - ent.getProbes().get(0).getStatTypes().get(0).setTypeName("sample"); - ent.getProbes().get(0).getStatTypes().get(0).setResult(result); - } + } + }else if (ent.getIdentifier().equals("system") | ent.getAlias().equals("system")) { + addSystemUtilization(firstTs, resources, resourceIds, ent); + } else { for (Probe dqlProbe : ent.getProbes()) { + if(dqlProbe.getStatTypes().isEmpty()) { + //dqlProbe.getStatTypes().add(new ) + log.error("NEED TO ADD DEFAULT STAT TYPE"); + } for (StatType st : dqlProbe.getStatTypes()) { - if (KiekerHelper.METRIC_UTILIZATION.equalsIgnoreCase(dqlProbe.getMetricName())) { - if (st.getTypeName().equals("DEFAULT") || st.getTypeName().equals("SAMPLE")) { + if (st.getTypeName().equalsIgnoreCase("mean")){ + ResourceIdentifier dqlId = ResourceIdentifier.createResourceIdentifier("", + ent.getIdentifier()); + Resource res = resourceIds.get(dqlId); + if (res != null && resources.get(res) != null + && resources.get(res).getResources().size() > 0) { + try { + double value=0; + int cnt = 0; + for (ResourceRecord record : resources.get(res).getResources()) { + value += record.getContent().get(ResourceContent.UTILIZATION) / 1000000000.0; + cnt++; + } + createUtilization(ent, st, value/cnt); + } catch (NumberFormatException exc) { + System.out.println("Error "+exc.getStackTrace()); + } + } + }else if (KiekerHelper.METRIC_UTILIZATION.equalsIgnoreCase(dqlProbe.getMetricName())) { + if (st.getTypeName().equalsIgnoreCase("DEFAULT") || st.getTypeName().equalsIgnoreCase("SAMPLE")) { ContinuousSeriesResult result = DomainFactory.eINSTANCE.createContinuousSeriesResult(); result.setXAxisDescription("time in ms"); result.setYAxisDescription("%"); // (between 0 and 1)"); @@ -109,23 +220,22 @@ public class PerformanceMetricsQueryConnectorImpl extends AbstractOSGiQueryConne // "+ent.getIdentifier()+": Time" // +record.getTimestamp()+" / Util: // "+record.getContent().get(2)); - result.getElements().add(KiekerHelper.getSeriesResultElement( - record.getTimestamp(), record.getContent().get(ResourceContent.UTILIZATION), firstTs)); + KiekerHelper.addToResult(result, record.getTimestamp(), record.getContent().get(ResourceContent.UTILIZATION), firstTs); } result.setValid(true); } catch (NumberFormatException exc) { + System.out.println("Error "+exc.getStackTrace()); result.setValid(false); } st.setResult(result); } - } else { // do nothing } } else if (KiekerHelper.METRIC_RESPONSE_TIME.equalsIgnoreCase(dqlProbe.getMetricName())) { - if (st.getTypeName().equals("DEFAULT") || st.getTypeName().equals("SAMPLE")) { + if (st.getTypeName().equalsIgnoreCase("DEFAULT") || st.getTypeName().equalsIgnoreCase("SAMPLE")) { ContinuousSeriesResult res = DomainFactory.eINSTANCE.createContinuousSeriesResult(); - res.setXAxisDescription("ms"); + res.setXAxisDescription("in s"); //seconds res.setYAxisDescription("arrival time in ms"); if (services != null) { try { @@ -141,8 +251,7 @@ public class PerformanceMetricsQueryConnectorImpl extends AbstractOSGiQueryConne kiekerId += "." + er.getIdentifier().getInterfaceID(); } if (kiekerId.contains(dqlId)) { - res.getElements().add(KiekerHelper.getSeriesResultElement( - er.getTimestamp(), er.getRuntime(), firstTs)); + KiekerHelper.addToResult(res, er.getTimestamp(), er.getRuntime() / 1000000000.0, firstTs); } } @@ -150,11 +259,16 @@ public class PerformanceMetricsQueryConnectorImpl extends AbstractOSGiQueryConne } } catch (NumberFormatException exc) { + log.warn("NumberFormatException occured"); + log.info(exc); res.setValid(false); } st.setResult(res); } } + + } else if (KiekerHelper.METRIC_THROUGHPUT.equalsIgnoreCase(dqlProbe.getMetricName())) { + addServiceThroughput(firstTs, lastTs, services, ent, dqlProbe); } @@ -162,27 +276,164 @@ public class PerformanceMetricsQueryConnectorImpl extends AbstractOSGiQueryConne } } } + //DEBUG OUTPUT + + + log.info("--------------------------------------------------------------------------------"); + log.info("\t\t\tListing results"); + log.info("--------------------------------------------------------------------------------"); + for(Entity entity:response.getEntities()) { + log.info(entity.getIdentifier()); + for(Probe probe:entity.getProbes()) { + log.info("\t"+probe.getMetricName() ); + //log.info("\t\t"+probe.getStatTypes()); + for (StatType statType:probe.getStatTypes()) { + if(statType.getResult() instanceof ContinuousSeriesResult) { + log.info("\t\t"+((ContinuousSeriesResult)statType.getResult()).getElements().size()+" values"); + }else if (statType.getResult() instanceof DecimalResult) { + //log.info("\t\t"+statType.getTypeName()); + log.info("\t\t"+((DecimalResult)statType.getResult()).getValue()); + } + + } + } + + + } } - private void addSessionResults(Entity entity, Map<ResourceIdentifier, Resource> resourceIds, +private void addSystemUtilization(long firstTs, Map<Resource, Trace> resources, + Map<ResourceIdentifier, Resource> resourceIds, Entity ent) { + ContinuousSeriesResult result = DomainFactory.eINSTANCE.createContinuousSeriesResult(); + result.setXAxisDescription("time in ms"); + result.setYAxisDescription("%"); // (between 0 and 1)"); + ResourceIdentifier systemidentifier = ResourceIdentifier.createResourceIdentifier("system", "system"); + + List<ResourceRecord> system_utilization = new ArrayList<ResourceRecord>(); + + log.info("Merging the results of "+ resourceIds.keySet().size()+ " cores to calculate utilization of system --- START"); + + + for (ResourceIdentifier resourceID : resourceIds.keySet()) { + Resource resource = resourceIds.get(resourceID); + List<ResourceRecord> cpu_utilization = resources.get(resource).getResources(); +// System.out.println("--------------------------------------------------------------------------------"); +// System.out.println("\t "+ resource.getName() +" has "+ cpu_utilization.size() + " entries"); +// System.out.println("--------------------------------------------------------------------------------"); + + Comparator<? super ResourceRecord> resourceRecordComparator = new Comparator<ResourceRecord>() + { + public int compare(ResourceRecord o1, ResourceRecord o2) { + if(o2.getTimestamp() == o1.getTimestamp()) { + return 0; + }else if (o2.getTimestamp() - o1.getTimestamp() > 0){ + return -1; + }else { + return 1; + } + }; + }; + Collections.sort(cpu_utilization, resourceRecordComparator); + + for(int i=0; i<cpu_utilization.size(); i++) { + if(i < system_utilization.size()) { +// if(system_utilization.get(i).getTimestamp() == cpu_utilization.get(i).getTimestamp()) { +// }else { +// System.out.println("Timestamp missmatch "+(resource.getName()) +" "+ ((system_utilization.get(i).getTimestamp() - cpu_utilization.get(i).getTimestamp())/1000.0/1000.0) + " ms"); +// } + double sum = system_utilization.get(i).getContent().get(ResourceContent.UTILIZATION) + cpu_utilization.get(i).getContent().get(ResourceContent.UTILIZATION); + system_utilization.get(i).getContent().set(ResourceContent.UTILIZATION, sum); + }else { + system_utilization.add(new ResourceRecord(systemidentifier, cpu_utilization.get(i).getTimestamp(), cpu_utilization.get(i).getContent().clone())); + } + } + } + for(ResourceRecord record:system_utilization) { + KiekerHelper.addToResult(result, record.getTimestamp(), record.getContent().get(ResourceContent.UTILIZATION) + / (double)resourceIds.keySet().size() // + , firstTs); + + } + log.info("Merging the results of "+ resourceIds.keySet().size()+ " cores to calculate utilization of system --- FINISHED"); + + ent.getProbes().get(0).setMetricName("utilization"); + ent.getProbes().get(0).getStatTypes().get(0).setTypeName("sample"); + ent.getProbes().get(0).getStatTypes().get(0).setResult(result); +} + + private void addServiceThroughput(long firstTs, long lastTs, Map<Component, Trace> services, Entity ent, + Probe dqlProbe) { + StatType statType = dqlProbe.getStatTypes().get(0); + int cnt = 0; + try { + Component comp = new Component( + KiekerHelper.getComponentString(ent.getIdentifier())); + Trace tr = services.get(comp); + if (tr != null && tr.getEvents().size() > 0) { + for (EventRecord er : tr.getEvents()) { + String dqlId = ent.getIdentifier(); + + String kiekerId = er.getIdentifier().getComponentID(); + if (er.getIdentifier().isInterfaceIdentifier()) { + kiekerId += "." + er.getIdentifier().getInterfaceID(); + } + if (kiekerId.contains(dqlId)) { + cnt++; + } + + } + } + + } catch (NumberFormatException exc) { + log.error(exc); + } + + createThroughput(firstTs, lastTs, ent, statType, cnt); + } + + private void createThroughput(long firstTs, long lastTs, Entity ent, StatType statType, int cnt) { + DecimalResult result = DomainFactory.eINSTANCE.createDecimalResult(); + double interval = ((lastTs - firstTs)/1000.0/1000.0/1000.0); //in seconds, micro, nano, milli + long value = (long) (cnt / interval); + log.info("requests "+ent.getIdentifier()+": "+cnt); + log.info("interval "+ interval + " ["+firstTs+" : "+lastTs+"]"); + log.info("througput" + new BigDecimal(value)); + result.setValue(new BigDecimal(value)); + result.setValid(true); + statType.setResult(result); + } + + private void createUtilization(Entity ent, StatType statType, double value) { + DecimalResult result = DomainFactory.eINSTANCE.createDecimalResult(); + result.setValue(new BigDecimal(value)); + result.setValid(true); + statType.setResult(result); + } + + private void addSessionResponseTimes(Entity entity, Probe dqlProbe, long firstTs) { - StatType statType = entity.getProbes().get(0).getStatTypes().get(0); + StatType statType = dqlProbe.getStatTypes().get(0); ContinuousSeriesResult result = DomainFactory.eINSTANCE.createContinuousSeriesResult(); - result.setXAxisDescription("ms"); - result.setYAxisDescription("% (between 0 and 1)"); + result.setXAxisDescription("response time in ms"); + result.setYAxisDescription("arrival time in ms"); // String abc = "session"; // ent.getIdentifier(); // ResourceIdentifier dqlId = ResourceIdentifier.createResourceIdentifier("", abc); // Resource res = new Resource("session");// resourceIds.get(dqlId); // resourceIds.put(dqlId, res); for (Session session : SessionFilter.sessionTimes) { - SeriesResultElement resultElement = KiekerHelper.getSeriesResultElement(session.start, session.duration, + KiekerHelper.addToResult(result, session.start, session.duration / 1000000.0, firstTs); - result.getElements().add(resultElement); } statType.setResult(result); } + + private void addSessionThroughput(Entity entity, Probe dqlProbe, long firstTs, long lastTs) { + StatType statType = dqlProbe.getStatTypes().get(0); + createThroughput(firstTs, lastTs, entity, statType, SessionFilter.sessionTimes.size()); + } + public void reset() { // Nothing to do here @@ -234,11 +485,6 @@ public class PerformanceMetricsQueryConnectorImpl extends AbstractOSGiQueryConne return null; } - @Override - public List<EntityMapping> requestDoFMetrics(final EntityMapping request) { - return null; - } - @Override public void setConstraint(final String constraint) { } @@ -270,7 +516,7 @@ public class PerformanceMetricsQueryConnectorImpl extends AbstractOSGiQueryConne @Override public boolean supportsDoFRequests() { - return false; + return true; } @Override diff --git a/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/filter/SessionFilter.java b/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/filter/SessionFilter.java index 48fb351ba4b9f98f842853678369033374bd404c..cd141eb6c9f23f8976f8c1b4ce22143ad16290ce 100644 --- a/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/filter/SessionFilter.java +++ b/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/filter/SessionFilter.java @@ -53,8 +53,8 @@ public class SessionFilter extends AbstractMessageTraceProcessingFilter { Operation operation = message.getReceivingExecution().getOperation(); String id = mt.getSessionId(); - System.out.println(id + ":" + time + "\txxx" + (time3 - time2) * 0.000001 + "\t\t " - + operation.getSignature().getName() + " \t\t||| " + start); +// System.out.println(id + ":" + time + "\txxx" + (time3 - time2) * 0.000001 + "\t\t " +// + operation.getSignature().getName() + " \t\t||| " + start); // addTimeStamp(id, mt.getStartTimestamp()); // addTimeStamp(id, mt.getEndTimestamp()); @@ -62,7 +62,7 @@ public class SessionFilter extends AbstractMessageTraceProcessingFilter { addTimeStamp(id, message.getReceivingExecution().getTin()); addTimeStamp(id, message.getReceivingExecution().getTout()); long value = (time3 - time2); //* 0.000001; - System.out.println("\t\t\t"+value); +// System.out.println("\t\t\t"+value); addToSumMap(id, value); // addTimeStamp(id, message.getReceivingExecution().getTout()); sortMessageTrace(mt); @@ -86,15 +86,16 @@ public class SessionFilter extends AbstractMessageTraceProcessingFilter { } }; Collections.sort(messages, timeComparator); - for (AbstractMessage message : messages) { - if(message.getReceivingExecution().getEoi() == 0){ - System.out.println( - "==>" + message.getReceivingExecution().getOperation().getSignature().getName() + " " + message.getReceivingExecution().getEoi()); - }else{ - System.out.println( - "" + message.getReceivingExecution().getOperation().getSignature().getName() + " " + message.getReceivingExecution().getEoi()); - } - } +// if(log.getLevel() & log.getLevel()>Level.) //if log level is high ... +// for (AbstractMessage message : messages) { +// if(message.getReceivingExecution().getEoi() == 0){ +// System.out.println( +// "==>" + message.getReceivingExecution().getOperation().getSignature().getName() + " " + message.getReceivingExecution().getEoi()); +// }else{ +// System.out.println( +// "" + message.getReceivingExecution().getOperation().getSignature().getName() + " " + message.getReceivingExecution().getEoi()); +// } +// } } AbstractMessage getStartMessage(final MessageTrace mt) { diff --git a/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/structures/ResourceContent.java b/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/structures/ResourceContent.java index 2fea2aeed6b2464d6edf7bcb43001223f66c82d9..579b13846744050dd11596760a061f31eee5c417 100644 --- a/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/structures/ResourceContent.java +++ b/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/structures/ResourceContent.java @@ -79,6 +79,14 @@ public class ResourceContent { return content.clone(); } + + public ResourceContent clone() { + ResourceContent clone = new ResourceContent(this.type); + clone.content = getAllValues(); + clone.idx = this.idx; + return clone; + } + public String toString() { StringBuilder builder = new StringBuilder(); for (int i = 0; i < content.length; i++) { diff --git a/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/util/KiekerHelper.java b/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/util/KiekerHelper.java index 2a057a5d2158795f3e1e09e0d525ee9df490bcb7..6eca3b92ced36b49d266d3fa4ff14dc600060c38 100644 --- a/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/util/KiekerHelper.java +++ b/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/util/KiekerHelper.java @@ -28,6 +28,7 @@ import tools.descartes.dql.connector.kieker.structures.identifier.ResourceIdenti import tools.descartes.dql.connector.kieker.structures.records.EventRecord; import tools.descartes.dql.connector.kieker.structures.records.ResourceRecord; import tools.descartes.dql.core.engine.util.DQLLogger; +import tools.descartes.dql.models.mapping.domain.AbstractSeriesResult; import tools.descartes.dql.models.mapping.domain.ContinuousSeriesResult; import tools.descartes.dql.models.mapping.domain.DomainFactory; import tools.descartes.dql.models.mapping.domain.Entity; @@ -62,6 +63,12 @@ public class KiekerHelper { public static final String METRIC_THROUGHPUT = "throughput"; private static final Logger log = DQLLogger.getLogger(KiekerHelper.class.getName()); + public static double lowerBound = Double.MIN_VALUE; + public static double upperBound = Double.MAX_VALUE; + //int lowerBound = 114000; int upperBound = 140000; + //TODO remove this quick fix + //lowerBound = 100000; int upperBound = 140000; +// /** @@ -217,18 +224,15 @@ public class KiekerHelper { } - - - - public static SeriesResultElement getSeriesResultElement(long timeStamp, double value, long firstTimestamp){ - SeriesResultElement e = DomainFactory.eINSTANCE.createSeriesResultElement(); + public static void addToResult(AbstractSeriesResult result, long timeStamp, double value, long firstTimestamp) { + SeriesResultElement resultElement = DomainFactory.eINSTANCE.createSeriesResultElement(); // convert ts to millis - BigDecimal time = new BigDecimal( - ((timeStamp - firstTimestamp) / 1000000.0)); - BigDecimal responsetime = new BigDecimal(value / 1000000.0); - e.setX(time); - e.setY(responsetime); - return e; + double time = ((timeStamp - firstTimestamp) / 1000000.0); + if( time> lowerBound && time < upperBound ) { + resultElement.setX(new BigDecimal(time)); + resultElement.setY(new BigDecimal(value)); + result.getElements().add(resultElement); + } } public static String getComponentString (String identifier){ @@ -262,37 +266,37 @@ public class KiekerHelper { } - public static Configuration createAnalysisConfig(EntityMapping request, String outputPath, String hostname){ + public static Configuration createAnalysisConfig(EntityMapping request, String outputPath, String hostname) { File[] traceFolders = KiekerHelper.getTraceFolders(outputPath); - Configuration readerConfig = new Configuration(); - - for (int i = 0; i< traceFolders.length; i++){ - readerConfig.setProperty("TRACE_"+i, traceFolders[i].getAbsolutePath()); - } - + Configuration readerConfig = new Configuration(); + + for (int i = 0; i < traceFolders.length; i++) { + readerConfig.setProperty("TRACE_" + i, traceFolders[i].getAbsolutePath()); + } + for (Entity e : request.getEntities()) { - if (e.getEntityType().equals("RESOURCE")){ - if(e.getIdentifier().contains("system") || e.getAlias().contains("system")){ + if (e.getEntityType().equals("RESOURCE")) { + if (e.getIdentifier().contains("system") || e.getAlias().contains("system")) { continue; } String r_id = e.getIdentifier(); String r_value = hostname; - readerConfig.setProperty("RESOURCE_"+r_id, r_value); + readerConfig.setProperty("RESOURCE_" + r_id, r_value); } - } - - int i = 0; + } + + int i = 0; for (Entity e : request.getEntities()) { if (e.getEntityType().equals("SERVICE")) { - if(e.getIdentifier().contains("session") || e.getAlias().contains("session")){ - continue; - } - String component = getComponentString(e.getIdentifier()); - String identifier = hostname + " & " + component; - readerConfig.setProperty("COMPONENT_c" + i, identifier); - i++; + if (e.getIdentifier().contains("session") || e.getAlias().contains("session")) { + continue; + } + String component = getComponentString(e.getIdentifier()); + String identifier = hostname + " & " + component; + readerConfig.setProperty("COMPONENT_c" + i, identifier); + i++; } - } + } return readerConfig; }