Skip to content

Instantly share code, notes, and snippets.

@chetanmeh
Created April 12, 2015 15:02
Show Gist options
  • Save chetanmeh/1ef9ac3b79cc15542843 to your computer and use it in GitHub Desktop.
Save chetanmeh/1ef9ac3b79cc15542843 to your computer and use it in GitHub Desktop.
Oak Listener Details
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("|")+"|"}
<% } %>"""
}
}
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