LOG.debug("Saving invocation. " + duration + " > " + minduration + " ID(local): " + rsc.getId()); invocationSequenceData.setDuration(duration); invocationSequenceData.setStart(startTime); invocationSequenceData.setEnd(endTime);
@Test private void currentGlobalContextRuleMustNotBeTheSequenceWithMaximumDuration() { long methodIdent = 108L; double baseline = 1000d; globalContextRule.baseline = baseline; Timestamp defDate = new Timestamp(new Date().getTime()); Random random = new Random(); long platformIdent = random.nextLong(); long sensorTypeIdent = random.nextLong(); List<InvocationSequenceData> nestedSequences = new ArrayList<>(); InvocationSequenceData firstChildSequence = new InvocationSequenceData(defDate, platformIdent, sensorTypeIdent, methodIdent); firstChildSequence.setDuration(200d); InvocationSequenceData higherDurationChild = new InvocationSequenceData(defDate, platformIdent, sensorTypeIdent, methodIdent); higherDurationChild.setDuration(3000d); InvocationSequenceData secondChildSequence = new InvocationSequenceData(defDate, platformIdent, sensorTypeIdent, methodIdent); secondChildSequence.setDuration(500d); nestedSequences.add(firstChildSequence); nestedSequences.add(higherDurationChild); nestedSequences.add(secondChildSequence); when(invocationSequenceRoot.getDuration()).thenReturn(HIGH_DURATION); when(invocationSequenceRoot.getNestedSequences()).thenReturn(nestedSequences); InvocationSequenceData currentGlobalContextRule = globalContextRule.action(); assertThat("The returned global context rule must not be the child with higher duration", currentGlobalContextRule, not(is(higherDurationChild))); }
@BeforeMethod private void init() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { InvocationSequenceData invocationSequenceData = new InvocationSequenceData(); invocationSequenceData.setDuration(5000d); diagnosisService = new DiagnosisService(problemOccurrenceConsumer, new ArrayList<String>() { private static final long serialVersionUID = 1L; { add("rocks.inspectit.server.diagnosis.service.rules.testrules"); } }, 2, 50L, 3); Field fieldEngine; fieldEngine = DiagnosisService.class.getDeclaredField("engine"); fieldEngine.setAccessible(true); fieldEngine.set(diagnosisService, engine); Field fieldDiagnosisServiceExecutor = DiagnosisService.class.getDeclaredField("diagnosisServiceExecutor"); fieldDiagnosisServiceExecutor.setAccessible(true); fieldDiagnosisServiceExecutor.set(diagnosisService, diagnosisServiceExecutor); }
@Test private void currentGlobalContextRuleMustBeTheRootSequenceWhenThereIsNotAnyHigherAndDominatingInvocation() { long methodIdent = 108L; double baseline = 1000d; globalContextRule.baseline = baseline; Timestamp defDate = new Timestamp(new Date().getTime()); Random random = new Random(); long platformIdent = random.nextLong(); long sensorTypeIdent = random.nextLong(); List<InvocationSequenceData> nestedSequences = new ArrayList<>(); InvocationSequenceData firstChildSequence = new InvocationSequenceData(defDate, platformIdent, sensorTypeIdent, methodIdent); firstChildSequence.setDuration(200d); InvocationSequenceData higherDurationChild = new InvocationSequenceData(defDate, platformIdent, sensorTypeIdent, methodIdent); higherDurationChild.setDuration(3000d); InvocationSequenceData secondChildSequence = new InvocationSequenceData(defDate, platformIdent, sensorTypeIdent, methodIdent); secondChildSequence.setDuration(500d); nestedSequences.add(firstChildSequence); nestedSequences.add(higherDurationChild); nestedSequences.add(secondChildSequence); when(invocationSequenceRoot.getDuration()).thenReturn(HIGH_DURATION); when(invocationSequenceRoot.getNestedSequences()).thenReturn(nestedSequences); InvocationSequenceData currentGlobalContextRule = globalContextRule.action(); assertThat("The returned global context rule must be the invocationSequenceRoot", currentGlobalContextRule, is(invocationSequenceRoot)); } }
@Test public void initFailureWithRulesInPackageWithMultipleActionTag() { diagnosisService = new DiagnosisService(problemOccurrenceConsumer, new ArrayList<String>() { private static final long serialVersionUID = 1L; { add("rocks.inspectit.server.diagnosis.engine.testrules"); } }, 2, 50L, 2); InvocationSequenceData invocationSequenceData = new InvocationSequenceData(); invocationSequenceData.setDuration(5000d); assertThat(diagnosisService.init(), is(false)); }
@Test(expectedExceptions = IllegalArgumentException.class) public void initFailureWithNegativeNumberOfSessionWorkers() { diagnosisService = new DiagnosisService(problemOccurrenceConsumer, new ArrayList<String>() { private static final long serialVersionUID = 1L; { add("rocks.inspectit.server.diagnosis.service.rules.testrules"); } }, -2, 50L, 2); InvocationSequenceData invocationSequenceData = new InvocationSequenceData(); invocationSequenceData.setDuration(5000d); assertThat(diagnosisService.init(), is(false)); }
@Test public void initFailureWithoutRules() { diagnosisService = new DiagnosisService(problemOccurrenceConsumer, new ArrayList<String>() { private static final long serialVersionUID = 1L; { add("rocks.inspectit.shared.all"); } }, 2, 50L, 2); InvocationSequenceData invocationSequenceData = new InvocationSequenceData(); invocationSequenceData.setDuration(5000d); assertThat(diagnosisService.init(), is(false)); }
@Test public void canBeDiagnosed() { double baseline = 1000; diagnosisService = new DiagnosisService(problemOccurrenceConsumer, new ArrayList<String>() { private static final long serialVersionUID = 1L; { add("rocks.inspectit.server.diagnosis.service.rules.testrules"); } }, 2, 50L, 2); InvocationSequenceData invocationSequenceData = new InvocationSequenceData(); invocationSequenceData.setDuration(5000d); boolean canBeDiagnosed = diagnosisService.diagnose(invocationSequenceData, baseline); assertThat(canBeDiagnosed, equalTo(true)); }
@Test public void runDiagnosis() throws DiagnosisEngineException { double baseline = 1000; InvocationSequenceData invocationSequenceData = new InvocationSequenceData(); invocationSequenceData.setDuration(5000d); verify(engine, times(0)).analyze(invocationSequenceData, Collections.singletonMap(RuleConstants.DIAGNOSIS_VAR_BASELINE, baseline)); verify(diagnosisServiceExecutor, times(0)).execute(diagnosisService); diagnosisService.diagnose(invocationSequenceData, baseline); diagnosisService.diagnose(invocationSequenceData, baseline); diagnosisService.diagnose(invocationSequenceData, baseline); diagnosisService.run(); diagnosisService.run(); diagnosisService.run(); verify(engine, times(3)).analyze(invocationSequenceData, Collections.singletonMap(RuleConstants.DIAGNOSIS_VAR_BASELINE, baseline)); verify(diagnosisServiceExecutor, times(3)).execute(diagnosisService); }
@Test public void dataIsProcessedWhenAllTheConditionsAreFulfilled() { InvocationSequenceData invocationSequenceRoot = new InvocationSequenceData(); invocationSequenceRoot.setId(1); invocationSequenceRoot.setDuration(1500d); cmrProcessor.setBaseline(1000); cmrProcessor.setDiagnosisEnabled(true); cmrProcessor.setInfluxActive(true); boolean canBeProcessed = cmrProcessor.canBeProcessed(invocationSequenceRoot); assertThat("Data must be processed when all the conditions are fulfilled. ", canBeProcessed, is(true)); } }
@Test(expectedExceptions = IllegalArgumentException.class) public void cannotBeDiagnosedWithBaselineNegative() { diagnosisService = new DiagnosisService(problemOccurrenceConsumer, new ArrayList<String>() { private static final long serialVersionUID = 1L; { add("rocks.inspectit.server.diagnosis.service.rules.testrules"); } }, 2, 50L, 2); InvocationSequenceData invocationSequenceData = new InvocationSequenceData(); invocationSequenceData.setDuration(5000d); diagnosisService.diagnose(invocationSequenceData, -1); }
@Test public void dataIsNotProcessedWhenTheTimeLowerThanTheBaseline() { InvocationSequenceData invocationSequenceRoot = new InvocationSequenceData(); invocationSequenceRoot.setId(1); invocationSequenceRoot.setDuration(500d); cmrProcessor.setBaseline(1000); cmrProcessor.setDiagnosisEnabled(true); cmrProcessor.setInfluxActive(true); boolean canBeProcessed = cmrProcessor.canBeProcessed(invocationSequenceRoot); assertThat("Data cannot be processed when time is lower than the set in the baseline.", canBeProcessed, is(false)); }
List<InvocationSequenceData> nestedSequences = new ArrayList<>(); InvocationSequenceData firstChildSequence = new InvocationSequenceData(defDate, platformIdent, sensorTypeIdent, methodIdent); firstChildSequence.setDuration(200d); TimerData firstChildTimerData = new TimerData(new Timestamp(System.currentTimeMillis()), 10L, 20L, 30L); firstChildTimerData.calculateExclusiveMin(200d); higherDurationChild.setDuration(4000d); TimerData higherDurationChildTimerData = new TimerData(new Timestamp(System.currentTimeMillis()), 10L, 20L, 30L); higherDurationChildTimerData.calculateExclusiveMin(4000d); secondChildSequence.setDuration(500d); TimerData secondChildSequenceTimerData = new TimerData(new Timestamp(System.currentTimeMillis()), 10L, 20L, 30L); secondChildSequenceTimerData.calculateExclusiveMin(500d);
/** * Builds an invocation sequence data tree. * */ @BeforeMethod public void init() { List<InvocationSequenceData> nestedSequences1 = new ArrayList<>(); List<InvocationSequenceData> nestedSequences2 = new ArrayList<>(); rootInvocationSequence = new InvocationSequenceData(); rootInvocationSequence.setNestedSequences(nestedSequences1); firstChildSequence = new InvocationSequenceData(DEF_DATE, PLATFORM_IDENT, SENSOR_TYPE_IDENT, 1L); firstChildSequence.setDuration(200d); firstChildSequence.setParentSequence(rootInvocationSequence); secondChildSequence = new InvocationSequenceData(DEF_DATE, PLATFORM_IDENT, SENSOR_TYPE_IDENT, 2L); secondChildSequence.setDuration(4000d); secondChildSequence.setParentSequence(rootInvocationSequence); thirdChildSequence = new InvocationSequenceData(DEF_DATE, PLATFORM_IDENT, SENSOR_TYPE_IDENT, 3L); thirdChildSequence.setDuration(500d); thirdChildSequence.setParentSequence(secondChildSequence); fourthChildSequence = new InvocationSequenceData(DEF_DATE, PLATFORM_IDENT, SENSOR_TYPE_IDENT, 4L); fourthChildSequence.setDuration(500d); fourthChildSequence.setParentSequence(rootInvocationSequence); nestedSequences1.add(firstChildSequence); nestedSequences1.add(secondChildSequence); nestedSequences1.add(fourthChildSequence); nestedSequences2.add(thirdChildSequence); rootInvocationSequence = new InvocationSequenceData(); rootInvocationSequence.setNestedSequences(nestedSequences1); secondChildSequence.setNestedSequences(nestedSequences2); }
Random random = new Random(); InvocationSequenceData invData = new InvocationSequenceData(new Timestamp(random.nextLong()), random.nextLong(), random.nextLong(), random.nextLong()); invData.setDuration(random.nextDouble()); invData.setId(random.nextLong()); invData.setEnd(random.nextDouble());
timerDataSeachDB.setExclusiveDuration(2000d); parentSequence.setTimerData(timerDataSeachDB); parentSequence.setDuration(2000d); InvocationSequenceData firstSequence = new InvocationSequenceData(defDate, platformIdent, sensorTypeIdent, 10L); TimerData timerDataFirstSequence = new TimerData(new Timestamp(System.currentTimeMillis()), 10L, 20L, 30L); timerDataFirstSequence.calculateExclusiveMin(1d); firstSequence.setTimerData(timerDataFirstSequence); firstSequence.setDuration(100d); InvocationSequenceData significantCluster = new InvocationSequenceData(defDate, platformIdent, sensorTypeIdent, 10L); TimerData timerDataSignificantCluster = new TimerData(new Timestamp(System.currentTimeMillis()), 10L, 20L, 30L); timerDataSignificantCluster.calculateExclusiveMin(1d); significantCluster.setTimerData(timerDataSignificantCluster); significantCluster.setDuration(1700d); InvocationSequenceData secondSequence = new InvocationSequenceData(defDate, platformIdent, sensorTypeIdent, 10L); TimerData timerDataSecondSequence = new TimerData(new Timestamp(System.currentTimeMillis()), 10L, 20L, 30L); timerDataSecondSequence.calculateExclusiveMin(1d); secondSequence.setTimerData(timerDataSecondSequence); secondSequence.setDuration(200d); parentSequence.getNestedSequences().add(firstSequence); parentSequence.getNestedSequences().add(significantCluster);
timerDataCurrentProblemContext.calculateExclusiveMin(1d); currentProblemContext.setTimerData(timerDataCurrentProblemContext); currentProblemContext.setDuration(2500d); InvocationSequenceData firstMethod = new InvocationSequenceData(DEF_DATE, PLATFORM_IDENT, SENSOR_TYPE_IDENT, METHOD_IDENT_EQUAL); TimerData timerDataFirstMethod = new TimerData(new Timestamp(System.currentTimeMillis()), 10L, 20L, 30L); timerDataFirstMethod.calculateExclusiveMin(1d); firstMethod.setTimerData(timerDataFirstMethod); firstMethod.setDuration(1200d); InvocationSequenceData secondMethod = new InvocationSequenceData(DEF_DATE, PLATFORM_IDENT, SENSOR_TYPE_IDENT, METHOD_IDENT_EQUAL); TimerData timerDataSecondMethod = new TimerData(new Timestamp(System.currentTimeMillis()), 10L, 20L, 30L); timerDataSecondMethod.calculateExclusiveMin(1d); secondMethod.setTimerData(timerDataSecondMethod); secondMethod.setDuration(800d); InvocationSequenceData thirdMethod = new InvocationSequenceData(DEF_DATE, PLATFORM_IDENT, SENSOR_TYPE_IDENT, METHOD_IDENT_EQUAL); TimerData timerDataThirdMethod = new TimerData(new Timestamp(System.currentTimeMillis()), 10L, 20L, 30L); timerDataThirdMethod.calculateExclusiveMin(1d); thirdMethod.setTimerData(timerDataThirdMethod); thirdMethod.setDuration(500d); currentProblemContext.getNestedSequences().add(firstMethod); currentProblemContext.getNestedSequences().add(secondMethod);
timerDataGlobalContext.setExclusiveDuration(5200d); rootInvocation.setTimerData(timerDataGlobalContext); rootInvocation.setDuration(5200d); InvocationSequenceData firstSequence = new InvocationSequenceData(defDate, platformIdent, sensorTypeIdent, 5L); TimerData timerDataFirstSequence = new TimerData(new Timestamp(System.currentTimeMillis()), 10L, 20L, 30L); timerDataFirstSequence.setExclusiveDuration(5200d); firstSequence.setTimerData(timerDataFirstSequence); firstSequence.setDuration(5200d); InvocationSequenceData expectedProblemContext = new InvocationSequenceData(defDate, platformIdent, sensorTypeIdent, 9L); TimerData timerDataExpectedProblemContext = new TimerData(new Timestamp(System.currentTimeMillis()), 10L, 20L, 30L); timerDataExpectedProblemContext.setExclusiveDuration(5000d); expectedProblemContext.setTimerData(timerDataExpectedProblemContext); expectedProblemContext.setDuration(5000d); InvocationSequenceData firstChildSeq = new InvocationSequenceData(defDate, platformIdent, sensorTypeIdent, 10L); TimerData timerDataFirstChildSeq = new TimerData(new Timestamp(System.currentTimeMillis()), 10L, 20L, 30L); timerDataFirstChildSeq.calculateExclusiveMin(1d); firstChildSeq.setTimerData(timerDataFirstChildSeq); firstChildSeq.setDuration(2400d); InvocationSequenceData secondChildSeq = new InvocationSequenceData(defDate, platformIdent, sensorTypeIdent, 10L); TimerData timerDataSecondChildSeq = new TimerData(new Timestamp(System.currentTimeMillis()), 10L, 20L, 30L); timerDataSecondChildSeq.calculateExclusiveMin(1d); secondChildSeq.setTimerData(timerDataSecondChildSeq); secondChildSeq.setDuration(1400d); InvocationSequenceData thirdChildSeq = new InvocationSequenceData(defDate, platformIdent, sensorTypeIdent, 10L); TimerData timerDataThirdChildSeq = new TimerData(new Timestamp(System.currentTimeMillis()), 10L, 20L, 30L);
invocationSequenceRoot = new InvocationSequenceData(); invocationSequenceRoot.setId(FIRST_ID); invocationSequenceRoot.setDuration(ROOT_DURATION); firstChildSequence = new InvocationSequenceData(DEF_DATE, 10, 10, METHOD_IDENT); firstChildSequence.setDuration(FIRST_DURATION); firstChildSequence.setId(SECOND_ID); secondChildSequence = new InvocationSequenceData(DEF_DATE, 20, 20, METHOD_IDENT); secondChildSequence.setDuration(SECOND_DURATION); secondChildSequence.setId(THIRD_ID); timerData.setTimeStamp(new Timestamp(TIMESTAMP_VALUE)); secondChildSequence.setTimerData(timerData); thirdChildSequence = new InvocationSequenceData(DEF_DATE, 30, 30, METHOD_IDENT); thirdChildSequence.setDuration(THIRD_DURATION); thirdChildSequence.setId(FOURTH_ID); invocationSequenceRoot.getNestedSequences().add(firstChildSequence);
/** * Clones invocation sequence. This method returns new object exactly same as the original * object, but with out nested sequences set. * * @return Cloned invocation sequence. */ public InvocationSequenceData getClonedInvocationSequence() { InvocationSequenceData clone = new InvocationSequenceData(this.getTimeStamp(), this.getPlatformIdent(), this.getSensorTypeIdent(), this.getMethodIdent()); clone.setId(this.getId()); clone.setSpanIdent(this.getSpanIdent()); clone.setChildCount(this.getChildCount()); clone.setDuration(this.getDuration()); clone.setEnd(this.getEnd()); clone.setNestedSequences(Collections.<InvocationSequenceData> emptyList()); clone.setParameterContentData(this.getParameterContentData()); clone.setParentSequence(this.getParentSequence()); clone.setPosition(this.getPosition()); clone.setSqlStatementData(this.getSqlStatementData()); clone.setTimerData(this.getTimerData()); clone.setExceptionSensorDataObjects(this.getExceptionSensorDataObjects()); clone.setStart(this.getStart()); clone.setNestedSqlStatements(this.isNestedSqlStatements()); clone.setNestedExceptions(this.isNestedExceptions()); clone.setLoggingData(this.getLoggingData()); clone.setApplicationId(this.getApplicationId()); clone.setBusinessTransactionId(this.getBusinessTransactionId()); return clone; }