Author: mreutegg
Date: Mon Sep 5 13:20:35 2016
New Revision: 1759264
URL: http://svn.apache.org/viewvc?rev=1759264&view=rev
Log:
OAK-4750: Leaderboard in ConsolidatedListenerMBean
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ConsolidatedListenerMBeanImpl.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/jmx/ConsolidatedListenerMBean.java
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ConsolidatedListenerMBeanImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ConsolidatedListenerMBeanImpl.java?rev=1759264&r1=1759263&r2=1759264&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ConsolidatedListenerMBeanImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ConsolidatedListenerMBeanImpl.java
Mon Sep 5 13:20:35 2016
@@ -21,11 +21,14 @@ package org.apache.jackrabbit.oak.jcr.ob
import java.util.Arrays;
import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import javax.management.ObjectName;
+import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.openmbean.CompositeType;
import javax.management.openmbean.OpenDataException;
@@ -38,6 +41,8 @@ import javax.management.openmbean.Tabula
import com.google.common.base.Objects;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+import com.google.common.primitives.Longs;
+
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
@@ -53,6 +58,7 @@ import org.apache.jackrabbit.oak.spi.com
import org.apache.jackrabbit.oak.spi.commit.Observer;
import org.apache.jackrabbit.oak.spi.whiteboard.Registration;
import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
+import org.apache.jackrabbit.stats.TimeSeriesStatsUtil;
import org.osgi.framework.BundleContext;
import static com.google.common.base.Preconditions.checkNotNull;
@@ -129,6 +135,28 @@ public class ConsolidatedListenerMBeanIm
}
@Override
+ public TabularData getLeaderBoard() {
+ TabularDataSupport tds;
+ try {
+ int id = 0;
+ TabularType tt = new TabularType(LeaderBoardData.class.getName(),
+ "Leaderboard", LeaderBoardData.TYPE, new
String[]{"index"});
+ tds = new TabularDataSupport(tt);
+ List<LeaderBoardData> leaderBoard = Lists.newArrayList();
+ for (EventListenerMBean mbean : eventListeners.values()) {
+ leaderBoard.add(new LeaderBoardData(++id, mbean));
+ }
+ sort(leaderBoard);
+ for (LeaderBoardData data : leaderBoard) {
+ tds.put(data.toCompositeData());
+ }
+ } catch (OpenDataException e) {
+ throw new IllegalStateException(e);
+ }
+ return tds;
+ }
+
+ @Override
public int getObserversCount() {
return observerCount.get();
}
@@ -423,4 +451,114 @@ public class ConsolidatedListenerMBeanIm
}
}
}
+
+ private static class LeaderBoardData {
+ static final String[] FIELD_NAMES = new String[] {
+ "index",
+ "className",
+ "processingTime",
+ "delivered",
+ "eventConsumerTimeRatio",
+ };
+
+ static final String[] FIELD_DESCRIPTIONS = FIELD_NAMES;
+
+ @SuppressWarnings("rawtypes")
+ static final OpenType[] FIELD_TYPES = new OpenType[]{
+ SimpleType.INTEGER,
+ SimpleType.STRING,
+ SimpleType.LONG,
+ SimpleType.LONG,
+ SimpleType.DOUBLE,
+ };
+
+ static final CompositeType TYPE = createCompositeType();
+
+ static CompositeType createCompositeType() {
+ try {
+ return new CompositeType(
+ LeaderBoardData.class.getName(),
+ "Composite data type for Listener Leaderboard",
+ LeaderBoardData.FIELD_NAMES,
+ LeaderBoardData.FIELD_DESCRIPTIONS,
+ LeaderBoardData.FIELD_TYPES);
+ } catch (OpenDataException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ private final EventListenerMBean mbean;
+ private final CompositeData producerTime;
+ private final CompositeData consumerTime;
+ private final int index;
+
+ public LeaderBoardData(int i, EventListenerMBean mbean) {
+ this(i, mbean, mbean.getEventProducerTime(),
mbean.getEventConsumerTime());
+ }
+
+ private LeaderBoardData(int i, EventListenerMBean mbean,
+ CompositeData producerTime,
+ CompositeData consumerTime) {
+ this.index = i;
+ this.mbean = mbean;
+ this.producerTime = producerTime;
+ this.consumerTime = consumerTime;
+ }
+
+ LeaderBoardData withIndex(int i) {
+ return new LeaderBoardData(i, mbean, producerTime, consumerTime);
+ }
+
+ CompositeDataSupport toCompositeData() {
+ Object[] values = new Object[]{
+ index,
+ mbean.getClassName(),
+ getProcessingTime(),
+ mbean.getEventsDelivered(),
+ mbean.getEventConsumerTimeRatio(),
+ };
+ try {
+ return new CompositeDataSupport(TYPE, FIELD_NAMES, values);
+ } catch (OpenDataException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ long getProcessingTime() {
+ long time = 0;
+ for (String name : TimeSeriesStatsUtil.ITEM_NAMES) {
+ time += sum(name, producerTime, consumerTime);
+ }
+ return time;
+ }
+
+ private long sum(String key, CompositeData... data) {
+ long sum = 0;
+ for (CompositeData d : data) {
+ sum += sum((long[]) d.get(key));
+ }
+ return sum;
+ }
+
+ private long sum(long[] values) {
+ long sum = 0;
+ for (long value : values) {
+ sum += value;
+ }
+ return sum;
+ }
+ }
+
+ private void sort(List<LeaderBoardData> leaderBoard) {
+ Collections.sort(leaderBoard, new Comparator<LeaderBoardData>() {
+ @Override
+ public int compare(LeaderBoardData o1, LeaderBoardData o2) {
+ return Longs.compare(o1.getProcessingTime(),
o2.getProcessingTime());
+ }
+ });
+ // assign new index value according to sort order
+ for (int i = 0; i < leaderBoard.size(); i++) {
+ leaderBoard.set(i, leaderBoard.get(i).withIndex(i));
+ }
+ }
}
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/jmx/ConsolidatedListenerMBean.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/jmx/ConsolidatedListenerMBean.java?rev=1759264&r1=1759263&r2=1759264&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/jmx/ConsolidatedListenerMBean.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/jmx/ConsolidatedListenerMBean.java
Mon Sep 5 13:20:35 2016
@@ -28,6 +28,8 @@ public interface ConsolidatedListenerMBe
TabularData getObserversStats();
+ TabularData getLeaderBoard();
+
int getListenersCount();
int getObserversCount();