package com.neverwinterdp.kafka.tool; import java.io.File; import java.io.IOException; import org.tap4j.model.TestResult; import org.tap4j.model.TestSet; import org.tap4j.producer.TapProducer; import org.tap4j.producer.TapProducerFactory; import org.tap4j.util.StatusValues; import com.neverwinterdp.util.text.TabularFormater; public class KafkaTopicReport { private String topic ; private int numOfPartitions; private int numOfReplications; private int failureSimulation; private ProducerReport producerReport; private ConsumerReport consumerReport; public KafkaTopicReport() { producerReport = new ProducerReport(); consumerReport = new ConsumerReport(); } public String getTopic() { return topic; } public void setTopic(String topic) { this.topic = topic; } public int getNumOfPartitions() { return numOfPartitions; } public void setNumOfPartitions(int numOfPartitions) { this.numOfPartitions = numOfPartitions; } public int getNumOfReplications() { return numOfReplications; } public void setNumOfReplicas(int numOfReplications) { this.numOfReplications = numOfReplications; } public int getFailureSimulation() { return failureSimulation; } public void setFailureSimulation(int failureSimulation) { this.failureSimulation = failureSimulation; } public ProducerReport getProducerReport() { return producerReport; } public void setProducerReport(ProducerReport producerReport) { this.producerReport = producerReport; } public ConsumerReport getConsumerReport() { return consumerReport; } public void setConsumerReport(ConsumerReport consumerReport) { this.consumerReport = consumerReport; } public void report(Appendable out) throws IOException { report(out, this); } static public void report(Appendable out, KafkaTopicReport ... report) throws IOException { String[] header = { "Topic", "Replication", "Partitions", "F Sim", "Writer","W Duration", "W Rate", "W Total", "W Failed", "R Duration", "R Rate", "R Total" }; TabularFormater reportFormater = new TabularFormater(header); reportFormater.setTitle("Topic Report "); for(KafkaTopicReport sel : report) { long messageSentRate = 0 ; if(sel.producerReport.messageSent > 0) { messageSentRate = sel.producerReport.messageSent/(sel.producerReport.runDuration/1000); } long messageReadRate = 0; if(sel.consumerReport.messagesRead > 0) { messageReadRate = sel.consumerReport.messagesRead/(sel.consumerReport.runDuration/1000); } Object[] cells = { sel.topic, sel.numOfReplications, sel.numOfPartitions, sel.failureSimulation, sel.producerReport.writer, sel.producerReport.runDuration, messageSentRate, sel.producerReport.messageSent, sel.producerReport.messagesRetried, sel.consumerReport.runDuration, messageReadRate, sel.consumerReport.messagesRead, }; reportFormater.addRow(cells); } out.append("\n"); out.append(reportFormater.getFormatText()); } public void junitReport(String fileName) throws Exception { TestSet testSet = new TestSet(); int testNum = 0; testSet.addTestResult(newTestResult(++testNum, "Messages sent: "+ producerReport.messageSent, producerReport.messageSent > 0 )); testSet.addTestResult(newTestResult(++testNum, "Messages sent: "+ producerReport.messageSent + " --- Messages Consumed: " + consumerReport.messagesRead, consumerReport.messagesRead >= producerReport.messageSent )); testSet.addTestResult(newTestResult(++testNum, "Messages retried: "+ producerReport.messagesRetried, true )); testSet.addTestResult(newTestResult(++testNum, "Producer run duration: "+ producerReport.runDuration + " --- Consumer run duration: "+ consumerReport.runDuration, producerReport.runDuration > 0 && consumerReport.runDuration > 0 )); testSet.addTestResult(newTestResult(++testNum, "Producer Message Size: "+ producerReport.messageSize, producerReport.messageSize > 0 )); TapProducer tapProducer = TapProducerFactory.makeTapJunitProducer(fileName); tapProducer.dump(testSet, new File(fileName)); } private TestResult newTestResult(int testNum, String desc, boolean passed ) { TestResult tr = null; if(passed){ tr = new TestResult( StatusValues.OK, testNum ); } else { tr = new TestResult( StatusValues.NOT_OK, testNum ); } tr.setDescription(desc); return tr; } static public class ProducerReport { private String writer; private long runDuration; private int messageSent; private int messageSize; //bytes private long messagesRetried; // messages that needed to be retried public String getWriter() { return writer; } public void setWriter(String writer) { this.writer = writer; } public long getRunDuration() { return runDuration; } public void setRunDuration(long runDuration) { this.runDuration = runDuration; } public int getMessageSent() { return messageSent; } public void setMessageSent(int messageSent) { this.messageSent = messageSent; } public int getMessageSize() { return messageSize; } public void setMessageSize(int messageSize) { this.messageSize = messageSize; } public long getMessageRetried() { return messagesRetried; } public void setMessageRetried(long retried) { this.messagesRetried = retried; } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("ProducerReport [runDuration="); builder.append(runDuration); builder.append(", messageSent="); builder.append(messageSent); builder.append(", messageSize="); builder.append(messageSize); builder.append(", messagesRetried="); builder.append(messagesRetried); builder.append("]"); return builder.toString(); } } static public class ConsumerReport { private long runDuration; private int messagesRead; public long getRunDuration() { return runDuration; } public void setRunDuration(long runDuration) { this.runDuration = runDuration; } public int getMessagesRead() { return messagesRead; } public void setMessagesRead(int messagesRead) { this.messagesRead = messagesRead; } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("ConsumerReport ["); builder.append("runDuration=").append(runDuration).append(","); builder.append("messagesRead=").append(messagesRead); builder.append("]"); return builder.toString(); } } }