package com.linkedin.databus2.core.monitoring;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import junit.framework.Assert;
import org.apache.log4j.Logger;
import org.testng.annotations.Test;
import com.linkedin.databus.core.DbusEvent;
import com.linkedin.databus.core.DbusEventInternalReadable;
import com.linkedin.databus.core.DbusEventInternalWritable;
import com.linkedin.databus.core.InvalidEventException;
import com.linkedin.databus.core.data_model.PhysicalPartition;
import com.linkedin.databus.core.monitoring.StatsCollectorCallback;
import com.linkedin.databus.core.monitoring.mbean.DbusEventsStatisticsCollector;
import com.linkedin.databus.core.monitoring.mbean.DbusEventStatsCollectorsPartitioner;
import com.linkedin.databus.core.monitoring.mbean.DbusEventsTotalStats;
import com.linkedin.databus.core.monitoring.mbean.StatsCollectors;
import com.linkedin.databus.core.test.DbusEventCorrupter;
import com.linkedin.databus.core.test.DbusEventGenerator;
import com.linkedin.databus.core.util.RngUtils;
public class TestDbusEventStatsCollectorPartitioner
{
public static final String MODULE = TestDbusEventStatsCollectorPartitioner.class.getName();
private static final Logger LOG = Logger.getLogger(MODULE);
@Test
public void testStatsCollectorPartitionerSingleDb()
{
DbusEventStatsCollectorsPartitioner collector =
new DbusEventStatsCollectorsPartitioner(1, ":inbound", null);
TestStatsCollectorCallback callback = new TestStatsCollectorCallback();
collector.registerStatsCallback(callback);
// Add 2 collectors for DB1
PhysicalPartition p1 = new PhysicalPartition(1, "db1");
PhysicalPartition p2 = new PhysicalPartition(2, "db1");
DbusEventsStatisticsCollector c1 =
new DbusEventsStatisticsCollector(1, "db1:1", true, false, null);
DbusEventsStatisticsCollector c2 =
new DbusEventsStatisticsCollector(1, "db1:2", true, false, null);
collector.addStatsCollector(p1, c1);
collector.addStatsCollector(p2, c2);
StatsWriter w1 = new StatsWriter(c1);
StatsWriter w2 = new StatsWriter(c2);
w1.addEvents(2, 2, 100);
w2.addEvents(2, 2, 200);
StatsCollectors<DbusEventsStatisticsCollector> col =
collector.getDBStatsCollector("db1");
Assert.assertNotNull(col);
col.mergeStatsCollectors();
LOG.info("Merged Stats : " + col.getStatsCollector().getTotalStats());
LOG.info("C1 Stats : " + c1.getTotalStats());
LOG.info("C2 Stats : " + c2.getTotalStats());
DbusEventsTotalStats s = col.getStatsCollector().getTotalStats();
Assert.assertEquals("Total Events", 8, s.getNumDataEvents());
Assert.assertEquals("Sys Events", 4, s.getNumSysEvents());
Assert.assertEquals("Min Scn", 101, s.getMinScn());
Assert.assertEquals("Max Scn", 205, s.getMaxScn());
Assert.assertEquals("Num Stats Callback", 1, callback.getCollectorsAddedList().size());
collector.removeAllStatsCollector();
Assert.assertEquals("Num Stats Callback", 1, callback.getCollectorsRemovedList()
.size());
}
@Test
public void testStatsCollectorPartitionerMultipleDbs()
{
DbusEventStatsCollectorsPartitioner collector =
new DbusEventStatsCollectorsPartitioner(1, ":inbound", null);
TestStatsCollectorCallback callback = new TestStatsCollectorCallback();
collector.registerStatsCallback(callback);
// Add 2 collectors for DB1
PhysicalPartition p1 = new PhysicalPartition(1, "db1");
PhysicalPartition p2 = new PhysicalPartition(2, "db1");
DbusEventsStatisticsCollector c1 =
new DbusEventsStatisticsCollector(1, "db1:1", true, false, null);
DbusEventsStatisticsCollector c2 =
new DbusEventsStatisticsCollector(1, "db1:2", true, false, null);
collector.addStatsCollector(p1, c1);
collector.addStatsCollector(p2, c2);
// Add 2 collectors for DB2
PhysicalPartition p3 = new PhysicalPartition(1, "db2");
PhysicalPartition p4 = new PhysicalPartition(2, "db2");
DbusEventsStatisticsCollector c3 =
new DbusEventsStatisticsCollector(1, "db2:1", true, false, null);
DbusEventsStatisticsCollector c4 =
new DbusEventsStatisticsCollector(1, "db2:2", true, false, null);
collector.addStatsCollector(p3, c3);
collector.addStatsCollector(p4, c4);
// Add 2 collectors for DB3
PhysicalPartition p5 = new PhysicalPartition(3, "db3");
PhysicalPartition p6 = new PhysicalPartition(4, "db3");
DbusEventsStatisticsCollector c5 =
new DbusEventsStatisticsCollector(1, "db3:3", true, false, null);
DbusEventsStatisticsCollector c6 =
new DbusEventsStatisticsCollector(1, "db3:4", true, false, null);
collector.addStatsCollector(p5, c5);
collector.addStatsCollector(p6, c6);
StatsWriter w1 = new StatsWriter(c1);
StatsWriter w2 = new StatsWriter(c2);
StatsWriter w3 = new StatsWriter(c3);
StatsWriter w4 = new StatsWriter(c4);
StatsWriter w5 = new StatsWriter(c5);
StatsWriter w6 = new StatsWriter(c6);
w1.addEvents(2, 2, 100);
w2.addEvents(2, 2, 200);
w3.addEvents(3, 2, 300);
w4.addEvents(3, 2, 400);
w5.addEvents(4, 2, 500);
w6.addEvents(4, 2, 600);
// Verify DB1 collector
StatsCollectors<DbusEventsStatisticsCollector> col =
collector.getDBStatsCollector("db1");
Assert.assertNotNull(col);
col.mergeStatsCollectors();
LOG.info("Merged Stats : " + col.getStatsCollector().getTotalStats());
LOG.info("C1 Stats : " + c1.getTotalStats());
LOG.info("C2 Stats : " + c2.getTotalStats());
DbusEventsTotalStats s = col.getStatsCollector().getTotalStats();
Assert.assertEquals("Total Events", 8, s.getNumDataEvents());
Assert.assertEquals("Sys Events", 4, s.getNumSysEvents());
Assert.assertEquals("Min Scn", 101, s.getMinScn());
Assert.assertEquals("Max Scn", 205, s.getMaxScn());
// Verify DB2 collector
col = collector.getDBStatsCollector("db2");
Assert.assertNotNull(col);
col.mergeStatsCollectors();
LOG.info("Merged Stats : " + col.getStatsCollector().getTotalStats());
LOG.info("C3 Stats : " + c3.getTotalStats());
LOG.info("C4 Stats : " + c4.getTotalStats());
s = col.getStatsCollector().getTotalStats();
Assert.assertEquals("Total Events", 12, s.getNumDataEvents());
Assert.assertEquals("Sys Events", 4, s.getNumSysEvents());
Assert.assertEquals("Min Scn", 301, s.getMinScn());
Assert.assertEquals("Max Scn", 407, s.getMaxScn());
// Verify DB3 collector
col = collector.getDBStatsCollector("db3");
Assert.assertNotNull(col);
col.mergeStatsCollectors();
LOG.info("Merged Stats : " + col.getStatsCollector().getTotalStats());
LOG.info("C3 Stats : " + c5.getTotalStats());
LOG.info("C4 Stats : " + c6.getTotalStats());
s = col.getStatsCollector().getTotalStats();
Assert.assertEquals("Total Events", 16, s.getNumDataEvents());
Assert.assertEquals("Sys Events", 4, s.getNumSysEvents());
Assert.assertEquals("Min Scn", 501, s.getMinScn());
Assert.assertEquals("Max Scn", 609, s.getMaxScn());
Assert.assertEquals("Num Stats Callback", 3, callback.getCollectorsAddedList().size());
collector.removeAllStatsCollector();
Assert.assertEquals("Num Stats Callback", 3, callback.getCollectorsRemovedList()
.size());
}
public class TestStatsCollectorCallback implements
StatsCollectorCallback<StatsCollectors<DbusEventsStatisticsCollector>>
{
public final List<StatsCollectors<DbusEventsStatisticsCollector>> _collectorsAddedList;
public final List<StatsCollectors<DbusEventsStatisticsCollector>> _collectorsRemovedList;
public TestStatsCollectorCallback()
{
_collectorsAddedList =
new ArrayList<StatsCollectors<DbusEventsStatisticsCollector>>();
_collectorsRemovedList =
new ArrayList<StatsCollectors<DbusEventsStatisticsCollector>>();
}
@Override
public void addedStats(StatsCollectors<DbusEventsStatisticsCollector> stats)
{
_collectorsAddedList.add(stats);
}
@Override
public void removedStats(StatsCollectors<DbusEventsStatisticsCollector> stats)
{
_collectorsRemovedList.add(stats);
}
public void reset()
{
_collectorsAddedList.clear();
_collectorsRemovedList.clear();
}
public List<StatsCollectors<DbusEventsStatisticsCollector>> getCollectorsAddedList()
{
return _collectorsAddedList;
}
public List<StatsCollectors<DbusEventsStatisticsCollector>> getCollectorsRemovedList()
{
return _collectorsRemovedList;
}
}
private static class StatsWriter
{
private final DbusEventsStatisticsCollector _stats;
public StatsWriter(DbusEventsStatisticsCollector stats)
{
_stats = stats;
}
public DbusEventsStatisticsCollector getEventsStatsCollector()
{
return _stats;
}
public void addEvents(int eventsPerWindow, int numWindows, long beginScn)
{
long startScn = beginScn;
int numEvents = eventsPerWindow * numWindows;
Vector<DbusEvent> events = new Vector<DbusEvent>(numEvents);
long prevScn = startScn - 1;
int maxEventSize = 100;
int payloadSize = 5;
events.clear();
DbusEventGenerator eventGen = new DbusEventGenerator(startScn + 1);
long newScn =
eventGen.generateEvents(numEvents,
eventsPerWindow,
maxEventSize,
payloadSize,
true,
events);
DbusEventInternalWritable p = null;
for (DbusEvent e : events)
{
if (p != null && (p.sequence() != e.sequence()))
{
// control event for prev sequence;
p.setSrcId((short) -1);
_stats.registerDataEvent(p);
}
_stats.registerDataEvent((DbusEventInternalReadable) e);
try
{
p = DbusEventCorrupter.makeWritable(e); // for testing only!
}
catch (InvalidEventException iee)
{
throw new RuntimeException(iee);
}
}
// Add window boundary at the end
if (p != null)
{
p.setSrcId((short) -1);
_stats.registerDataEvent(p);
}
_stats.registerBufferMetrics(startScn + 1,
newScn,
prevScn,
RngUtils.randomPositiveInt());
startScn = newScn;
}
}
}