package rocks.inspectit.server.influx.util;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import java.util.concurrent.TimeUnit;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import rocks.inspectit.server.alerting.state.AlertingState;
import rocks.inspectit.server.influx.constants.Series;
import rocks.inspectit.server.influx.util.InfluxQueryFactory;
import rocks.inspectit.shared.all.exception.BusinessException;
import rocks.inspectit.shared.all.testbase.TestBase;
import rocks.inspectit.shared.cs.ci.AlertingDefinition;
import rocks.inspectit.shared.cs.ci.AlertingDefinition.ThresholdType;
import rocks.inspectit.shared.cs.communication.data.cmr.Alert;
/**
* Tests the {@link InfluxQueryFactory}.
*
* @author Alexander Wert
*
*/
@SuppressWarnings("PMD")
public class InfluxQueryFactoryTest extends TestBase {
/**
* Tests the {@link InfluxQueryFactory#buildTraceIdForAlertQuery(Alert, long)} method.
*
* @author Alexander Wert
*
*/
public static class BuildTraceIdForAlertQuery extends InfluxQueryFactoryTest {
AlertingDefinition alertingDefinition;
private static final long START_TIME = 12345678L;
private static final long STOP_TIME = 123456789L;
private static final String ALERT_DEF_NAME = "MyAlert";
private static final double THRESHOLD = 100.1;
@BeforeMethod
public void init() {
alertingDefinition = new AlertingDefinition();
alertingDefinition.setMeasurement(Series.BusinessTransaction.NAME);
alertingDefinition.setField(Series.BusinessTransaction.FIELD_DURATION);
alertingDefinition.setThreshold(THRESHOLD);
alertingDefinition.setName(ALERT_DEF_NAME);
}
@Test
public void queryForNotFinalized() {
String query = InfluxQueryFactory.buildTraceIdForAlertQuery(new Alert(alertingDefinition, START_TIME));
assertThat(query,
is("SELECT \"" + Series.BusinessTransaction.FIELD_TRACE_ID + "\" FROM \"" + Series.BusinessTransaction.NAME + "\" WHERE time >= " + START_TIME + "ms AND \"duration\" >= "
+ THRESHOLD));
}
@Test
public void queryForFinalized() {
String query = InfluxQueryFactory.buildTraceIdForAlertQuery(new Alert(alertingDefinition, START_TIME, STOP_TIME));
assertThat(query, is("SELECT \"" + Series.BusinessTransaction.FIELD_TRACE_ID + "\" FROM \"" + Series.BusinessTransaction.NAME + "\" WHERE time >= " + START_TIME + "ms AND time < "
+ STOP_TIME + "ms AND \"duration\" >= " + THRESHOLD));
}
@Test
public void queryWithTags() throws BusinessException {
String key1 = "keyOne";
String key2 = "keyTwo";
String value1 = "valueOne";
String value2 = "valueTwo";
alertingDefinition.putTag(key1, value1);
alertingDefinition.putTag(key2, value2);
String query = InfluxQueryFactory.buildTraceIdForAlertQuery(new Alert(alertingDefinition, START_TIME));
assertThat(query, containsString("SELECT \"" + Series.BusinessTransaction.FIELD_TRACE_ID + "\" FROM \"" + Series.BusinessTransaction.NAME + "\""));
assertThat(query, containsString("time >= " + START_TIME));
assertThat(query, not(containsString("time < " + STOP_TIME)));
assertThat(query, containsString("\"duration\" >= " + THRESHOLD));
assertThat(query, containsString("\"" + key1 + "\" = '" + value1 + "'"));
assertThat(query, containsString("\"" + key2 + "\" = '" + value2 + "'"));
}
@Test(expectedExceptions = { NullPointerException.class })
public void queryForInvalidAlertId() {
InfluxQueryFactory.buildTraceIdForAlertQuery(null);
}
}
/**
* Tests the
* {@link InfluxQueryFactory#buildThresholdCheckForAlertingStateQuery(rocks.inspectit.server.alerting.state.AlertingState, long)}
* method.
*
* @author Alexander Wert
*
*/
public static class BuildThresholdCheckForAlertingStateQuery extends InfluxQueryFactoryTest {
private static final String FIELD = "testField";
private static final String MEASUREMENT = "testMeasurement";
private static final String TAG_KEY = "tagKey";
private static final String TAG_VALUE = "tagVal";
private static final long TIMERANGE = 10;
private static final long CURRENT_TIME = System.currentTimeMillis();
private static final long LAST_CHECK_TIME = CURRENT_TIME - TIMERANGE;
AlertingDefinition alertingDefinition;
AlertingState alertingState;
@BeforeMethod
public void initAlertingState() throws BusinessException {
alertingDefinition = new AlertingDefinition();
alertingDefinition.setMeasurement(MEASUREMENT);
alertingDefinition.setField(FIELD);
alertingDefinition.putTag(TAG_KEY, TAG_VALUE);
alertingDefinition.setTimeRange(TIMERANGE, TimeUnit.MINUTES);
alertingState = new AlertingState(alertingDefinition);
alertingState.setLastCheckTime(LAST_CHECK_TIME);
}
@Test
public void buildQueryStringUpper() throws BusinessException, Exception {
alertingDefinition.setThresholdType(ThresholdType.UPPER_THRESHOLD);
String query = InfluxQueryFactory.buildThresholdCheckForAlertingStateQuery(alertingState, CURRENT_TIME);
assertThat(query, equalTo("SELECT MAX(\"" + FIELD + "\") FROM \"" + MEASUREMENT + "\" WHERE \"" + TAG_KEY + "\" = '" + TAG_VALUE + "' AND time <= " + CURRENT_TIME + "ms" + " AND time > "
+ (LAST_CHECK_TIME - alertingDefinition.getTimeRange(TimeUnit.MILLISECONDS)) + "ms"));
}
@Test
public void buildQueryStringLower() throws BusinessException, Exception {
alertingDefinition.setThresholdType(ThresholdType.LOWER_THRESHOLD);
String query = InfluxQueryFactory.buildThresholdCheckForAlertingStateQuery(alertingState, CURRENT_TIME);
assertThat(query, is("SELECT MIN(\"" + FIELD + "\") FROM \"" + MEASUREMENT + "\" WHERE \"" + TAG_KEY + "\" = '" + TAG_VALUE + "' AND time <= " + CURRENT_TIME + "ms" + " AND time > "
+ (LAST_CHECK_TIME - alertingDefinition.getTimeRange(TimeUnit.MILLISECONDS)) + "ms"));
}
@Test
public void buildQueryStringMultipleTags() throws BusinessException, Exception {
String tagKey2 = "tagKey2";
String tagValue2 = "tagVal2";
alertingDefinition.setThresholdType(ThresholdType.UPPER_THRESHOLD);
alertingDefinition.putTag(tagKey2, tagValue2);
String query = InfluxQueryFactory.buildThresholdCheckForAlertingStateQuery(alertingState, CURRENT_TIME);
assertThat(query, is("SELECT MAX(\"" + FIELD + "\") FROM \"" + MEASUREMENT + "\" WHERE \"" + TAG_KEY + "\" = '" + TAG_VALUE + "' AND \"" + tagKey2 + "\" = '" + tagValue2 + "' AND time <= "
+ CURRENT_TIME + "ms AND time > " + (LAST_CHECK_TIME - alertingDefinition.getTimeRange(TimeUnit.MILLISECONDS)) + "ms"));
}
}
}