Created
April 12, 2015 15:02
-
-
Save chetanmeh/1ef9ac3b79cc15542843 to your computer and use it in GitHub Desktop.
Oak Listener Details
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import com.google.common.collect.ImmutableList | |
import com.google.common.collect.Iterables | |
import com.google.common.collect.Lists | |
import groovy.text.SimpleTemplateEngine | |
import org.apache.jackrabbit.oak.spi.commit.BackgroundObserver | |
import org.apache.jackrabbit.oak.spi.commit.Observer | |
def observers = osgi.getServices(Observer.class, null) | |
println "Number of observers : ${observers.size()}" | |
def stats = [] | |
observers.each { o -> | |
if (!(o instanceof BackgroundObserver)) { | |
return | |
} | |
def delegate = getField(o, "observer") | |
if (!delegate.class.name.endsWith("ChangeProcessor")){ | |
return | |
} | |
def cp = delegate | |
def mbean = cp.tracker.getListenerMBean() | |
def q = getField(o, "queue") | |
def localEventCount = q.count {ch -> ch.info != null}; | |
def filterProvider = getField(cp, "filterProvider").get(); | |
//Lists.newArrayList(Iterables.limit(q, 5)).collect {ch -> ch.info ? 'L' : 'E'} | |
def stat = [ | |
queueSize : q.size(), | |
name : mbean.className, | |
includeClusterExternal : getField(filterProvider, "includeClusterExternal"), | |
includeClusterLocal : getField(filterProvider, "includeClusterLocal"), | |
subTrees : getField(filterProvider, "subTrees"), | |
localEventCount : localEventCount, | |
externalEventCount : q.size() - localEventCount, | |
sessionId : getField(cp, "contentSession").toString() | |
] | |
if (!(!stat.includeClusterExternal && stat.includeClusterLocal)){ | |
// return | |
} | |
stats << stat | |
} | |
stats.sort {-it.queueSize} | |
def columns = [ | |
[name:"queueSize",displayName:"Queue Size",size:10], | |
[name:"name",displayName:"Name",size:80], | |
[name:"includeClusterExternal",displayName:"Ext",size:5], | |
[name:"includeClusterLocal",displayName:"Local",size:5], | |
[name:"localEventCount",displayName:"#Local",size:10], | |
[name:"externalEventCount",displayName:"#Ext",size:10], | |
[name:"sessionId",displayName:"Session ID",size:10], | |
[name:"subTrees",displayName:"Subtree",size:550], | |
] | |
def ttf = new TemplateFactory() | |
ttf.columns = columns | |
println new SimpleTemplateEngine().createTemplate(ttf.template).make([rows:stats]).toString() | |
def getField(Object o, String fieldName){ | |
def fieldMap = [:] | |
populateFields(o.class, fieldMap) | |
def f = fieldMap.get(fieldName) | |
assert f : "No field name $fieldName found in class ${o.class}" | |
f.setAccessible(true) | |
return f.get(o) | |
} | |
def populateFields(Class c, def fieldMap){ | |
if (c == null){ | |
return | |
} | |
c.getDeclaredFields().each {f -> fieldMap[f.name] = f} | |
populateFields(c.superclass, fieldMap) | |
} | |
class TemplateFactory { | |
def columns = [] | |
def getTemplate() { """ | |
${columns.collect{ " <%print \"$it.displayName\".center($it.size)%> " }.join()} | |
${columns.collect{ " <%print \"_\"*$it.size %> " }.join()} | |
<% rows.each {%>${columns.collect{ " \${it.${it.name}.toString().padRight($it.size).substring(0,$it.size)} " }.join()} | |
<% } %>""" | |
} | |
} | |
class ConfluenceTemplateFactory { | |
def columns = [] | |
def getTemplate() { """ | |
||${columns.collect{ " <%print \"$it.displayName\"%> " }.join("||")}|| | |
<% rows.each {%>${"|"+columns.collect{ " \${it.${it.name}.toString()} " }.join("|")+"|"} | |
<% } %>""" | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Number of observers : 14 | |
Queue Size Name Ext Local #Local #Ext Session ID Subtree | |
__________ ________________________________________________________________________________ _____ _____ __________ __________ __________ __________________________________ | |
0 org.apache.sling.installer.provider.jcr.impl.JcrInstaller$StoppableThread$1 true true 0 0 session-11 [] | |
0 com.adobe.granite.workflow.core.eventsupport.JcrToWorkflowEventService true false 0 0 session-56 [/etc/workflow] | |
0 com.adobe.granite.ui.clientlibs.impl.HtmlLibraryManagerImpl true true 0 0 session-52 [/etc, /libs, /apps] | |
0 com.adobe.granite.workflow.core.model.WorkflowModelCacheImpl true true 0 0 session-10 [/etc/workflow/models] | |
0 com.adobe.granite.workflow.core.launcher.WorkflowLauncherListener false true 0 0 session-53 [/etc/workflow/launcher/config] | |
0 org.apache.sling.installer.provider.jcr.impl.RootFolderListener true true 0 0 session-11 [/apps] | |
0 com.adobe.granite.workflow.core.launcher.WorkflowLauncherListener$WorkflowLaunch true true 0 0 session-54 [/etc/workflow/launcher/config] | |
0 com.day.cq.replication.impl.ConfigManagerImpl true true 0 0 session-50 [/etc/replication] | |
0 org.apache.sling.installer.provider.jcr.impl.RootFolderListener true true 0 0 session-11 [/libs] | |
0 com.adobe.granite.workflow.core.payloadmap.PayloadMoveListener false true 0 0 session-12 [/content/dam] | |
0 org.apache.sling.installer.provider.jcr.impl.JcrInstaller$StoppableThread true true 0 0 session-11 [] | |
0 com.adobe.granite.workflow.core.collection.ResourceCollectionManagerListener true true 0 0 session-55 [/etc/workflow/packages] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment