3, // replicas //change back to 3!!!
"MasterSlave", true); // do rebalance
// enableHealthCheck(clusterName);
ClusterControllerManager controller =
new ClusterControllerManager(ZK_ADDR, clusterName, "controller_0");
controller.syncStart();
controller.stopTimerTasks();
String alertwildcard =
"EXP(decay(1.0)(localhost*.RestQueryStats@DBName=TestDB0.latency))CMP(GREATER)CON(10)";
_setupTool.getClusterManagementTool().addAlert(clusterName, alertwildcard);
// start participants
for (int i = 0; i < 5; i++) // !!!change back to 5
{
String instanceName = "localhost_" + (12944 + i);
participants[i] =
new MockParticipantManager(ZK_ADDR, clusterName, instanceName);
participants[i].setTransition(new SimpleAlertTransition(i * 5));
participants[i].syncStart();
}
boolean result =
ClusterStateVerifier.verifyByPolling(new ClusterStateVerifier.BestPossAndExtViewZkVerifier(
ZK_ADDR, clusterName));
Assert.assertTrue(result);
Thread.sleep(1000);
// HealthAggregationTask is supposed to run by a timer every 30s
// To make sure HealthAggregationTask is run, we invoke it explicitly for this test
new HealthStatsAggregator(controller).aggregate();
// sleep for a few seconds to give stats stage time to trigger
Thread.sleep(1000);
// other verifications go here
ZKHelixDataAccessor accessor =
new ZKHelixDataAccessor(clusterName, new ZkBaseDataAccessor<ZNRecord>(_gZkClient));
Builder keyBuilder = accessor.keyBuilder();
ZNRecord record = accessor.getProperty(keyBuilder.alertStatus()).getRecord();
Map<String, Map<String, String>> recMap = record.getMapFields();
for (int i = 0; i < 2; i++) {
String alertString = "(localhost_" + (12944 + i) + ".RestQueryStats@DBName=TestDB0.latency)";
Map<String, String> alertStatusMap = recMap.get(alertwildcard + " : " + alertString);
String val = alertStatusMap.get(AlertValueAndStatus.VALUE_NAME);
boolean fired = Boolean.parseBoolean(alertStatusMap.get(AlertValueAndStatus.FIRED_NAME));
Assert.assertEquals(Double.parseDouble(val), (double) i * 5 + 0.1);
Assert.assertFalse(fired);
}
for (int i = 2; i < 5; i++) {
String alertString = "(localhost_" + (12944 + i) + ".RestQueryStats@DBName=TestDB0.latency)";
Map<String, String> alertStatusMap = recMap.get(alertwildcard + " : " + alertString);
String val = alertStatusMap.get(AlertValueAndStatus.VALUE_NAME);
boolean fired = Boolean.parseBoolean(alertStatusMap.get(AlertValueAndStatus.FIRED_NAME));
Assert.assertEquals(Double.parseDouble(val), (double) i * 5 + 0.1);
Assert.assertTrue(fired);
}
ZNRecord alertHistory = accessor.getProperty(keyBuilder.alertHistory()).getRecord();
String deltakey = (String) (alertHistory.getMapFields().keySet().toArray()[0]);
Map<String, String> delta = alertHistory.getMapField(deltakey);
Assert.assertEquals(delta.size(), 3);
for (int i = 2; i < 5; i++) {
String alertString =
"(localhost_" + (12944 + i) + ".RestQueryStats@DBName#TestDB0.latency)GREATER(10)";
Assert.assertTrue(delta.get(alertString).equals("ON"));
}
// Drop and add another alert
_setupTool.getClusterManagementTool().dropAlert(clusterName, alertwildcard);
alertwildcard =
"EXP(decay(1.0)(localhost*.RestQueryStats@DBName=TestDB0.latency))CMP(GREATER)CON(15)";
_setupTool.getClusterManagementTool().addAlert(clusterName, alertwildcard);
new HealthStatsAggregator(controller).aggregate();
Thread.sleep(1000);
record = accessor.getProperty(keyBuilder.alertStatus()).getRecord();
recMap = record.getMapFields();
for (int i = 0; i < 3; i++) {
String alertString = "(localhost_" + (12944 + i) + ".RestQueryStats@DBName=TestDB0.latency)";
Map<String, String> alertStatusMap = recMap.get(alertwildcard + " : " + alertString);
String val = alertStatusMap.get(AlertValueAndStatus.VALUE_NAME);
boolean fired = Boolean.parseBoolean(alertStatusMap.get(AlertValueAndStatus.FIRED_NAME));
Assert.assertEquals(Double.parseDouble(val), (double) i * 5 + 0.1);
Assert.assertFalse(fired);
}
for (int i = 3; i < 5; i++) {
String alertString = "(localhost_" + (12944 + i) + ".RestQueryStats@DBName=TestDB0.latency)";
Map<String, String> alertStatusMap = recMap.get(alertwildcard + " : " + alertString);
String val = alertStatusMap.get(AlertValueAndStatus.VALUE_NAME);
boolean fired = Boolean.parseBoolean(alertStatusMap.get(AlertValueAndStatus.FIRED_NAME));
Assert.assertEquals(Double.parseDouble(val), (double) i * 5 + 0.1);
Assert.assertTrue(fired);
}
alertHistory = accessor.getProperty(keyBuilder.alertHistory()).getRecord();
deltakey = (String) (alertHistory.getMapFields().keySet().toArray()[1]);
delta = alertHistory.getMapField(deltakey);
Assert.assertTrue(delta.size() == 2);
for (int i = 3; i < 5; i++) {
String alertString =
"(localhost_" + (12944 + i) + ".RestQueryStats@DBName#TestDB0.latency)GREATER(15)";
Assert.assertTrue(delta.get(alertString).equals("ON"));
}
// clean up
controller.syncStop();
for (int i = 0; i < 5; i++) {
participants[i].syncStop();
}
System.out.println("END testSimpleWildcardAlert at " + new Date(System.currentTimeMillis()));
}