From: Ron B. <rjb...@us...> - 2010-06-09 07:18:25
|
Update of /cvsroot/glassbox/glassbox/monitor/src/glassbox/config/extension/api In directory sfp-cvsdas-2.v30.ch3.sourceforge.com:/tmp/cvs-serv15651/src/glassbox/config/extension/api Modified Files: PluginRegistryLocator.java SampledStacks.java QueueRegistrationsRegistry.java ExecutionTrace.java RuntimeController.java PluginRegistry.java Log Message: Add response tracing to Glassbox extension APIs. Index: PluginRegistry.java =================================================================== RCS file: /cvsroot/glassbox/glassbox/monitor/src/glassbox/config/extension/api/PluginRegistry.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** PluginRegistry.java 24 Oct 2008 04:56:05 -0000 1.2 --- PluginRegistry.java 9 Jun 2010 07:18:17 -0000 1.3 *************** *** 1,33 **** ! package glassbox.config.extension.api; ! ! import java.util.Collection; ! ! /** ! * This interface is used to configure application-specific extensions to Glassbox. ! * Simply adding monitors doesn't need it: you can just deploy a monitor jar with aspects to the classpath, ! * and an app can simply call on the response API. ! * ! * A registry supports deeper extensions, like adding custom operations. ! * ! * @author Ron Bodkin ! * ! */ ! public interface PluginRegistry { ! public void addPluginListener(PluginRegistryListener listener); ! public void removePluginListener(PluginRegistryListener listener); ! ! public void addOperationPlugin(OperationPlugin operationPlugin) throws ConfigurationException; ! public void removeOperationPlugin(OperationPlugin operationPlugin) throws ConfigurationException; ! ! public void setConnectionProvider(ConnectionProvider connectionProvider) throws ConfigurationException; ! public ConnectionProvider getConnectionProvider(); ! ! public OperationPlugin lookupOperationPlugin(String key); ! ! public Collection getOperationPlugins(); ! ! public String getGlassboxTitle(); ! public void setGlassboxTitle(String title); ! ! public RuntimeController getRuntimeController(); ! } --- 1,40 ---- ! package glassbox.config.extension.api; ! ! import glassbox.response.ResponseListener; ! ! import java.util.Collection; ! ! /** ! * This interface is used to configure application-specific extensions to Glassbox. ! * Simply adding monitors doesn't need it: you can just deploy a monitor jar with aspects to the classpath, ! * and an app can simply call on the response API. ! * ! * A registry supports deeper extensions, like adding custom operations. ! * ! * @author Ron Bodkin ! * ! */ ! public interface PluginRegistry { ! public void addPluginListener(PluginRegistryListener listener); ! public void removePluginListener(PluginRegistryListener listener); ! ! public void addOperationPlugin(OperationPlugin operationPlugin) throws ConfigurationException; ! public void removeOperationPlugin(OperationPlugin operationPlugin) throws ConfigurationException; ! ! public void setConnectionProvider(ConnectionProvider connectionProvider) throws ConfigurationException; ! public ConnectionProvider getConnectionProvider(); ! ! public OperationPlugin lookupOperationPlugin(String key); ! ! public Collection getPluginListeners(); ! public Collection getOperationPlugins(); ! public Collection getResponseListeners(); ! ! public String getGlassboxTitle(); ! public void setGlassboxTitle(String title); ! ! public RuntimeController getRuntimeController(); ! ! public void addResponseListener(ResponseListener listener); ! public void removeResponseListener(ResponseListener listener); ! } Index: RuntimeController.java =================================================================== RCS file: /cvsroot/glassbox/glassbox/monitor/src/glassbox/config/extension/api/RuntimeController.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** RuntimeController.java 24 Oct 2008 04:56:05 -0000 1.1 --- RuntimeController.java 9 Jun 2010 07:18:17 -0000 1.2 *************** *** 1,15 **** ! package glassbox.config.extension.api; ! ! public interface RuntimeController { ! ! /** Tell Glassbox to start recording statistics for the currently executing thread, for subsequent application retrieval */ ! public void startRecordingThread(); ! //public ExecutionTrace getThreadState(); ! /** Stop recording on the currently executing thread, returning Glassbox summary statistics */ ! public ExecutionTrace stopRecordingThread(); ! ! /** Global control: is Glassbox recording *any* aggregate statistics? */ ! public boolean isAggregatingStatistics(); ! /** Global control: set Glassbox to allow recording *any* aggregate statistics at all, or not */ ! public void setAggregatingStatistics(boolean shouldAggregate); ! } --- 1,41 ---- ! package glassbox.config.extension.api; ! ! import glassbox.response.ResponseFactory; ! ! import java.util.List; ! ! public interface RuntimeController { ! ! /** Tell Glassbox to start recording statistics for the currently executing thread, for subsequent application retrieval */ ! public ExecutionTrace startRecordingThread(); ! ! public ExecutionTrace startRecordingThread(long slowThresholdNanos); ! ! //public ExecutionTrace getThreadState(); ! /** Stop recording on the currently executing thread, returning Glassbox summary statistics */ ! public ExecutionTrace stopRecordingThread(); ! ! /** Global control: is Glassbox recording *any* aggregate statistics? */ ! public boolean isAggregatingStatistics(); ! /** Global control: set Glassbox to allow recording *any* aggregate statistics at all, or not */ ! public void setAggregatingStatistics(boolean shouldAggregate); ! ! /** ! * Get the list of applications for which Glassbox is restricted to aggregate statistics. This is independent of the ! * global setting for whether any statistics are being recorded. If set to a non-null value, only applications in the ! * list are monitored. ! */ ! public List getAggregatingStatisticsApplications(); ! public void setAggregatingStatisticsApplications(List stats); ! ! /** ! * Get the list of applications for which Glassbox is not aggregating statistics. This is independent of the ! * global setting for whether any statistics are being recorded. If set to a non-null value, no applications in the ! * list are monitored. Applications in this list won't be shown, even if they are included in the list of applications ! * that are otherwise being explicitly monitored. ! */ ! public List getNotAggregatingStatisticsApplications(); ! public void setNotAggregatingStatisticsApplications(List stats); ! ! public ResponseFactory getResponseFactory(); ! } Index: ExecutionTrace.java =================================================================== RCS file: /cvsroot/glassbox/glassbox/monitor/src/glassbox/config/extension/api/ExecutionTrace.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** ExecutionTrace.java 24 Oct 2008 04:56:05 -0000 1.1 --- ExecutionTrace.java 9 Jun 2010 07:18:17 -0000 1.2 *************** *** 1,28 **** ! package glassbox.config.extension.api; ! ! import glassbox.response.Response; ! ! import java.util.SortedSet; ! ! public interface ExecutionTrace { ! ! public static interface Call extends Comparable { ! public long getStart(); ! public long getEnd(); ! public long getDuration(); ! public long getMaxDuration(); ! public long getMinStart(); ! public long getMaxEnd(); ! public Response getResponse(); ! public String getDescription(); ! } ! ! /** Sorted Set of Calls, sorted by time */ ! SortedSet getCalls(); ! ! long getStart(); ! ! SampledStacks getSampledStacks(); ! ! SortedSet getSlowAndSampledCalls(); ! } --- 1,38 ---- ! package glassbox.config.extension.api; ! ! import glassbox.response.Response; ! ! import java.util.SortedSet; ! ! /** times are in nanos */ ! public interface ExecutionTrace { ! ! /** times are in nanos */ ! public static interface Call extends Comparable { ! public long getStart(); ! public long getEnd(); ! public long getStartCpu(); ! public long getEndCpu(); ! public long getDuration(); ! /** returns 0 if not sampled, else a count of distinct stack frames sampled */ ! public int getNumSamples(); ! public Response getResponse(); ! public String getDescription(); ! } ! ! /** Sorted Set of Calls, sorted by start time ascending */ ! SortedSet getCalls(); ! ! long getStart(); ! long getEnd(); ! long getDuration(); ! long getStartCpu(); ! long getEndCpu(); ! ! SampledStacks getSampledStacks(); ! ! SortedSet getSlowAndSampledCalls(); ! ! Response getActiveResourceCall(); ! Response getActiveOperation(); ! } Index: QueueRegistrationsRegistry.java =================================================================== RCS file: /cvsroot/glassbox/glassbox/monitor/src/glassbox/config/extension/api/QueueRegistrationsRegistry.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** QueueRegistrationsRegistry.java 24 Oct 2008 04:56:05 -0000 1.2 --- QueueRegistrationsRegistry.java 9 Jun 2010 07:18:17 -0000 1.3 *************** *** 1,103 **** ! /* ! * Copyright (c) 2005-2006 Glassbox Corporation, Contributors. All rights reserved. ! * This program along with all accompanying source code and applicable materials are made available under the ! * terms of the Lesser Gnu Public License v2.1, which accompanies this distribution and is available at ! * http://www.gnu.org/licenses/lgpl.txt ! */ ! ! package glassbox.config.extension.api; ! ! import java.util.*; ! ! // it would probably be easier to just depend directly on a singleton registry... ! public class QueueRegistrationsRegistry implements PluginRegistry { ! protected Map operationPlugins = Collections.synchronizedMap(new HashMap()); ! protected List listeners = Collections.synchronizedList(new ArrayList()); ! protected ConnectionProvider connectionProvider; ! protected String glassboxTitle = null; ! protected RuntimeController queuingRuntimeController = new QueueingRuntimeController(); ! ! static class QueueingRuntimeController implements RuntimeController { ! protected boolean aggregateStatistics = true; ! ! public void startRecordingThread() {} ! public ExecutionTrace stopRecordingThread() { ! return null; ! } ! ! public boolean isAggregatingStatistics() { ! return aggregateStatistics; ! } ! ! public void setAggregatingStatistics(boolean shouldAggregate) { ! aggregateStatistics = shouldAggregate; ! } ! } ! ! private static final long serialVersionUID = 1L; ! ! public void addPluginListener(PluginRegistryListener listener) { ! listeners.add(listener); ! } ! ! public void removePluginListener(PluginRegistryListener listener) { ! listeners.remove(listener); ! } ! ! public void addOperationPlugin(OperationPlugin operationPlugin) throws ConfigurationException { ! String key = operationPlugin.getKey(); ! if (key == null) { ! throw new IllegalArgumentException("Plugins must have a unique, non-null key"); ! } ! operationPlugins.put(key, operationPlugin); ! for (Iterator it=listeners.iterator(); it.hasNext();) { ! PluginRegistryListener listener = (PluginRegistryListener)it.next(); ! listener.addedOperationPlugin(operationPlugin, this); ! } ! } ! ! public void removeOperationPlugin(OperationPlugin operationPlugin) throws ConfigurationException { ! operationPlugins.remove(operationPlugin.getKey()); ! for (Iterator it=listeners.iterator(); it.hasNext();) { ! PluginRegistryListener listener = (PluginRegistryListener)it.next(); ! listener.removedOperationPlugin(operationPlugin, this); ! } ! } ! ! public OperationPlugin lookupOperationPlugin(String key) { ! return (OperationPlugin)operationPlugins.get(key); ! } ! ! public Collection getOperationPlugins() { ! return Collections.unmodifiableCollection(operationPlugins.values()); ! } ! ! public ConnectionProvider getConnectionProvider() { ! return connectionProvider; ! } ! ! public void setConnectionProvider(ConnectionProvider connectionProvider) throws ConfigurationException { ! this.connectionProvider = connectionProvider; ! for (Iterator it=listeners.iterator(); it.hasNext();) { ! PluginRegistryListener listener = (PluginRegistryListener)it.next(); ! listener.setConnectionProvider(connectionProvider, this); ! } ! } ! ! public void setGlassboxTitle(String title) { ! glassboxTitle = title; ! for (Iterator it=listeners.iterator(); it.hasNext();) { ! PluginRegistryListener listener = (PluginRegistryListener)it.next(); ! listener.setGlassboxTitle(glassboxTitle, this); ! } ! } ! ! public String getGlassboxTitle() { ! return glassboxTitle; ! } ! ! public RuntimeController getRuntimeController() { ! return queuingRuntimeController; ! } ! } \ No newline at end of file --- 1,154 ---- ! /* ! * Copyright (c) 2005-2006 Glassbox Corporation, Contributors. All rights reserved. ! * This program along with all accompanying source code and applicable materials are made available under the ! * terms of the Lesser Gnu Public License v2.1, which accompanies this distribution and is available at ! * http://www.gnu.org/licenses/lgpl.txt ! */ ! ! package glassbox.config.extension.api; ! ! import glassbox.response.ResponseFactory; ! import glassbox.response.ResponseListener; ! ! import java.util.*; ! ! // it would probably be easier to just depend directly on a singleton registry... ! public class QueueRegistrationsRegistry implements PluginRegistry { ! protected Map operationPlugins = Collections.synchronizedMap(new HashMap()); ! protected List listeners = Collections.synchronizedList(new ArrayList()); ! protected List responseListeners = Collections.synchronizedList(new ArrayList()); ! protected ConnectionProvider connectionProvider; ! protected String glassboxTitle = null; ! protected RuntimeController queuingRuntimeController = new QueueingRuntimeController(); ! ! static class QueueingRuntimeController implements RuntimeController { ! protected List aggregatingStatisticsApplications; ! protected List notAggregatingStatisticsApplications; ! ! protected boolean aggregateStatistics = true; ! ! public ExecutionTrace startRecordingThread() { ! return null; ! } ! ! public ExecutionTrace startRecordingThread(long slowThresholdNanos) { ! return null; ! } ! ! public ExecutionTrace stopRecordingThread() { ! return null; ! } ! ! public boolean isAggregatingStatistics() { ! return aggregateStatistics; ! } ! ! public void setAggregatingStatistics(boolean shouldAggregate) { ! aggregateStatistics = shouldAggregate; ! } ! ! public List getAggregatingStatisticsApplications() { ! return aggregatingStatisticsApplications; ! } ! ! public void setAggregatingStatisticsApplications(List aggregatingStatisticsApplications) { ! this.aggregatingStatisticsApplications = aggregatingStatisticsApplications; ! } ! ! public List getNotAggregatingStatisticsApplications() { ! return notAggregatingStatisticsApplications; ! } ! ! public void setNotAggregatingStatisticsApplications(List notAggregatingStatisticsApplications) { ! this.notAggregatingStatisticsApplications = notAggregatingStatisticsApplications; ! } ! ! public ResponseFactory getResponseFactory() { ! return null; ! } ! ! } ! ! private static final long serialVersionUID = 2L; ! ! public void addPluginListener(PluginRegistryListener listener) { ! listeners.add(listener); ! } ! ! public void removePluginListener(PluginRegistryListener listener) { ! listeners.remove(listener); ! } ! ! public void addOperationPlugin(OperationPlugin operationPlugin) throws ConfigurationException { ! String key = operationPlugin.getKey(); ! if (key == null) { ! throw new IllegalArgumentException("Plugins must have a unique, non-null key"); ! } ! operationPlugins.put(key, operationPlugin); ! for (Iterator it=listeners.iterator(); it.hasNext();) { ! PluginRegistryListener listener = (PluginRegistryListener)it.next(); ! listener.addedOperationPlugin(operationPlugin, this); ! } ! } ! ! public void removeOperationPlugin(OperationPlugin operationPlugin) throws ConfigurationException { ! operationPlugins.remove(operationPlugin.getKey()); ! for (Iterator it=listeners.iterator(); it.hasNext();) { ! PluginRegistryListener listener = (PluginRegistryListener)it.next(); ! listener.removedOperationPlugin(operationPlugin, this); ! } ! } ! ! public OperationPlugin lookupOperationPlugin(String key) { ! return (OperationPlugin)operationPlugins.get(key); ! } ! ! public Collection getOperationPlugins() { ! return Collections.unmodifiableCollection(operationPlugins.values()); ! } ! ! public ConnectionProvider getConnectionProvider() { ! return connectionProvider; ! } ! ! public void setConnectionProvider(ConnectionProvider connectionProvider) throws ConfigurationException { ! this.connectionProvider = connectionProvider; ! for (Iterator it=listeners.iterator(); it.hasNext();) { ! PluginRegistryListener listener = (PluginRegistryListener)it.next(); ! listener.setConnectionProvider(connectionProvider, this); ! } ! } ! ! public void setGlassboxTitle(String title) { ! glassboxTitle = title; ! for (Iterator it=listeners.iterator(); it.hasNext();) { ! PluginRegistryListener listener = (PluginRegistryListener)it.next(); ! listener.setGlassboxTitle(glassboxTitle, this); ! } ! } ! ! public String getGlassboxTitle() { ! return glassboxTitle; ! } ! ! public RuntimeController getRuntimeController() { ! return queuingRuntimeController; ! } ! ! public void addResponseListener(ResponseListener listener) { ! responseListeners.add(listener); ! } ! ! public void removeResponseListener(ResponseListener listener) { ! responseListeners.remove(listener); ! } ! ! public Collection getPluginListeners() { ! return listeners; ! } ! ! public Collection getResponseListeners() { ! return responseListeners; ! } ! } \ No newline at end of file Index: PluginRegistryLocator.java =================================================================== RCS file: /cvsroot/glassbox/glassbox/monitor/src/glassbox/config/extension/api/PluginRegistryLocator.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** PluginRegistryLocator.java 24 Oct 2008 04:56:05 -0000 1.2 --- PluginRegistryLocator.java 9 Jun 2010 07:18:16 -0000 1.3 *************** *** 1,51 **** ! package glassbox.config.extension.api; ! ! import java.util.*; ! ! /** ! * This class is used to configure application-specific extensions to Glassbox. ! * Simply adding monitors doesn't need it: you can just deploy a monitor jar with aspects to the classpath, ! * and an app can simply call on the response API. ! * ! * This registry is designed to support deeper extensions, like adding custom operations. ! * ! * @author Ron Bodkin ! * ! */ ! public class PluginRegistryLocator { ! ! private static PluginRegistry registry = new QueueRegistrationsRegistry(); ! private static final long serialVersionUID = 1L; ! ! public static synchronized PluginRegistry getRegistry() { ! return registry; ! } ! ! public static synchronized void setRegistry(PluginRegistry newRegistry) { ! Collection oldPlugins = null; ! ConnectionProvider connectionProvider = null; ! String oldTitle = null; ! //deal with redeployment - yuck ! if (registry != null) { ! oldPlugins = registry.getOperationPlugins(); ! connectionProvider = registry.getConnectionProvider(); ! oldTitle = registry.getGlassboxTitle(); ! } ! ! PluginRegistry oldRegistry = registry; ! registry = newRegistry; ! ! registry.setConnectionProvider(connectionProvider); ! registry.setGlassboxTitle(oldTitle); ! if (oldPlugins != null) { ! for (Iterator it=oldPlugins.iterator(); it.hasNext();) { ! OperationPlugin plugin=(OperationPlugin)it.next(); ! newRegistry.addOperationPlugin(plugin); ! oldRegistry.removeOperationPlugin(plugin); ! } ! } ! ! registry.getRuntimeController().setAggregatingStatistics( ! oldRegistry.getRuntimeController().isAggregatingStatistics()); ! }; ! } --- 1,73 ---- ! package glassbox.config.extension.api; ! ! import glassbox.response.ResponseListener; ! ! import java.util.*; ! ! /** ! * This class is used to configure application-specific extensions to Glassbox. ! * Simply adding monitors doesn't need it: you can just deploy a monitor jar with aspects to the classpath, ! * and an app can simply call on the response API. ! * ! * This registry is designed to support deeper extensions, like adding custom operations. ! * ! * @author Ron Bodkin ! * ! */ ! public class PluginRegistryLocator { ! ! private static PluginRegistry registry = new QueueRegistrationsRegistry(); ! private static final long serialVersionUID = 1L; ! ! public static synchronized PluginRegistry getRegistry() { ! return registry; ! } ! ! public static synchronized void setRegistry(PluginRegistry newRegistry) { ! Collection oldPlugins = null; ! Collection oldPluginRegistryListeners = null; ! Collection oldResponseListeners = null; ! ConnectionProvider connectionProvider = null; ! String oldTitle = null; ! //deal with redeployment - yuck ! if (registry != null) { ! oldPlugins = registry.getOperationPlugins(); ! connectionProvider = registry.getConnectionProvider(); ! oldTitle = registry.getGlassboxTitle(); ! oldPluginRegistryListeners = registry.getPluginListeners(); ! oldResponseListeners = registry.getResponseListeners(); ! } ! ! PluginRegistry oldRegistry = registry; ! registry = newRegistry; ! ! registry.setConnectionProvider(connectionProvider); ! registry.setGlassboxTitle(oldTitle); ! if (oldPlugins != null) { ! for (Iterator it=oldPlugins.iterator(); it.hasNext();) { ! OperationPlugin plugin=(OperationPlugin)it.next(); ! newRegistry.addOperationPlugin(plugin); ! } ! } ! ! if (oldPluginRegistryListeners != null) { ! for (Iterator it=oldPluginRegistryListeners.iterator(); it.hasNext();) { ! PluginRegistryListener pluginRegistryListener=(PluginRegistryListener)it.next(); ! newRegistry.addPluginListener(pluginRegistryListener); ! } ! } ! ! if (oldResponseListeners != null) { ! for (Iterator it=oldResponseListeners.iterator(); it.hasNext();) { ! ResponseListener responseListener=(ResponseListener)it.next(); ! newRegistry.addResponseListener(responseListener); ! } ! } ! ! RuntimeController oldController = oldRegistry.getRuntimeController(); ! RuntimeController newController = registry.getRuntimeController(); ! newController.setAggregatingStatistics(oldController.isAggregatingStatistics()); ! newController.setAggregatingStatisticsApplications(oldController.getAggregatingStatisticsApplications()); ! newController.setNotAggregatingStatisticsApplications(oldController.getNotAggregatingStatisticsApplications()); ! }; ! } Index: SampledStacks.java =================================================================== RCS file: /cvsroot/glassbox/glassbox/monitor/src/glassbox/config/extension/api/SampledStacks.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** SampledStacks.java 24 Oct 2008 04:56:05 -0000 1.1 --- SampledStacks.java 9 Jun 2010 07:18:16 -0000 1.2 *************** *** 1,11 **** ! package glassbox.config.extension.api; ! ! import java.util.List; ! ! public interface SampledStacks { ! public long getInterval(); ! public List getSnapshots(); ! public long getTotalTime(); ! public long getTotalCpuTime(); ! public long getStart(); ! } --- 1,12 ---- ! package glassbox.config.extension.api; ! ! import java.util.List; ! ! public interface SampledStacks { ! public long getInterval(); ! /** List of ThreadSnapshot */ ! public List getSnapshots(); ! public long getTotalTime(); ! public long getTotalCpuTime(); ! public long getStart(); ! } |