From 3527e59396d0c3fe1d2cdc5ddeee0c386fc9cd36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6ren=20Henning?= <stu114708@informatik.uni-kiel.de> Date: Mon, 30 May 2016 16:02:45 +0200 Subject: [PATCH] worked on dependency graph creation --- run-configurations/.eclipse-pmd | 4 ++ .../analysis/TraceAnalysisConfiguration.java | 18 ++--- .../dev/DotDependencyFileWriterStage.java | 19 ------ .../DotOperationsDependencyExportStage.java | 67 +++++++++++++++++++ ...OperationsDependencyGraphCreatorStage.java | 28 ++++---- 5 files changed, 95 insertions(+), 41 deletions(-) create mode 100644 run-configurations/.eclipse-pmd delete mode 100644 src/main/java/kieker/analysis/dev/DotDependencyFileWriterStage.java create mode 100644 src/main/java/kieker/analysis/dev/DotOperationsDependencyExportStage.java diff --git a/run-configurations/.eclipse-pmd b/run-configurations/.eclipse-pmd new file mode 100644 index 00000000..4a705f21 --- /dev/null +++ b/run-configurations/.eclipse-pmd @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<eclipse-pmd xmlns="http://acanda.ch/eclipse-pmd/0.8" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://acanda.ch/eclipse-pmd/0.8 http://acanda.ch/eclipse-pmd/eclipse-pmd-0.8.xsd"> + <analysis enabled="true" /> +</eclipse-pmd> \ No newline at end of file diff --git a/src/main/java/kieker/analysis/TraceAnalysisConfiguration.java b/src/main/java/kieker/analysis/TraceAnalysisConfiguration.java index fed83ac1..0efbcfd7 100644 --- a/src/main/java/kieker/analysis/TraceAnalysisConfiguration.java +++ b/src/main/java/kieker/analysis/TraceAnalysisConfiguration.java @@ -6,7 +6,7 @@ package kieker.analysis; import java.io.File; import kieker.analysis.dev.ComponentStatisticsDecoratorStage; -import kieker.analysis.dev.DotDependencyFileWriterStage; +import kieker.analysis.dev.DotOperationsDependencyExportStage; import kieker.analysis.dev.OperationsStatisticsDecoratorStage; import kieker.analysis.dev.SoftwareSystemCreatorStage; import kieker.analysis.dev.dependencygraphs.OperationsDependencyGraphCreatorStage; @@ -73,9 +73,10 @@ public class TraceAnalysisConfiguration extends Configuration { GraphMLFileWriterStage graphMLFileWriterComposite = new GraphMLFileWriterStage(graphFilesOutputDir); DotTraceGraphFileWriterStage dotTraceGraphFileWriterStage = new DotTraceGraphFileWriterStage(graphFilesOutputDir); - super.connectPorts(distributor.getNewOutputPort(), traceTraverserStage.getInputPort()); - super.connectPorts(traceTraverserStage.getOutputPort(), graphDistributor.getInputPort()); - super.connectPorts(graphDistributor.getNewOutputPort(), graphMLFileWriterComposite.getInputPort()); + // TODO Temp + // super.connectPorts(distributor.getNewOutputPort(), traceTraverserStage.getInputPort()); + // super.connectPorts(traceTraverserStage.getOutputPort(), graphDistributor.getInputPort()); + // super.connectPorts(graphDistributor.getNewOutputPort(), graphMLFileWriterComposite.getInputPort()); // super.connectPorts(graphDistributor.getNewOutputPort(), dotTraceGraphFileWriterStage.getInputPort()); final Distributor<AggregatedTrace> aggregatedTraceDistributor = new Distributor<>(new CopyByReferenceStrategy()); @@ -86,9 +87,10 @@ public class TraceAnalysisConfiguration extends Configuration { super.connectPorts(aggregation.getOutputPort(), aggregatedTraceDistributor.getInputPort()); - super.connectPorts(aggregatedTraceDistributor.getNewOutputPort(), aggrTraceTraverser.getInputPort()); - super.connectPorts(aggrTraceTraverser.getOutputPort(), graphDistributor2.getInputPort()); - super.connectPorts(graphDistributor2.getNewOutputPort(), graphMLFileWriterComposite2.getInputPort()); + // TODO Temp + // super.connectPorts(aggregatedTraceDistributor.getNewOutputPort(), aggrTraceTraverser.getInputPort()); + // super.connectPorts(aggrTraceTraverser.getOutputPort(), graphDistributor2.getInputPort()); + // super.connectPorts(graphDistributor2.getNewOutputPort(), graphMLFileWriterComposite2.getInputPort()); // super.connectPorts(graphDistributor2.getNewOutputPort(), dotTraceGraphFileWriterStage2.getInputPort()); SoftwareSystemCreatorStage softwareSystemCreator = new SoftwareSystemCreatorStage(); @@ -98,7 +100,7 @@ public class TraceAnalysisConfiguration extends Configuration { Distributor<SoftwareSystem> x2SoftwareSystemDistributor = new Distributor<>(new CopyByReferenceStrategy()); // TODO name required // ContainerStatisticsDecoratorStage containersStatisticsDecorator = new ContainerStatisticsDecoratorStage(); //TODO remove OperationsDependencyGraphCreatorStage operationsDependencyGraphCreator = new OperationsDependencyGraphCreatorStage(); // TODO temp - DotDependencyFileWriterStage dotDependencyExporter = new DotDependencyFileWriterStage(graphFilesOutputDir); + DotOperationsDependencyExportStage dotDependencyExporter = new DotOperationsDependencyExportStage(graphFilesOutputDir); super.connectPorts(aggregatedTraceDistributor.getNewOutputPort(), softwareSystemCreator.getInputPort()); super.connectPorts(softwareSystemCreator.getOutputPort(), operationsStatisticsDecorator.getInputPort()); diff --git a/src/main/java/kieker/analysis/dev/DotDependencyFileWriterStage.java b/src/main/java/kieker/analysis/dev/DotDependencyFileWriterStage.java deleted file mode 100644 index 46a0e78a..00000000 --- a/src/main/java/kieker/analysis/dev/DotDependencyFileWriterStage.java +++ /dev/null @@ -1,19 +0,0 @@ -package kieker.analysis.dev; - -import kieker.analysis.util.graph.export.dot.DotFileWriterStage; -import kieker.analysis.util.graph.util.dot.attributes.DotEdgeAttribute; -import kieker.analysis.util.graph.util.dot.attributes.DotNodeAttribute; - -public class DotDependencyFileWriterStage extends DotFileWriterStage { - - public DotDependencyFileWriterStage(final String outputDirectory) { - super(outputDirectory); - this.exportConfiguration.getDefaultNodeAttributes().put(DotNodeAttribute.SHAPE, (g -> "none")); - // Something like this would be good: - // this.exportConfiguration.addNodeAttribute(DotNodeAttribute.LABEL, new PropertyMapper("calls")); - this.exportConfiguration.addNodeAttribute(DotNodeAttribute.LABEL, (v -> v.toString())); - this.exportConfiguration.addEdgeAttribute(DotEdgeAttribute.LABEL, (e -> e.getProperty("calls").toString())); - // Styling - } - -} diff --git a/src/main/java/kieker/analysis/dev/DotOperationsDependencyExportStage.java b/src/main/java/kieker/analysis/dev/DotOperationsDependencyExportStage.java new file mode 100644 index 00000000..f9bb3ec5 --- /dev/null +++ b/src/main/java/kieker/analysis/dev/DotOperationsDependencyExportStage.java @@ -0,0 +1,67 @@ +package kieker.analysis.dev; + +import java.util.function.Function; + +import kieker.analysis.util.graph.Vertex; +import kieker.analysis.util.graph.export.dot.DotFileWriterStage; +import kieker.analysis.util.graph.util.dot.attributes.DotClusterAttribute; +import kieker.analysis.util.graph.util.dot.attributes.DotEdgeAttribute; +import kieker.analysis.util.graph.util.dot.attributes.DotGraphAttribute; +import kieker.analysis.util.graph.util.dot.attributes.DotNodeAttribute; + +public class DotOperationsDependencyExportStage extends DotFileWriterStage { + + public DotOperationsDependencyExportStage(final String outputDirectory) { + super(outputDirectory); + this.exportConfiguration.addGraphAttribute(DotGraphAttribute.RANKDIR, g -> "LR"); + this.exportConfiguration.addDefaultNodeAttribute(DotNodeAttribute.SHAPE, g -> "oval"); + this.exportConfiguration.addClusterAttribute(DotClusterAttribute.LABEL, new ClusterMapper()); + this.exportConfiguration.addNodeAttribute(DotNodeAttribute.LABEL, new OperationVertexMapper()); + this.exportConfiguration.addEdgeAttribute(DotEdgeAttribute.LABEL, (e -> e.getProperty("calls").toString())); + // Styling + // Something like this would be cool: + // this.exportConfiguration.addNodeAttribute(DotNodeAttribute.LABEL, new PropertyMapper("calls")); + } + + // TODO Consider if nested class is useful + + private class OperationVertexMapper implements Function<Vertex, String> { + + @Override + public String apply(final Vertex vertex) { + // TODO missing temporal unit + final StringBuilder statistics = new StringBuilder(); + statistics.append(vertex.getProperty("Name").toString()); + statistics.append("\\n min: "); + statistics.append(vertex.getProperty("MinDuration").toString()); + statistics.append("xs, max: "); + statistics.append(vertex.getProperty("MaxDuration").toString()); + statistics.append("xs, total: "); + statistics.append(vertex.getProperty("TotalDuration").toString()); + statistics.append("xs, \\n avg: "); + statistics.append(vertex.getProperty("MeanDuration").toString()); + statistics.append("xs, median: "); + statistics.append(vertex.getProperty("MedianDuration").toString()); + statistics.append("xs"); + return statistics.toString(); + } + + } + + private class ClusterMapper implements Function<Vertex, String> { + + @Override + public String apply(final Vertex vertex) { + switch (vertex.getProperty("Type").toString()) { + case "Container": + return "<<execution container>>\\n" + vertex.getProperty("Name").toString(); + case "Component": + return "<<deployment component>>\\n" + vertex.getProperty("Name").toString(); + default: + return null; + } + } + + } + +} diff --git a/src/main/java/kieker/analysis/dev/dependencygraphs/OperationsDependencyGraphCreatorStage.java b/src/main/java/kieker/analysis/dev/dependencygraphs/OperationsDependencyGraphCreatorStage.java index 62037555..f0de5f85 100644 --- a/src/main/java/kieker/analysis/dev/dependencygraphs/OperationsDependencyGraphCreatorStage.java +++ b/src/main/java/kieker/analysis/dev/dependencygraphs/OperationsDependencyGraphCreatorStage.java @@ -22,7 +22,8 @@ public class OperationsDependencyGraphCreatorStage extends AbstractTransformatio for (Container container : softwareSystem.getContainers()) { Vertex containerVertex = graph.addVertex(container.getIdentifier()); - containerVertex.setProperty("ContainerName", container.getName()); + containerVertex.setProperty("Name", container.getName()); + containerVertex.setProperty("Type", "Container"); containerVertex.setProperty("MaxDuration", container.getMaxDuration()); containerVertex.setProperty("MinDuration", container.getMinDuration()); containerVertex.setProperty("MeanDuration", container.getMeanDuration()); @@ -33,8 +34,8 @@ public class OperationsDependencyGraphCreatorStage extends AbstractTransformatio for (Component component : container.getComponents()) { Vertex componentVertex = componentGraph.addVertex(component.getIdentifier()); - componentVertex.setProperty("ComponentName", component.getName()); - componentVertex.setProperty("ContainerName", component.getContainer().getName()); + componentVertex.setProperty("Name", component.getName()); + componentVertex.setProperty("Type", "Component"); componentVertex.setProperty("MaxDuration", component.getMaxDuration()); componentVertex.setProperty("MinDuration", component.getMinDuration()); componentVertex.setProperty("MeanDuration", component.getMeanDuration()); @@ -45,9 +46,8 @@ public class OperationsDependencyGraphCreatorStage extends AbstractTransformatio for (Operation operation : component.getOperations()) { Vertex operationVertex = operationsGraph.addVertex(operation.getIdentifier()); - operationVertex.setProperty("OperationName", operation.getName()); - operationVertex.setProperty("ComponentName", operation.getComponent().getName()); - operationVertex.setProperty("ContainerName", operation.getComponent().getContainer().getName()); + operationVertex.setProperty("Name", operation.getName()); + operationVertex.setProperty("Type", "Operation"); operationVertex.setProperty("MaxDuration", operation.getMaxDuration()); operationVertex.setProperty("MinDuration", operation.getMinDuration()); operationVertex.setProperty("MeanDuration", operation.getMeanDuration()); @@ -60,29 +60,29 @@ public class OperationsDependencyGraphCreatorStage extends AbstractTransformatio /* * for (Dependency<Container> dependency : softwareSystem.getContainerDependencies()) { - * + * * String callerContainerIdentifier = dependency.getCaller().getIdentifier(); * String calleeContainerIdentifier = dependency.getCallee().getIdentifier(); - * + * * Vertex callerVertex = graph.getVertex(callerContainerIdentifier); * Vertex calleeVertex = graph.getVertex(calleeContainerIdentifier); - * + * * Edge dependencyEdge = graph.addEdge(null, callerVertex, calleeVertex); * dependencyEdge.setProperty("calls", dependency.getCalls()); * dependencyEdge.setProperty("failuredCalls", dependency.getFailuredCalls()); * } - * + * * for (Dependency<Component> dependency : softwareSystem.getComponentDependencies()) { - * + * * String callerContainerIdentifier = dependency.getCaller().getContainer().getIdentifier(); * String callerComponentIdentifier = dependency.getCaller().getIdentifier(); - * + * * String calleeContainerIdentifier = dependency.getCallee().getContainer().getIdentifier(); * String calleeComponentIdentifier = dependency.getCallee().getIdentifier(); - * + * * Vertex callerVertex = graph.getVertex(callerContainerIdentifier).getChildGraph().getVertex(callerComponentIdentifier); * Vertex calleeVertex = graph.getVertex(calleeContainerIdentifier).getChildGraph().getVertex(calleeComponentIdentifier); - * + * * Edge dependencyEdge = graph.addEdge(null, callerVertex, calleeVertex); * dependencyEdge.setProperty("calls", dependency.getCalls()); * dependencyEdge.setProperty("failuredCalls", dependency.getFailuredCalls()); -- GitLab