/** * Registers a given execution for the decorated vertex. * * @param execution * The execution to register */ public void registerExecution(final Execution execution) { final long responseTime = this.displayTimeunit.convert(execution.getTout() - execution.getTin(), this.executionTimeunit); this.responseTimeSum = this.responseTimeSum + responseTime; this.executionCount++; if (responseTime < this.minimalResponseTime) { this.minimalResponseTime = responseTime; } if (responseTime > this.maximalResponseTime) { this.maximalResponseTime = responseTime; } }
/** Order traces by tins */ @Override public int compare(final ExecutionTrace t1, final ExecutionTrace t2) { if (t1 == t2) { // NOPMD (no equals) return 0; } final long t1LowestTin = t1.getTraceAsSortedExecutionSet().first().getTin(); final long t2LowestTin = t2.getTraceAsSortedExecutionSet().first().getTin(); // Multiple traces may have an equal tin timestamp value. In order to provide an absolute ordering of the keys, we take the traceId as a second ordering // key. if (t1LowestTin != t2LowestTin) { return t1LowestTin < t2LowestTin ? -1 : 1; // NOCS } return t1.getTraceId() < t2.getTraceId() ? -1 : 1; // NOCS } });
@Override public void processMessage(final AbstractMessage message, final DependencyGraphNode<?> sourceNode, final DependencyGraphNode<?> targetNode, final TimeUnit timeunit) { // Ignore internal executions if (sourceNode.equals(targetNode)) { return; } final long responseTime = message.getReceivingExecution().getTout() - message.getReceivingExecution().getTin(); final int convertedResponseTime = (int) DISPLAY_TIMEUNIT.convert(responseTime, timeunit); if (convertedResponseTime > this.threshold) { targetNode.setColor(COLOR); } }
private SynchronousCallMessage createCallMessage(final Execution rootExecution, final Execution prevE, final Execution curE) throws InvalidTraceException { final SynchronousCallMessage message; if (prevE.equals(rootExecution)) { // initial execution callMessage message = new SynchronousCallMessage(curE.getTin(), rootExecution, curE); } else if ((prevE.getEss() + 1) == curE.getEss()) { // usual callMessage with senderComponentName and // receiverComponentName message = new SynchronousCallMessage(curE.getTin(), prevE, curE); } else if (prevE.getEss() < curE.getEss()) { // detect ess incrementation by > 1 final InvalidTraceException ex = new InvalidTraceException( "Ess are only allowed to increment by 1 --" + "but found sequence <" + prevE.getEss() + "," + curE.getEss() + ">" + "(Execution: " + curE + ")"); // don't log and throw // LOG.error("Found invalid trace:" + ex.getMessage()); // don't need the stack trace here throw ex; } else { final String errorMessage = "Unexpected trace: " + prevE + " and " + curE; throw new IllegalStateException(errorMessage); } return message; }
@Test public void testValidSyncTraceSimpleEntryCallCallExit() throws InvalidTraceException, IllegalStateException, AnalysisConfigurationException { // NOPMD // Create an EventRecordTrace, containing only Before- and AfterOperation events. final TraceEventRecords traceEvents = BookstoreEventRecordFactory.validSyncTraceSimpleEntryCallCallExit(this.exec0_0__bookstore_searchBook.getTin(), TestTraceEventRecords2ExecutionAndMessageTraceFilter.TRACE_ID, TestTraceEventRecords2ExecutionAndMessageTraceFilter.SESSION_ID, TestTraceEventRecords2ExecutionAndMessageTraceFilter.HOSTNAME); final ExecutionTrace expectedExecutionTrace = this.genValidSyncTraceSimpleEntryCallCallExit(); this.checkTrace(traceEvents, expectedExecutionTrace); }
@Test public void testValidSyncTraceSimpleCallCall() throws InvalidTraceException, IllegalStateException, AnalysisConfigurationException { // NOPMD // Create an EventRecordTrace, containing only CallOperation events. final TraceEventRecords traceEvents = BookstoreEventRecordFactory.validSyncTraceSimpleCallCall(this.exec0_0__bookstore_searchBook.getTin(), TestTraceEventRecords2ExecutionAndMessageTraceFilter.TRACE_ID, TestTraceEventRecords2ExecutionAndMessageTraceFilter.SESSION_ID, TestTraceEventRecords2ExecutionAndMessageTraceFilter.HOSTNAME); final ExecutionTrace expectedExecutionTrace = this.genValidSyncTraceSimpleCallCall(); this.checkTrace(traceEvents, expectedExecutionTrace); }
@Test public void testValidTraceWithBeforeAndAfterOperationEventsAndAdditionalCallEvents() throws InvalidTraceException, IllegalStateException, // NOPMD AnalysisConfigurationException { // Create an EventRecordTrace, containing only Before- and AfterOperation events. final TraceEventRecords traceEvents = BookstoreEventRecordFactory.validSyncTraceAdditionalCallEvents(this.exec0_0__bookstore_searchBook.getTin(), TestTraceEventRecords2ExecutionAndMessageTraceFilter.TRACE_ID, TestTraceEventRecords2ExecutionAndMessageTraceFilter.SESSION_ID, TestTraceEventRecords2ExecutionAndMessageTraceFilter.HOSTNAME); final ExecutionTrace expectedExecutionTrace = this.genValidBookstoreTrace(); this.checkTrace(traceEvents, expectedExecutionTrace); }
@Test public void testValidSyncTraceSimpleEntryCallExit() throws InvalidTraceException, IllegalStateException, AnalysisConfigurationException { // NOPMD // Create an EventRecordTrace, containing only Before- and AfterOperation events. final TraceEventRecords traceEvents = BookstoreEventRecordFactory.validSyncTraceSimpleEntryCallExit(this.exec0_0__bookstore_searchBook.getTin(), TestTraceEventRecords2ExecutionAndMessageTraceFilter.TRACE_ID, TestTraceEventRecords2ExecutionAndMessageTraceFilter.SESSION_ID, TestTraceEventRecords2ExecutionAndMessageTraceFilter.HOSTNAME); final ExecutionTrace expectedExecutionTrace = this.genValidBookstoreTraceEntryCallExit(); this.checkTrace(traceEvents, expectedExecutionTrace); }
@Test public void testValidSyncTraceSimpleEntryCallReturnCallCallExit() throws InvalidTraceException, IllegalStateException, AnalysisConfigurationException { // NOPMD // Create an EventRecordTrace, containing only Before- and AfterOperation events. final TraceEventRecords traceEvents = BookstoreEventRecordFactory.validSyncTraceSimpleEntryCallReturnCallCallExit(this.exec0_0__bookstore_searchBook.getTin(), TestTraceEventRecords2ExecutionAndMessageTraceFilter.TRACE_ID, TestTraceEventRecords2ExecutionAndMessageTraceFilter.SESSION_ID, TestTraceEventRecords2ExecutionAndMessageTraceFilter.HOSTNAME); final ExecutionTrace expectedExecutionTrace = this.genValidBookstoreTraceSimpleEntryCallReturnCallCallExit(); this.checkTrace(traceEvents, expectedExecutionTrace); }
/** * This method can be used to debug the {@link java.util.Comparator} provided by {@link ExecutionTrace#createExecutionTraceComparator()}. */ @Test public void testTreeSet() { final SortedSet<Execution> s0 = new TreeSet<>(ExecutionTrace.createExecutionTraceComparator()); final SortedSet<Execution> s1 = new TreeSet<>(ExecutionTrace.createExecutionTraceComparator()); final Execution execFromTrace0 = this.exec0_0__bookstore_searchBook; final Execution long1 = new Execution(execFromTrace0.getOperation(), execFromTrace0.getAllocationComponent(), execFromTrace0.getTraceId(), execFromTrace0.getSessionId(), execFromTrace0.getEoi(), execFromTrace0.getEss(), execFromTrace0.getTin(), execFromTrace0.getTout(), execFromTrace0.isAssumed()); s0.add(execFromTrace0); s1.add(long1); Assert.assertEquals("Expected sets to be equal", s0, s1); }
new ExecutionTrace(TestTraceEventRecords2ExecutionAndMessageTraceFilter.TRACE_ID, TestTraceEventRecords2ExecutionAndMessageTraceFilter.SESSION_ID); final long initialTimestamp = this.exec0_0__bookstore_searchBook.getTin();
TestTraceEventRecords2ExecutionAndMessageTraceFilter.SESSION_ID); final long initialTimestamp = this.exec0_0__bookstore_searchBook.getTin();
@Test public void testValidTraceWithBeforeAndAfterOperationEvents() throws InvalidTraceException, IllegalStateException, AnalysisConfigurationException { // NOPMD // Create an EventRecordTrace, containing only Before- and AfterOperation events. final TraceEventRecords traceEvents = BookstoreEventRecordFactory.validSyncTraceBeforeAfterEvents(this.exec0_0__bookstore_searchBook.getTin(), TestTraceEventRecords2ExecutionAndMessageTraceFilter.TRACE_ID, TestTraceEventRecords2ExecutionAndMessageTraceFilter.SESSION_ID, TestTraceEventRecords2ExecutionAndMessageTraceFilter.HOSTNAME); final ExecutionTrace expectedExecutionTrace; { // NOCS // Create an Execution Trace and add Executions in arbitrary order expectedExecutionTrace = new ExecutionTrace(TestTraceEventRecords2ExecutionAndMessageTraceFilter.TRACE_ID, TestTraceEventRecords2ExecutionAndMessageTraceFilter.SESSION_ID); expectedExecutionTrace.add(this.exec3_2__catalog_getBook_assumed); // assumed because no call event expectedExecutionTrace.add(this.exec2_1__crm_getOrders_assumed); // assumed because no call event expectedExecutionTrace.add(this.exec0_0__bookstore_searchBook); expectedExecutionTrace.add(this.exec1_1__catalog_getBook_assumed); // assumed because no call event // just to make sure that this trace is valid expectedExecutionTrace.toMessageTrace(SystemModelRepository.ROOT_EXECUTION); } this.checkTrace(traceEvents, expectedExecutionTrace); }
new ExecutionTrace(TestTraceEventRecords2ExecutionAndMessageTraceFilter.TRACE_ID, TestTraceEventRecords2ExecutionAndMessageTraceFilter.SESSION_ID); final long initialTimestamp = this.exec0_0__bookstore_searchBook.getTin();
@Test public void testValidTraceWithBeforeAndAfterOperationEventsAndAdditionalCallEventsAndGap() throws InvalidTraceException, IllegalStateException, // NOPMD AnalysisConfigurationException { // Create an EventRecordTrace, containing only Before- and AfterOperation events. final TraceEventRecords traceEvents = BookstoreEventRecordFactory.validSyncTraceAdditionalCallEventsGap(this.exec0_0__bookstore_searchBook.getTin(), TestTraceEventRecords2ExecutionAndMessageTraceFilter.TRACE_ID, TestTraceEventRecords2ExecutionAndMessageTraceFilter.SESSION_ID, TestTraceEventRecords2ExecutionAndMessageTraceFilter.HOSTNAME); final ExecutionTrace expectedExecutionTrace; { // NOCS expectedExecutionTrace = new ExecutionTrace(TestTraceEventRecords2ExecutionAndMessageTraceFilter.TRACE_ID, TestTraceEventRecords2ExecutionAndMessageTraceFilter.SESSION_ID); final long initialTimestamp = 1 * (1000 * 1000); // Manually create Executions for a trace expectedExecutionTrace.add(this.exec0_0__bookstore_searchBook); expectedExecutionTrace.add(this.exec1_1__catalog_getBook); expectedExecutionTrace.add( this.bookstoreExecutionFactory.createBookstoreExecution_exec2_1__crm_getOrders( TestTraceEventRecords2ExecutionAndMessageTraceFilter.TRACE_ID, TestTraceEventRecords2ExecutionAndMessageTraceFilter.SESSION_ID, TestTraceEventRecords2ExecutionAndMessageTraceFilter.HOSTNAME, // The assumed entry timestamp is the exit timestamp of the previous call initialTimestamp + BookstoreEventRecordFactory.TSTAMP_OFFSET_call2_1__crm_getOrders, // tin // We will only have a (before) call to CRM.getOrder(..), hence the assumed return timestamp is the return time of the wrapping // Bookstore.searchBook(..) execution: initialTimestamp + BookstoreEventRecordFactory.TSTAMP_OFFSET_exit0_0__bookstore_searchBook, // tout true)); // assumed, because call is missing expectedExecutionTrace.add(this.exec3_2__catalog_getBook); } this.checkTrace(traceEvents, expectedExecutionTrace); }
@Before public void setUp() throws Exception { final SystemModelRepository systemEntityFactory = new SystemModelRepository(new Configuration(), new AnalysisController()); this.eFactory = new ExecutionFactory(systemEntityFactory); int myNumExecutions = 0; // Manually create Executions for a trace myNumExecutions++; this.exec0_0__bookstore_searchBook = this.eFactory.genExecution("Bookstore", "bookstore", "searchBook", TestExecutionTraceBookstore.TRACE_ID, TestExecutionTraceBookstore.SESSION_ID, 1, 10, 0, 0); this.minTin = this.exec0_0__bookstore_searchBook.getTin(); this.maxTout = this.exec0_0__bookstore_searchBook.getTout(); myNumExecutions++; this.exec1_1__catalog_getBook = this.eFactory.genExecution("Catalog", "catalog", "getBook", TestExecutionTraceBookstore.TRACE_ID, TestExecutionTraceBookstore.SESSION_ID, 2, 4, 1, 1); myNumExecutions++; this.exec2_1__crm_getOrders = this.eFactory.genExecution("CRM", "crm", "getOrders", TestExecutionTraceBookstore.TRACE_ID, TestExecutionTraceBookstore.SESSION_ID, 5, 8, 2, 1); myNumExecutions++; this.exec3_2__catalog_getBook = this.eFactory.genExecution("Catalog", "catalog", "getBook", TestExecutionTraceBookstore.TRACE_ID, TestExecutionTraceBookstore.SESSION_ID, 6, 7, 3, 2); // Just some basic checks to make sure that the trace has been set up properly (we've had some trouble here) Assert.assertNotSame(this.exec3_2__catalog_getBook.getOperation(), this.exec2_1__crm_getOrders.getOperation()); Assert.assertNotSame(this.exec0_0__bookstore_searchBook.getAllocationComponent(), this.exec1_1__catalog_getBook.getAllocationComponent()); this.numExecutions = myNumExecutions; }
this.exec1_1__catalog_getBook.getTraceId() + 100, this.exec1_1__catalog_getBook.getSessionId() + "_", this.exec1_1__catalog_getBook.getEoi() + 100, this.exec1_1__catalog_getBook.getEss() + 100, this.exec1_1__catalog_getBook.getTin() + 100, this.exec1_1__catalog_getBook.getTout(), !this.exec1_1__catalog_getBook.isAssumed());
traceId, sessionId, opExec.getEoi(), opExec.getEss(), opExec.getTin(), opExec.getTout(), false); Assert.assertEquals("tin's differ", opExec.getTin(), exec.getTin()); Assert.assertEquals("tout's differ", opExec.getTout(), exec.getTout()); Assert.assertEquals("eoi's differ", opExec.getEoi(), exec.getEoi());