KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > continuent > sequoia > controller > monitoring > datacollector > DataCollector


1 /**
2  * Sequoia: Database clustering technology.
3  * Copyright (C) 2002-2004 French National Institute For Research In Computer
4  * Science And Control (INRIA).
5  * Copyright (C) 2005 AmicoSoft, Inc. dba Emic Networks
6  * Contact: sequoia@continuent.org
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  * Initial developer(s): Nicolas Modrzyk.
21  * Contributor(s): Emmanuel Cecchet.
22  */

23
24 package org.continuent.sequoia.controller.monitoring.datacollector;
25
26 import java.util.ArrayList JavaDoc;
27
28 import javax.management.NotCompliantMBeanException JavaDoc;
29 import javax.management.ObjectName JavaDoc;
30
31 import org.continuent.sequoia.common.exceptions.DataCollectorException;
32 import org.continuent.sequoia.common.i18n.Translate;
33 import org.continuent.sequoia.common.jmx.JmxConstants;
34 import org.continuent.sequoia.common.jmx.JmxException;
35 import org.continuent.sequoia.common.jmx.mbeans.DataCollectorMBean;
36 import org.continuent.sequoia.common.jmx.monitoring.AbstractDataCollector;
37 import org.continuent.sequoia.common.jmx.monitoring.DataCollection;
38 import org.continuent.sequoia.common.jmx.monitoring.backend.ActiveConnectionsCollector;
39 import org.continuent.sequoia.common.jmx.monitoring.backend.ActiveTransactionCollector;
40 import org.continuent.sequoia.common.jmx.monitoring.backend.PendingRequestsCollector;
41 import org.continuent.sequoia.common.jmx.monitoring.backend.ReadRequestsCollector;
42 import org.continuent.sequoia.common.jmx.monitoring.backend.RequestsCollector;
43 import org.continuent.sequoia.common.jmx.monitoring.backend.TransactionsCollector;
44 import org.continuent.sequoia.common.jmx.monitoring.backend.WriteRequestsCollector;
45 import org.continuent.sequoia.common.jmx.monitoring.cache.CacheEntriesCollector;
46 import org.continuent.sequoia.common.jmx.monitoring.cache.CountHitsCollector;
47 import org.continuent.sequoia.common.jmx.monitoring.cache.CountInsertCollector;
48 import org.continuent.sequoia.common.jmx.monitoring.cache.CountSelectCollector;
49 import org.continuent.sequoia.common.jmx.monitoring.cache.HitsRatioCollector;
50 import org.continuent.sequoia.common.jmx.monitoring.client.ClientActiveTimeCollector;
51 import org.continuent.sequoia.common.jmx.monitoring.controller.ControllerIdleThreadsCollector;
52 import org.continuent.sequoia.common.jmx.monitoring.controller.ControllerWorkerPendingQueueCollector;
53 import org.continuent.sequoia.common.jmx.monitoring.controller.ThreadsCountCollector;
54 import org.continuent.sequoia.common.jmx.monitoring.controller.TotalMemoryCollector;
55 import org.continuent.sequoia.common.jmx.monitoring.controller.UsedMemoryCollector;
56 import org.continuent.sequoia.common.jmx.monitoring.scheduler.NumberReadCollector;
57 import org.continuent.sequoia.common.jmx.monitoring.scheduler.NumberRequestsCollector;
58 import org.continuent.sequoia.common.jmx.monitoring.scheduler.NumberWriteCollector;
59 import org.continuent.sequoia.common.jmx.monitoring.scheduler.PendingTransactionsCollector;
60 import org.continuent.sequoia.common.jmx.monitoring.scheduler.PendingWritesCollector;
61 import org.continuent.sequoia.common.jmx.monitoring.virtualdatabase.ActiveDatabaseThreadCollector;
62 import org.continuent.sequoia.common.jmx.monitoring.virtualdatabase.DatabaseThreadsCollector;
63 import org.continuent.sequoia.common.jmx.monitoring.virtualdatabase.PendingDatabaseConnectionCollector;
64 import org.continuent.sequoia.common.log.Trace;
65 import org.continuent.sequoia.controller.backend.DatabaseBackend;
66 import org.continuent.sequoia.controller.cache.result.AbstractResultCache;
67 import org.continuent.sequoia.controller.core.Controller;
68 import org.continuent.sequoia.controller.jmx.AbstractStandardMBean;
69 import org.continuent.sequoia.controller.jmx.MBeanServerManager;
70 import org.continuent.sequoia.controller.recoverylog.RecoveryLog;
71 import org.continuent.sequoia.controller.scheduler.AbstractScheduler;
72 import org.continuent.sequoia.controller.virtualdatabase.VirtualDatabase;
73 import org.continuent.sequoia.controller.virtualdatabase.VirtualDatabaseWorkerThread;
74
75 /**
76  * This class implements retrieval of data to all possible objects in the
77  * controller or other Sequoia components. It gets its interface from the
78  * corresponding MBean.
79  *
80  * @author <a HREF="mailto:Nicolas.Modrzyk@inrialpes.fr">Nicolas Modrzyk </a>
81  * @author <a HREF="mailto:Emmanuel.Cecchet@inria.fr">Emmanuel Cecchet </a>
82  */

