diff --git a/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/ModelStructureQueryConnectorImpl.java b/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/ModelStructureQueryConnectorImpl.java index 2f284611adfce54d365dae7cf23370323613b4bd..42b42bcc6df608efd0d888e461d9949e51e6bb26 100644 --- a/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/ModelStructureQueryConnectorImpl.java +++ b/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/ModelStructureQueryConnectorImpl.java @@ -16,6 +16,8 @@ import tools.descartes.dql.connector.QueryProgressListener; import tools.descartes.dql.connector.kieker.structures.Trace; 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.models.mapping.domain.DomainFactory; import tools.descartes.dql.models.mapping.domain.Entity; 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 3b31109ddab925726de4c310915578b8e718cdd1..83d384526d61a61d01387984505b19d4c81c05d4 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 @@ -10,18 +10,24 @@ import org.eclipse.emf.ecore.util.EcoreUtil; import tools.descartes.dql.connector.AbstractOSGiQueryConnector; import tools.descartes.dql.connector.PerformanceMetricsQueryConnector; import tools.descartes.dql.connector.QueryProgressListener; +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.Session; import tools.descartes.dql.connector.kieker.structures.Trace; import tools.descartes.dql.connector.kieker.structures.identifier.ResourceIdentifier; 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.models.mapping.domain.ContinuousSeriesResult; 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.mapping.EntityMapping; +import tools.descartes.dql.models.mapping.mapping.MappingFactory; public class PerformanceMetricsQueryConnectorImpl extends AbstractOSGiQueryConnector implements PerformanceMetricsQueryConnector { @@ -54,81 +60,143 @@ public class PerformanceMetricsQueryConnectorImpl extends AbstractOSGiQueryConne // browse through each entity and its probes // and try to replace the probe with a result for (Entity ent : response.getEntities()) { - for (Probe dqlProbe : ent.getProbes()) { - for (StatType st : dqlProbe.getStatTypes()) { - if (KiekerHelper.METRIC_UTILIZATION.equalsIgnoreCase(dqlProbe.getMetricName())) { - if (st.getTypeName().equals("DEFAULT") || st.getTypeName().equals("SAMPLE")) { - ContinuousSeriesResult result = DomainFactory.eINSTANCE.createContinuousSeriesResult(); - result.setXAxisDescription("ms"); - result.setYAxisDescription("% (between 0 and 1)"); - 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 { - for (ResourceRecord record : resources.get(res).getResources()) { - // System.out.println("ADDING for - // "+ent.getIdentifier()+": Time" - // +record.getTimestamp()+" / Util: - // "+record.getContent().get(2)); - result.getElements() - .add(KiekerHelper.getSeriesResultElement(record.getTimestamp(), - record.getContent().get(2) / 1000 / 1000, firstTs)); + if (ent.getIdentifier().equals("session") | ent.getAlias().equals("session")) { + addSessionResults(ent, resourceIds, firstTs); + } else { + + for (Probe dqlProbe : ent.getProbes()) { + for (StatType st : dqlProbe.getStatTypes()) { + if (KiekerHelper.METRIC_UTILIZATION.equalsIgnoreCase(dqlProbe.getMetricName())) { + if (st.getTypeName().equals("DEFAULT") || st.getTypeName().equals("SAMPLE")) { + ContinuousSeriesResult result = DomainFactory.eINSTANCE.createContinuousSeriesResult(); + result.setXAxisDescription("ms"); + result.setYAxisDescription("% (between 0 and 1)"); + 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 { + for (ResourceRecord record : resources.get(res).getResources()) { + // System.out.println("ADDING for + // "+ent.getIdentifier()+": Time" + // +record.getTimestamp()+" / Util: + // "+record.getContent().get(2)); + result.getElements().add(KiekerHelper.getSeriesResultElement( + record.getTimestamp(), record.getContent().get(2), firstTs)); + } + result.setValid(true); + } catch (NumberFormatException exc) { + result.setValid(false); } - result.setValid(true); - } catch (NumberFormatException exc) { - result.setValid(false); + st.setResult(result); } - st.setResult(result); + + } else { + // do nothing } + } else if (KiekerHelper.METRIC_RESPONSE_TIME.equalsIgnoreCase(dqlProbe.getMetricName())) { + if (st.getTypeName().equals("DEFAULT") || st.getTypeName().equals("SAMPLE")) { + ContinuousSeriesResult res = DomainFactory.eINSTANCE.createContinuousSeriesResult(); + res.setXAxisDescription("ms"); + res.setYAxisDescription("ms"); + if (services != null) { + 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)) { + res.getElements().add(KiekerHelper.getSeriesResultElement( + er.getTimestamp(), er.getRuntime(), firstTs)); + } - } else { - // do nothing - } - } else if (KiekerHelper.METRIC_RESPONSE_TIME.equalsIgnoreCase(dqlProbe.getMetricName())) { - if (st.getTypeName().equals("DEFAULT") || st.getTypeName().equals("SAMPLE")) { - ContinuousSeriesResult res = DomainFactory.eINSTANCE.createContinuousSeriesResult(); - res.setXAxisDescription("ms"); - res.setYAxisDescription("ms"); - if (services != null) { - 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)) { - res.getElements().add(KiekerHelper.getSeriesResultElement( - er.getTimestamp(), er.getRuntime(), firstTs)); } - + res.setValid(true); } - res.setValid(true); - } - } catch (NumberFormatException exc) { - res.setValid(false); + } catch (NumberFormatException exc) { + res.setValid(false); + } + st.setResult(res); } - st.setResult(res); } + } } - } } } } + private void addSessionResults(Entity entity, Map<ResourceIdentifier, Resource> resourceIds, + long firstTs) { + Probe probe = DomainFactory.eINSTANCE.createProbe(); + probe.setMetricName("responseTime"); + entity.getProbes().add(probe); + StatType statType = DomainFactory.eINSTANCE.createStatType(); + statType.setTypeName("DEFAULT"); + probe.getStatTypes().add(statType); + + ContinuousSeriesResult result = DomainFactory.eINSTANCE.createContinuousSeriesResult(); + result.setXAxisDescription("ms"); + result.setYAxisDescription("% (between 0 and 1)"); + 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, + firstTs); + result.getElements().add(resultElement); + } + statType.setResult(result); + } + + // private void runABC(EntityMapping response, Trace kiekerResults, long + // firstTs){ + // Map<Resource, Trace> resources = kiekerResults.getResourceToTraceMap(); + // Map<ResourceIdentifier, Resource> resourceIds = + // kiekerResults.getResourceIdentifierToResourceMap(); + // Map<Component, Trace> services = kiekerResults.getComponentToTraceMap(); + // + // ContinuousSeriesResult res = + // DomainFactory.eINSTANCE.createContinuousSeriesResult(); + // res.setXAxisDescription("ms"); + // res.setYAxisDescription("ms"); + // if (services != null) { + // try { + // Component comp = new Component( + // KiekerHelper.getComponentString(ent.getIdentifier())); + // Trace tr = services.get(comp); + // if (tr != null && tr.getEvents().size() > 0) { + // EventRecord first = tr.getEvents().get(0); + // EventRecord last = tr.getEvents().get(tr.getEvents().size()-1); + // double traceTime = last.getTimestamp() + last.getRuntime() - + // (first.getTimestamp()); + // res.getElements().add(KiekerHelper.getSeriesResultElement( + // er.getTimestamp(), er.getRuntime(), firstTs)); + // res.setValid(true); + // } + // + // } catch (NumberFormatException exc) { + // res.setValid(false); + // } + // st.setResult(res); + // } + // } + // + public void reset() { // Nothing to do here } 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 new file mode 100644 index 0000000000000000000000000000000000000000..48fb351ba4b9f98f842853678369033374bd404c --- /dev/null +++ b/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/filter/SessionFilter.java @@ -0,0 +1,169 @@ +package tools.descartes.dql.connector.kieker.filter; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; + +import kieker.analysis.IProjectContext; +import kieker.analysis.plugin.annotation.InputPort; +import kieker.analysis.plugin.annotation.OutputPort; +import kieker.analysis.plugin.annotation.Plugin; +import kieker.common.configuration.Configuration; +import kieker.tools.traceAnalysis.filter.AbstractMessageTraceProcessingFilter; +import kieker.tools.traceAnalysis.systemModel.AbstractMessage; +import kieker.tools.traceAnalysis.systemModel.MessageTrace; +import kieker.tools.traceAnalysis.systemModel.Operation; +import tools.descartes.dql.connector.kieker.structures.Session; + +import org.apache.log4j.Logger; + +@Plugin(name = "SessionFilter", description = "...", outputPorts = { + @OutputPort(name = SessionFilter.OUTPUT_PORT_NAME_WORKLOAD, description = "Outputs workload description", eventTypes = { + HashMap.class }), }) +public class SessionFilter extends AbstractMessageTraceProcessingFilter { + + public static final String INPUT_PORT_NAME_MESSAGE_TRACE = "messageTrace"; + public static final String OUTPUT_PORT_NAME_WORKLOAD = "workload"; + + private static final Logger log = Logger.getLogger(SessionFilter.class); + private static HashMap<String, List<Long>> timeSeriesMap; + private static HashMap<String, Long> sumMap; + public static ArrayList<Session> sessionTimes; + + public SessionFilter(Configuration configuration, IProjectContext projectContext) { + super(configuration, projectContext); + timeSeriesMap = new HashMap<String, List<Long>>(); + sumMap = new HashMap<String, Long>(); + sessionTimes = new ArrayList<Session>(); + } + + @Override + @InputPort(name = AbstractMessageTraceProcessingFilter.INPUT_PORT_NAME_MESSAGE_TRACES, description = "Receives the message traces to be processed", eventTypes = { + MessageTrace.class }) + public void inputMessageTraces(final MessageTrace mt) { + long start = mt.getStartTimestamp(); + long time = (long) ((mt.getEndTimestamp() - mt.getStartTimestamp()) * 0.000001); + // mt.getTraceInformation().getSessionId(); + AbstractMessage message = getStartMessage(mt); + long time2 = message.getReceivingExecution().getTin(); + // double time3 = message.getReceivingExecution().getTout(); + long time3 = message.getReceivingExecution().getTout(); + + 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); + + // addTimeStamp(id, mt.getStartTimestamp()); + // addTimeStamp(id, mt.getEndTimestamp()); + // addTimeStamp(id, message.getTimestamp()); + addTimeStamp(id, message.getReceivingExecution().getTin()); + addTimeStamp(id, message.getReceivingExecution().getTout()); + long value = (time3 - time2); //* 0.000001; + System.out.println("\t\t\t"+value); + addToSumMap(id, value); + // addTimeStamp(id, message.getReceivingExecution().getTout()); + sortMessageTrace(mt); + } + Comparator<AbstractMessage> timeComparator; + + private void sortMessageTrace(final MessageTrace mt) { + List<AbstractMessage> messages = mt.getSequenceAsVector(); + messages = new ArrayList<AbstractMessage>(messages); + timeComparator = new Comparator<AbstractMessage>() { + @Override + public int compare(AbstractMessage arg0, AbstractMessage arg1) { + return arg0.getReceivingExecution().getEoi() - arg1.getReceivingExecution().getEoi(); +// if (arg0.getTimestamp() > arg1.getTimestamp()) { +// return 1; +// } else if (arg0.getTimestamp() < arg1.getTimestamp()) { +// return -1; +// } else { +// return 0; +// } + } + }; + 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()); + } + } + } + + AbstractMessage getStartMessage(final MessageTrace mt) { + for (AbstractMessage message : mt.getSequenceAsVector()) { + System.out.println("\t" + message.getReceivingExecution().getOperation().getSignature().getName() + " " + + message.getTimestamp() + " " + mt.getStartTimestamp()); + // System.out.println("\t"+message.getReceivingExecution().getTin() + // + " "+ message.getReceivingExecution().getTout() + " " + + // message.getSendingExecution().getTout() ); + if (message.getTimestamp() == mt.getStartTimestamp()) { + return message; + } + } + return mt.getSequenceAsVector().get(0); + } + + private synchronized void addToSumMap(String key, long time){ + if (!sumMap.containsKey(key)) { + sumMap.put(key, time); + } else { + sumMap.put(key, sumMap.get(key)+ time); + } + } + + private synchronized void addTimeStamp(String key, long timestamp) { + List<Long> timeSeries; + if (!timeSeriesMap.containsKey(key)) { + timeSeries = new ArrayList<>(); + timeSeries.add(timestamp); + timeSeriesMap.put(key, timeSeries); + } else { + timeSeries = timeSeriesMap.get(key); + timeSeries.add(timestamp); + } + } + + @Override + public void terminate(boolean errorBeforeTermination) { + // log.info("workloadddd "+timeSeriesMap); + if (timeSeriesMap.isEmpty()) { + log.error("Could not extract incoming requests to create workload model"); + } + + for (String key : timeSeriesMap.keySet()) { + List<Long> list = timeSeriesMap.get(key); + Collections.sort(timeSeriesMap.get(key)); + for (long t : list) { + //System.out.println("\t\t" + (t * 0.000001)); + } + ; + long start = Collections.min(list);//list.get(0); + long duration = (long) (Collections.max(list) - start); +// System.out.println(key + "\t\t" + time + "\t\t\tnumElements:"+list.size()+"\tfirst:" + list.get(0) + "\tlast" + list.get(list.size() - 1)); +// System.out.println(key + "\t\t" +sumMap.get(key)+ " << sum map"); + //System.out.println(key + "\t\t" + time + "<< total \t\t" + sumMap.get(key) * 0.000001 + " << processing time"); + addNewSession(key, start, duration); + } + + super.deliver(SessionFilter.OUTPUT_PORT_NAME_WORKLOAD, timeSeriesMap); + super.terminate(errorBeforeTermination); + } + + private void addNewSession(String key, long start, long duration) { + sessionTimes.add(new Session(key, start, duration)); + } + + @Override + public Configuration getCurrentConfiguration() { + return this.configuration; + } + +} diff --git a/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/structures/Configuration.java b/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/structures/Configuration.java index 41f534a03b73ff696be2dfda7ce849e409bbf651..95d9c9ee69b0b36f5e9c33dd6fc0362ecfdf7ea1 100644 --- a/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/structures/Configuration.java +++ b/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/structures/Configuration.java @@ -8,23 +8,19 @@ import java.util.Properties; import kieker.common.logging.Log; import kieker.common.logging.LogFactory; -public class Configuration extends Properties{ - +public class Configuration extends Properties { private static final long serialVersionUID = 3566582505382356485L; private static final Log log = LogFactory.getLog(Configuration.class); - public Configuration() { } - public Configuration(String key, String sign) { super.put(key, sign); } - - public final void setPropertyArray(String key, Object[] sign){ + public final void setPropertyArray(String key, Object[] sign) { super.setProperty(key, toPropertyString(sign)); } @@ -39,7 +35,7 @@ public class Configuration extends Properties{ return sb.toString(); } - public static String generateID(Class<?> c){ + public static String generateID(Class<?> c) { return c.getSimpleName() + "_CONFIG"; } @@ -107,12 +103,11 @@ public class Configuration extends Properties{ return null; } - public final String[] getPropertyArray(final String key) { super.getProperty(key.trim()); String[] out = super.getProperty(key).split("&"); for (String str : out) { - if (!(str.length()==0 || str == null)) { + if (!(str.length() == 0 || str == null)) { str = str.trim(); } } @@ -124,30 +119,28 @@ public class Configuration extends Properties{ super.load(inStream); } - - + public synchronized String toString() { return super.toString(); } - @Override @Deprecated - public void putAll(Map<? extends Object,? extends Object> m){ + public void putAll(Map<? extends Object, ? extends Object> m) { super.putAll(m); } @Override @Deprecated - public Object put(Object key, Object sign){ + public Object put(Object key, Object sign) { return super.put(key, sign); } @Override @Deprecated - public Object get(Object key){ + public Object get(Object key) { return super.get(key); } @@ -160,10 +153,9 @@ public class Configuration extends Properties{ @Override @Deprecated - public Object putIfAbsent(Object key, Object sign){ + public Object putIfAbsent(Object key, Object sign) { return super.putIfAbsent(key, sign); } - } diff --git a/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/structures/Session.java b/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/structures/Session.java new file mode 100644 index 0000000000000000000000000000000000000000..089e4984043800e20828698dc6ea51fe8956022a --- /dev/null +++ b/tools.descartes.dql.connector.kieker/src/tools/descartes/dql/connector/kieker/structures/Session.java @@ -0,0 +1,33 @@ +package tools.descartes.dql.connector.kieker.structures; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import tools.descartes.dql.connector.kieker.structures.identifier.ComponentIdentifier; +import tools.descartes.dql.connector.kieker.structures.identifier.ResourceIdentifier; +import tools.descartes.dql.connector.kieker.structures.records.AbstractRecord; +import tools.descartes.dql.connector.kieker.structures.records.EventRecord; +import tools.descartes.dql.connector.kieker.structures.records.ResourceRecord; + +/** + * Stores list of event records and offers multiple analysis methods. + * + * @author J�rgen Walter + */ +public class Session { + + public String id; + public Long start; + public Long duration; + + public Session( String id, Long start, Long duration) { + this.id = id; + this.start = start; + this.duration = duration; + } + +}