use of com.linkedin.kafka.cruisecontrol.monitor.sampling.aggregator.KafkaMetricSampleAggregator in project cruise-control by linkedin.
the class LoadMonitorTest method testClusterWithInvalidPartitions.
// Enough snapshot windows, some partitions are invalid in all snapshot windows.
@Test
public void testClusterWithInvalidPartitions() throws NotEnoughValidWindowsException {
TestContext context = prepareContext();
LoadMonitor loadMonitor = context.loadmonitor();
KafkaMetricSampleAggregator aggregator = context.aggregator();
ModelCompletenessRequirements requirements1 = new ModelCompletenessRequirements(1, 1.0, false);
ModelCompletenessRequirements requirements2 = new ModelCompletenessRequirements(1, 0.5, false);
ModelCompletenessRequirements requirements3 = new ModelCompletenessRequirements(2, 1.0, false);
ModelCompletenessRequirements requirements4 = new ModelCompletenessRequirements(2, 0.5, false);
// populate the metrics aggregator.
// two samples for each partition except T1P1
CruiseControlUnitTestUtils.populateSampleAggregator(3, 4, aggregator, PE_T0P0, 0, WINDOW_MS, METRIC_DEF);
CruiseControlUnitTestUtils.populateSampleAggregator(3, 4, aggregator, PE_T0P1, 0, WINDOW_MS, METRIC_DEF);
CruiseControlUnitTestUtils.populateSampleAggregator(3, 4, aggregator, PE_T1P0, 0, WINDOW_MS, METRIC_DEF);
try {
loadMonitor.clusterModel(-1, Long.MAX_VALUE, requirements1, new OperationProgress());
fail("Should have thrown NotEnoughValidWindowsException.");
} catch (NotEnoughValidWindowsException nevwe) {
// let it go
}
ClusterModel clusterModel = loadMonitor.clusterModel(-1L, Long.MAX_VALUE, requirements2, new OperationProgress());
assertNull(clusterModel.partition(T1P0));
assertNull(clusterModel.partition(T1P1));
assertEquals(2, clusterModel.partition(T0P0).leader().load().numWindows());
assertEquals(13, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.DISK), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.CPU), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.NW_IN), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.NW_OUT), 0.0);
try {
loadMonitor.clusterModel(-1L, Long.MAX_VALUE, requirements3, new OperationProgress());
fail("Should have thrown NotEnoughValidWindowsException.");
} catch (NotEnoughValidWindowsException nevwe) {
// let it go
}
clusterModel = loadMonitor.clusterModel(-1L, Long.MAX_VALUE, requirements4, new OperationProgress());
assertNull(clusterModel.partition(T1P0));
assertNull(clusterModel.partition(T1P1));
assertEquals(2, clusterModel.partition(T0P0).leader().load().numWindows());
assertEquals(13, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.DISK), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.CPU), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.NW_IN), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.NW_OUT), 0.0);
}
use of com.linkedin.kafka.cruisecontrol.monitor.sampling.aggregator.KafkaMetricSampleAggregator in project cruise-control by linkedin.
the class LoadMonitorTest method testStateWithInvalidSnapshotWindows.
@Test
public void testStateWithInvalidSnapshotWindows() {
TestContext context = prepareContext();
LoadMonitor loadMonitor = context.loadmonitor();
KafkaMetricSampleAggregator aggregator = context.aggregator();
// populate the metrics aggregator.
// four samples for each partition except T1P1. T1P1 has 2 samples in the first window, and 2 samples in the
// active window.
CruiseControlUnitTestUtils.populateSampleAggregator(3, 4, aggregator, PE_T0P0, 0, WINDOW_MS, METRIC_DEF);
CruiseControlUnitTestUtils.populateSampleAggregator(3, 4, aggregator, PE_T0P1, 0, WINDOW_MS, METRIC_DEF);
CruiseControlUnitTestUtils.populateSampleAggregator(3, 4, aggregator, PE_T1P0, 0, WINDOW_MS, METRIC_DEF);
CruiseControlUnitTestUtils.populateSampleAggregator(1, 2, aggregator, PE_T1P1, 0, WINDOW_MS, METRIC_DEF);
CruiseControlUnitTestUtils.populateSampleAggregator(1, 2, aggregator, PE_T1P1, 2, WINDOW_MS, METRIC_DEF);
LoadMonitorState state = loadMonitor.state(new OperationProgress());
// Both partitions for topic 0 should be valid.
assertEquals(2, state.numValidPartitions());
// Both topic should be valid in the first window.
assertEquals(1, state.numValidWindows());
// There should be 2 monitored windows.
assertEquals(2, state.monitoredWindows().size());
// Both topic should be valid in the first window.
assertEquals(1.0, state.monitoredWindows().get(WINDOW_MS), 0.0);
// Only topic 2 is valid in the second window.
assertEquals(0.5, state.monitoredWindows().get(WINDOW_MS * 2), 0.0);
// Back fill 3 samples for T1P1 in the second window.
CruiseControlUnitTestUtils.populateSampleAggregator(1, 3, aggregator, PE_T1P1, 1, WINDOW_MS, METRIC_DEF);
state = loadMonitor.state(new OperationProgress());
// All the partitions should be valid now.
assertEquals(4, state.numValidPartitions());
// All the windows should be valid now.
assertEquals(2, state.numValidWindows());
// There should be two monitored windows.
assertEquals(2, state.monitoredWindows().size());
// Both monitored windows should have 100% completeness.
assertEquals(1.0, state.monitoredWindows().get(WINDOW_MS), 0.0);
assertEquals(1.0, state.monitoredWindows().get(WINDOW_MS * 2), 0.0);
}
use of com.linkedin.kafka.cruisecontrol.monitor.sampling.aggregator.KafkaMetricSampleAggregator in project cruise-control by linkedin.
the class LoadMonitorTest method testBasicClusterModel.
// Test the case with enough snapshot windows and valid partitions.
@Test
public void testBasicClusterModel() throws NotEnoughValidWindowsException {
TestContext context = prepareContext();
LoadMonitor loadMonitor = context.loadmonitor();
KafkaMetricSampleAggregator aggregator = context.aggregator();
CruiseControlUnitTestUtils.populateSampleAggregator(3, 4, aggregator, PE_T0P0, 0, WINDOW_MS, METRIC_DEF);
CruiseControlUnitTestUtils.populateSampleAggregator(3, 4, aggregator, PE_T0P1, 0, WINDOW_MS, METRIC_DEF);
CruiseControlUnitTestUtils.populateSampleAggregator(3, 4, aggregator, PE_T1P0, 0, WINDOW_MS, METRIC_DEF);
CruiseControlUnitTestUtils.populateSampleAggregator(3, 4, aggregator, PE_T1P1, 0, WINDOW_MS, METRIC_DEF);
ClusterModel clusterModel = loadMonitor.clusterModel(-1, Long.MAX_VALUE, new ModelCompletenessRequirements(2, 1.0, false), new OperationProgress());
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.CPU), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.NW_IN), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.NW_OUT), 0.0);
assertEquals(13, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.DISK), 0.0);
}
use of com.linkedin.kafka.cruisecontrol.monitor.sampling.aggregator.KafkaMetricSampleAggregator in project cruise-control by linkedin.
the class LoadMonitorTest method testMeetCompletenessRequirements.
@Test
public void testMeetCompletenessRequirements() {
TestContext context = prepareContext();
LoadMonitor loadMonitor = context.loadmonitor();
KafkaMetricSampleAggregator aggregator = context.aggregator();
// Require at least 1 valid window with 1.0 of valid partitions ratio.
ModelCompletenessRequirements requirements1 = new ModelCompletenessRequirements(1, 1.0, false);
// Require at least 1 valid window with 0.5 of valid partitions ratio.
ModelCompletenessRequirements requirements2 = new ModelCompletenessRequirements(1, 0.5, false);
// Require at least 2 valid windows with 1.0 of valid partitions ratio.
ModelCompletenessRequirements requirements3 = new ModelCompletenessRequirements(2, 1.0, false);
// Require at least 2 valid windows with 0.5 of valid partitions ratio.
ModelCompletenessRequirements requirements4 = new ModelCompletenessRequirements(2, 0.5, false);
// populate the metrics aggregator.
// One stable window + one active window, enough samples for each partition except T1P1.
CruiseControlUnitTestUtils.populateSampleAggregator(2, 4, aggregator, PE_T0P0, 0, WINDOW_MS, METRIC_DEF);
CruiseControlUnitTestUtils.populateSampleAggregator(2, 4, aggregator, PE_T0P1, 0, WINDOW_MS, METRIC_DEF);
CruiseControlUnitTestUtils.populateSampleAggregator(2, 4, aggregator, PE_T1P0, 0, WINDOW_MS, METRIC_DEF);
// The load monitor has one window with 0.5 valid partitions ratio.
assertFalse(loadMonitor.meetCompletenessRequirements(requirements1));
assertTrue(loadMonitor.meetCompletenessRequirements(requirements2));
assertFalse(loadMonitor.meetCompletenessRequirements(requirements3));
assertFalse(loadMonitor.meetCompletenessRequirements(requirements4));
// Add more samples, two stable windows + one active window. enough samples for each partition except T1P1
CruiseControlUnitTestUtils.populateSampleAggregator(1, 4, aggregator, PE_T0P0, 2, WINDOW_MS, METRIC_DEF);
CruiseControlUnitTestUtils.populateSampleAggregator(1, 4, aggregator, PE_T0P1, 2, WINDOW_MS, METRIC_DEF);
CruiseControlUnitTestUtils.populateSampleAggregator(1, 4, aggregator, PE_T1P0, 2, WINDOW_MS, METRIC_DEF);
CruiseControlUnitTestUtils.populateSampleAggregator(1, 1, aggregator, PE_T1P1, 2, WINDOW_MS, METRIC_DEF);
// The load monitor has two windows, both with 0.5 valid partitions ratio
assertFalse(loadMonitor.meetCompletenessRequirements(requirements1));
assertTrue(loadMonitor.meetCompletenessRequirements(requirements2));
assertFalse(loadMonitor.meetCompletenessRequirements(requirements3));
assertTrue(loadMonitor.meetCompletenessRequirements(requirements4));
// Back fill the first stable window for T1P1
CruiseControlUnitTestUtils.populateSampleAggregator(1, 1, aggregator, PE_T1P1, 0, WINDOW_MS, METRIC_DEF);
// The load monitor has two windows with 1.0 and 0.5 of completeness respectively.
assertTrue(loadMonitor.meetCompletenessRequirements(requirements1));
assertTrue(loadMonitor.meetCompletenessRequirements(requirements2));
assertFalse(loadMonitor.meetCompletenessRequirements(requirements3));
assertTrue(loadMonitor.meetCompletenessRequirements(requirements4));
// Back fill all stable windows for T1P1
CruiseControlUnitTestUtils.populateSampleAggregator(1, 3, aggregator, PE_T1P1, 1, WINDOW_MS, METRIC_DEF);
// The load monitor has two windows both with 1.0 of completeness.
assertTrue(loadMonitor.meetCompletenessRequirements(requirements1));
assertTrue(loadMonitor.meetCompletenessRequirements(requirements2));
assertTrue(loadMonitor.meetCompletenessRequirements(requirements3));
assertTrue(loadMonitor.meetCompletenessRequirements(requirements4));
}
use of com.linkedin.kafka.cruisecontrol.monitor.sampling.aggregator.KafkaMetricSampleAggregator in project cruise-control by linkedin.
the class LoadMonitorTest method testClusterModelWithPartlyInvalidPartitions.
// Enough snapshot windows, some partitions are not available in some snapshot windows.
@Test
public void testClusterModelWithPartlyInvalidPartitions() throws NotEnoughValidWindowsException {
TestContext context = prepareContext();
LoadMonitor loadMonitor = context.loadmonitor();
KafkaMetricSampleAggregator aggregator = context.aggregator();
ModelCompletenessRequirements requirements1 = new ModelCompletenessRequirements(1, 1.0, false);
ModelCompletenessRequirements requirements2 = new ModelCompletenessRequirements(1, 0.5, false);
ModelCompletenessRequirements requirements3 = new ModelCompletenessRequirements(2, 1.0, false);
ModelCompletenessRequirements requirements4 = new ModelCompletenessRequirements(2, 0.5, false);
// populate the metrics aggregator.
// four samples for each partition except T1P1
CruiseControlUnitTestUtils.populateSampleAggregator(3, 4, aggregator, PE_T0P0, 0, WINDOW_MS, METRIC_DEF);
CruiseControlUnitTestUtils.populateSampleAggregator(3, 4, aggregator, PE_T0P1, 0, WINDOW_MS, METRIC_DEF);
CruiseControlUnitTestUtils.populateSampleAggregator(3, 4, aggregator, PE_T1P0, 0, WINDOW_MS, METRIC_DEF);
CruiseControlUnitTestUtils.populateSampleAggregator(1, 1, aggregator, PE_T1P1, 1, WINDOW_MS, METRIC_DEF);
ClusterModel clusterModel = loadMonitor.clusterModel(-1, Long.MAX_VALUE, requirements1, new OperationProgress());
for (TopicPartition tp : Arrays.asList(T0P0, T0P1, T1P0, T1P1)) {
assertNotNull(clusterModel.partition(tp));
}
assertEquals(1, clusterModel.partition(T0P0).leader().load().numWindows());
assertEquals(13, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.DISK), 0.0);
assertEquals(11.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.CPU), 0.0);
assertEquals(11.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.NW_IN), 0.0);
assertEquals(11.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.NW_OUT), 0.0);
assertEquals(10, clusterModel.partition(T1P1).leader().load().expectedUtilizationFor(Resource.DISK), 0.0);
assertEquals(10, clusterModel.partition(T1P1).leader().load().expectedUtilizationFor(Resource.CPU), 0.0);
assertEquals(10, clusterModel.partition(T1P1).leader().load().expectedUtilizationFor(Resource.NW_IN), 0.0);
assertEquals(10, clusterModel.partition(T1P1).leader().load().expectedUtilizationFor(Resource.NW_OUT), 0.0);
clusterModel = loadMonitor.clusterModel(-1L, Long.MAX_VALUE, requirements2, new OperationProgress());
assertNull(clusterModel.partition(T1P0));
assertNull(clusterModel.partition(T1P1));
assertEquals(2, clusterModel.partition(T0P0).leader().load().numWindows());
assertEquals(13, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.DISK), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.CPU), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.NW_IN), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.NW_OUT), 0.0);
try {
loadMonitor.clusterModel(-1L, Long.MAX_VALUE, requirements3, new OperationProgress());
fail("Should have thrown NotEnoughValidWindowsException.");
} catch (NotEnoughValidWindowsException nevwe) {
// let it go
}
clusterModel = loadMonitor.clusterModel(-1L, Long.MAX_VALUE, requirements4, new OperationProgress());
assertNull(clusterModel.partition(T1P0));
assertNull(clusterModel.partition(T1P1));
assertEquals(2, clusterModel.partition(T0P0).leader().load().numWindows());
assertEquals(13, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.DISK), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.CPU), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.NW_IN), 0.0);
assertEquals(6.5, clusterModel.partition(T0P0).leader().load().expectedUtilizationFor(Resource.NW_OUT), 0.0);
}
Aggregations