83 public class DataCollector extends AbstractStandardMBean
84     implements
85       DataCollectorMBean
86 {
87   /** Logger instance */
88   static Trace logger = Trace
89                                                             .getLogger("org.continuent.sequoia.controller.jmx");
90   Controller controller;
91
92   /**
93    * No cache enabled exception
94    */

95   public static final String JavaDoc NO_CACHE_ENABLED = "No cache enabled";
96   /**
97    * Not Implemented exception
98    */

99   public static final String JavaDoc NOT_IMPLEMENTED = "Not Implemented";
100   /**
101    * Cannot get access to backend exception
102    */

103   public static final String JavaDoc BACKEND_NOT_ACCESSIBLE = "Cannot reach backend";
104
105   /**
106    * Cannot disable backend exception
107    */

108   public static final String JavaDoc BACKEND_CANNOT_BE_DISABLED = "Backend cannot be disabled";
109
110   /**
111    * Client not found exception
112    */

113   public static final String JavaDoc CLIENT_NOT_FOUND = "Client not found";
114   /**
115    * Invalid Data type for collector
116    */

117   public static final String JavaDoc INVALID_COLLECTOR_TYPE = "Invalid Collector Type";
118   /**
119    * Authentication failed
120    */

121   public static final String JavaDoc AUTHENTICATION_FAILED = "Authentication failed";
122   /**
123    * Database not found
124    */

125   public static final String JavaDoc DATABASE_NOT_FOUND = "Database does not exists";
126
127   /**
128    * Create a new DataCollector associated to this controller.
129    *
130    * @param controller to collect data from
131    * @throws NotCompliantMBeanException - if the mbeanInterface does not follow
132    * JMX design patterns for Management Interfaces, or if this does
133    * not implement the specified interface.
134    * @exception JmxException the bean could not be registered
135    */

136   public DataCollector(Controller controller)
137       throws NotCompliantMBeanException JavaDoc, JmxException
138   {
139     super(DataCollectorMBean.class);
140     this.controller = controller;
141     ObjectName JavaDoc objectName = JmxConstants.getDataCollectorObjectName();
142     MBeanServerManager.registerMBean(this, objectName);
143
144   }
145
146   /**
147    * @see AbstractStandardMBean#getAssociatedString
148    */

149   public String JavaDoc getAssociatedString()
150   {
151     return "datacollector";
152   }
153
154   /**
155    * Try to get a virtual database from its name
156    *
157    * @param name of the virtual database
158    * @return virtual database object
159    * @throws DataCollectorException if does not exist
160    */

161   private VirtualDatabase getVirtualDatabase(String JavaDoc name)
162       throws DataCollectorException
163   {
164     VirtualDatabase vd = controller.getVirtualDatabase(name);
165     if (vd == null)
166       throw new DataCollectorException("Unknown Database");
167     return vd;
168   }
169
170   /**
171    * @see org.continuent.sequoia.common.jmx.mbeans.DataCollectorMBean#retrieveBackendsData()
172    */

173   public String JavaDoc[][] retrieveBackendsData() throws DataCollectorException
174   {
175     throw new DataCollectorException("Not Implemented");
176   }
177
178   /**
179    * @see org.continuent.sequoia.common.jmx.mbeans.DataCollectorMBean#retrieveBackendsData(java.lang.String)
180    */

181   public String JavaDoc[][] retrieveBackendsData(String JavaDoc virtualDatabasename)
182       throws DataCollectorException
183   {
184     VirtualDatabase vdb = getVirtualDatabase(virtualDatabasename);
185     try
186     {
187       vdb.acquireReadLockBackendLists();
188     }
189     catch (InterruptedException JavaDoc e)
190     {
191       String JavaDoc msg = Translate.get("virtualdatabase.fail.read.lock", e);
192       throw new DataCollectorException(msg);
193     }
194     ArrayList JavaDoc backends = vdb.getBackends();
195     int backendListSize = backends.size();
196     String JavaDoc[][] data = new String JavaDoc[backendListSize][];
197     for (int i = 0; i < backendListSize; i++)
198     {
199       data[i] = ((DatabaseBackend) backends.get(i)).getBackendData();
200     }
201     vdb.releaseReadLockBackendLists();
202     return data;
203   }
204
205   /**
206    * @see org.continuent.sequoia.common.jmx.mbeans.DataCollectorMBean#retrieveCacheData()
207    */

208   public String JavaDoc[][] retrieveCacheData() throws DataCollectorException
209   {
210     throw new DataCollectorException(NOT_IMPLEMENTED);
211   }
212
213   /**
214    * @see org.continuent.sequoia.common.jmx.mbeans.DataCollectorMBean#retrieveRecoveryLogData(java.lang.String)
215    */

216   public String JavaDoc[][] retrieveRecoveryLogData(String JavaDoc databaseName)
217       throws DataCollectorException
218   {
219     VirtualDatabase vdb = getVirtualDatabase(databaseName);
220     RecoveryLog log = vdb.getRequestManager().getRecoveryLog();
221     if (log == null)
222       throw new DataCollectorException("Recovery log is not defined");
223     return log.getData();
224   }
225
226   /**
227    * @see org.continuent.sequoia.common.jmx.mbeans.DataCollectorMBean#retrieveCacheData(java.lang.String)
228    */

229   public String JavaDoc[][] retrieveCacheData(String JavaDoc virtualDatabasename)
230       throws DataCollectorException
231   {
232     VirtualDatabase vdb = getVirtualDatabase(virtualDatabasename);
233     AbstractResultCache cache = vdb.getRequestManager().getResultCache();
234     if (cache == null)
235       throw new DataCollectorException(NO_CACHE_ENABLED);
236     else
237     {
238       try
239       {
240         return cache.getCacheData();
241       }
242       catch (Exception JavaDoc e)
243       {
244         throw new DataCollectorException(e.getMessage());
245       }
246     }
247   }
248
249   /**
250    * @see org.continuent.sequoia.common.jmx.mbeans.DataCollectorMBean#retrieveCacheStatsData()
251    */

252   public String JavaDoc[][] retrieveCacheStatsData() throws DataCollectorException
253   {
254     throw new DataCollectorException(NOT_IMPLEMENTED);
255   }
256
257   /**
258    * @see org.continuent.sequoia.common.jmx.mbeans.DataCollectorMBean#retrieveCacheStatsData(java.lang.String)
259    */

260   public String JavaDoc[][] retrieveCacheStatsData(String JavaDoc virtualDatabasename)
261       throws DataCollectorException
262   {
263     VirtualDatabase vdb = getVirtualDatabase(virtualDatabasename);
264     AbstractResultCache cache = vdb.getRequestManager().getResultCache();
265     if (cache == null)
266       throw new DataCollectorException("No Cache enabled.");
267     else
268     {
269       try
270       {
271         return cache.getCacheStatsData();
272       }
273       catch (Exception JavaDoc e)
274       {
275         throw new DataCollectorException(e.getMessage());
276       }
277     }
278   }
279
280   /**
281    * @see org.continuent.sequoia.common.jmx.mbeans.DataCollectorMBean#retrieveClientsData()
282    */

283   public String JavaDoc[][] retrieveClientsData() throws DataCollectorException
284   {
285     throw new DataCollectorException("Not Implemented");
286   }
287
288   /**
289    * @see org.continuent.sequoia.common.jmx.mbeans.DataCollectorMBean#retrieveClientsData(java.lang.String)
290    */

291   public String JavaDoc[][] retrieveClientsData(String JavaDoc virtualDatabasename)
292       throws DataCollectorException
293   {
294     VirtualDatabase vdb = getVirtualDatabase(virtualDatabasename);
295     ArrayList JavaDoc activeThreads = vdb.getActiveThreads();
296     int size = activeThreads.size();
297     String JavaDoc[][] data = new String JavaDoc[size][];
298     for (int i = 0; i < size; i++)
299     {
300       data[i] = ((VirtualDatabaseWorkerThread) activeThreads.get(i))
301           .retrieveClientData();
302     }
303     return data;
304   }
305
306   /**
307    * @see org.continuent.sequoia.common.jmx.mbeans.DataCollectorMBean#retrieveControllerLoadData()
308    */

309   public String JavaDoc[][] retrieveControllerLoadData()
310   {
311     long total = Runtime.getRuntime().totalMemory();
312     long free = Runtime.getRuntime().freeMemory();
313     String JavaDoc[][] data = new String JavaDoc[1][6];
314     data[0][0] = controller.getIPAddress();
315     data[0][1] = String.valueOf(total / 1024 / 1024);
316     data[0][2] = String.valueOf((total - free) / 1024 / 1024);
317     data[0][3] = String.valueOf(Thread.activeCount());
318     data[0][4] = String.valueOf(controller.getConnectionThread()
319         .getControllerServerThreadPendingQueueSize());
320     data[0][5] = String.valueOf(controller.getConnectionThread()
321         .getIdleWorkerThreads());
322     return data;
323   }
324
325   /**
326    * @see org.continuent.sequoia.common.jmx.mbeans.DataCollectorMBean#retrieveSQLStats()
327    */

328   public String JavaDoc[][] retrieveSQLStats() throws DataCollectorException
329   {
330     throw new DataCollectorException("Not Implemented");
331   }
332
333   /**
334    * @see org.continuent.sequoia.common.jmx.mbeans.DataCollectorMBean#retrieveSQLStats()
335    */

336   public String JavaDoc[][] retrieveSQLStats(String JavaDoc virtualDatabasename)
337       throws DataCollectorException
338   {
339     VirtualDatabase vdb = getVirtualDatabase(virtualDatabasename);
340     if (vdb.getSQLMonitor() == null)
341       throw new DataCollectorException("No SQL monitoring enabled.");
342     else
343       return vdb.getSQLMonitor().getAllStatsInformation();
344   }
345
346   /**
347    * @see org.continuent.sequoia.common.jmx.mbeans.DataCollectorMBean#retrieveVirtualDatabasesData()
348    */

349   public String JavaDoc[][] retrieveVirtualDatabasesData()
350   {
351     ArrayList JavaDoc dbs = controller.getVirtualDatabases();
352     int size = dbs.size();
353     String JavaDoc[][] data = new String JavaDoc[size][4];
354     VirtualDatabase db;
355     for (int i = 0; i < size; i++)
356     {
357       db = (VirtualDatabase) dbs.get(i);
358       data[i][0] = db.getVirtualDatabaseName();
359       data[i][1] = String.valueOf(db.getActiveThreads().size());
360       data[i][2] = String.valueOf(db.getPendingConnections().size());
361       data[i][3] = String.valueOf(db.getCurrentNbOfThreads());
362     }
363     return data;
364   }
365
366   /**
367    * @return Returns the controller.
368    */

369   public Controller getController()
370   {
371     return controller;
372   }
373
374   /**
375    * @see org.continuent.sequoia.common.jmx.mbeans.DataCollectorMBean#retrieveSchedulerData(java.lang.String)
376    */

377   public String JavaDoc[][] retrieveSchedulerData(String JavaDoc virtualDatabasename)
378       throws DataCollectorException
379   {
380     VirtualDatabase vdb = getVirtualDatabase(virtualDatabasename);
381     AbstractScheduler scheduler = vdb.getRequestManager().getScheduler();
382     String JavaDoc[][] data = new String JavaDoc[1][];
383     data[0] = scheduler.getSchedulerData();
384     return data;
385   }
386
387   /**
388    * @see org.continuent.sequoia.common.jmx.mbeans.DataCollectorMBean#retrieveDataCollectorInstance
389    */

390   public AbstractDataCollector retrieveDataCollectorInstance(int dataType,
391       String JavaDoc targetName, String JavaDoc virtualDbName) throws DataCollectorException
392   {
393     switch (dataType)
394     {
395       /*
396        * Controller Collectors
397        */

398       case DataCollection.CONTROLLER_TOTAL_MEMORY :
399         return new TotalMemoryCollector(controller);
400       case DataCollection.CONTROLLER_USED_MEMORY :
401         return new UsedMemoryCollector(controller);
402       case DataCollection.CONTROLLER_WORKER_PENDING_QUEUE :
403         return new ControllerWorkerPendingQueueCollector(controller);
404       case DataCollection.CONTROLLER_THREADS_NUMBER :
405         return new ThreadsCountCollector(controller);
406       case DataCollection.CONTROLLER_IDLE_WORKER_THREADS :
407         return new ControllerIdleThreadsCollector(controller);
408       /*
409        * Backend collectors
410        */

411       case DataCollection.BACKEND_ACTIVE_TRANSACTION :
412         return new ActiveTransactionCollector(targetName, virtualDbName);
413       case DataCollection.BACKEND_PENDING_REQUESTS :
414         return new PendingRequestsCollector(targetName, virtualDbName);
415       case DataCollection.BACKEND_TOTAL_ACTIVE_CONNECTIONS :
416         return new ActiveConnectionsCollector(targetName, virtualDbName);
417       case DataCollection.BACKEND_TOTAL_REQUEST :
418         return new RequestsCollector(targetName, virtualDbName);
419       case DataCollection.BACKEND_TOTAL_READ_REQUEST :
420         return new ReadRequestsCollector(targetName, virtualDbName);
421       case DataCollection.BACKEND_TOTAL_WRITE_REQUEST :
422         return new WriteRequestsCollector(targetName, virtualDbName);
423       case DataCollection.BACKEND_TOTAL_TRANSACTIONS :
424         return new TransactionsCollector(targetName, virtualDbName);
425       /*
426        * VirtualDatabase collectors
427        */

428       case DataCollection.DATABASES_ACTIVE_THREADS :
429         return new ActiveDatabaseThreadCollector(virtualDbName);
430       case DataCollection.DATABASES_PENDING_CONNECTIONS :
431         return new PendingDatabaseConnectionCollector(virtualDbName);
432       case DataCollection.DATABASES_NUMBER_OF_THREADS :
433         return new DatabaseThreadsCollector(virtualDbName);
434       /*
435        * Cache stats collectors
436        */

437       case DataCollection.CACHE_STATS_COUNT_HITS :
438         return new CountHitsCollector(virtualDbName);
439       case DataCollection.CACHE_STATS_COUNT_INSERT :
440         return new CountInsertCollector(virtualDbName);
441       case DataCollection.CACHE_STATS_COUNT_SELECT :
442         return new CountSelectCollector(virtualDbName);
443       case DataCollection.CACHE_STATS_HITS_PERCENTAGE :
444         return new HitsRatioCollector(virtualDbName);
445       case DataCollection.CACHE_STATS_NUMBER_ENTRIES :
446         return new CacheEntriesCollector(virtualDbName);
447       /*
448        * Scheduler collectors
449        */

450       case DataCollection.SCHEDULER_NUMBER_READ :
451         return new NumberReadCollector(virtualDbName);
452       case DataCollection.SCHEDULER_NUMBER_REQUESTS :
453         return new NumberRequestsCollector(virtualDbName);
454       case DataCollection.SCHEDULER_NUMBER_WRITES :
455         return new NumberWriteCollector(virtualDbName);
456       case DataCollection.SCHEDULER_PENDING_TRANSACTIONS :
457         return new PendingTransactionsCollector(virtualDbName);
458       case DataCollection.SCHEDULER_PENDING_WRITES :
459         return new PendingWritesCollector(virtualDbName);
460       /*
461        * Client collectors
462        */

463       case DataCollection.CLIENT_TIME_ACTIVE :
464         return new ClientActiveTimeCollector(virtualDbName, targetName);
465
466       /*
467        * Unknown collector
468        */

469       default :
470         throw new DataCollectorException(INVALID_COLLECTOR_TYPE);
471     }
472   }
473
474   /**
475    * @see org.continuent.sequoia.common.jmx.mbeans.DataCollectorMBean#retrieveData
476    */

477   public long retrieveData(AbstractDataCollector collector)
478       throws DataCollectorException
479   {
480     // Get the new value and return it
481
// recall reference to controller (is transient in collector)
482
collector.setController(controller);
483     return collector.collectValue();
484   }
485
486   /**
487    * @see org.continuent.sequoia.common.jmx.mbeans.DataCollectorMBean#hasVirtualDatabase(java.lang.String)
488    */

489   public boolean hasVirtualDatabase(String JavaDoc name)
490   {
491     return controller.hasVirtualDatabase(name);
492   }
493 }
Popular Tags