Skip to content
Snippets Groups Projects
Commit 0ed9f981 authored by Jürgen Walter's avatar Jürgen Walter
Browse files

WIP added session as new element to request

parent 0c396507
No related branches found
No related tags found
No related merge requests found
......@@ -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;
......
......@@ -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
}
......
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;
}
}
......@@ -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);
}
}
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;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment