00001
00025 package org.objectweb.cjdbc.controller.monitoring.datacollector;
00026
00027
import java.util.ArrayList;
00028
00029
import javax.management.NotCompliantMBeanException;
00030
import javax.management.ObjectName;
00031
00032
import org.objectweb.cjdbc.common.exceptions.DataCollectorException;
00033
import org.objectweb.cjdbc.common.exceptions.ExceptionTypes;
00034
import org.objectweb.cjdbc.common.i18n.Translate;
00035
import org.objectweb.cjdbc.common.jmx.JmxConstants;
00036
import org.objectweb.cjdbc.common.jmx.JmxException;
00037
import org.objectweb.cjdbc.common.jmx.mbeans.DataCollectorMBean;
00038
import org.objectweb.cjdbc.common.log.Trace;
00039
import org.objectweb.cjdbc.common.monitor.AbstractDataCollector;
00040
import org.objectweb.cjdbc.common.monitor.DataCollection;
00041
import org.objectweb.cjdbc.common.monitor.backend.ActiveConnectionsCollector;
00042
import org.objectweb.cjdbc.common.monitor.backend.ActiveTransactionCollector;
00043
import org.objectweb.cjdbc.common.monitor.backend.PendingRequestsCollector;
00044
import org.objectweb.cjdbc.common.monitor.backend.ReadRequestsCollector;
00045
import org.objectweb.cjdbc.common.monitor.backend.RequestsCollector;
00046
import org.objectweb.cjdbc.common.monitor.backend.TransactionsCollector;
00047
import org.objectweb.cjdbc.common.monitor.backend.WriteRequestsCollector;
00048
import org.objectweb.cjdbc.common.monitor.cache.CacheEntriesCollector;
00049
import org.objectweb.cjdbc.common.monitor.cache.CountHitsCollector;
00050
import org.objectweb.cjdbc.common.monitor.cache.CountInsertCollector;
00051
import org.objectweb.cjdbc.common.monitor.cache.CountSelectCollector;
00052
import org.objectweb.cjdbc.common.monitor.cache.HitsRatioCollector;
00053
import org.objectweb.cjdbc.common.monitor.client.ClientActiveTimeCollector;
00054
import org.objectweb.cjdbc.common.monitor.client.ClientBytesReadCollector;
00055
import org.objectweb.cjdbc.common.monitor.client.ClientBytesWrittenCollector;
00056
import org.objectweb.cjdbc.common.monitor.client.ClientReadingSpeedCollector;
00057
import org.objectweb.cjdbc.common.monitor.client.ClientWritingSpeedCollector;
00058
import org.objectweb.cjdbc.common.monitor.controller.ControllerIdleThreadsCollector;
00059
import org.objectweb.cjdbc.common.monitor.controller.ControllerWorkerPendingQueueCollector;
00060
import org.objectweb.cjdbc.common.monitor.controller.ThreadsCountCollector;
00061
import org.objectweb.cjdbc.common.monitor.controller.TotalMemoryCollector;
00062
import org.objectweb.cjdbc.common.monitor.controller.UsedMemoryCollector;
00063
import org.objectweb.cjdbc.common.monitor.scheduler.NumberReadCollector;
00064
import org.objectweb.cjdbc.common.monitor.scheduler.NumberRequestsCollector;
00065
import org.objectweb.cjdbc.common.monitor.scheduler.NumberWriteCollector;
00066
import org.objectweb.cjdbc.common.monitor.scheduler.PendingTransactionsCollector;
00067
import org.objectweb.cjdbc.common.monitor.scheduler.PendingWritesCollector;
00068
import org.objectweb.cjdbc.common.monitor.virtualdatabase.ActiveDatabaseThreadCollector;
00069
import org.objectweb.cjdbc.common.monitor.virtualdatabase.DatabaseThreadsCollector;
00070
import org.objectweb.cjdbc.common.monitor.virtualdatabase.PendingDatabaseConnectionCollector;
00071
import org.objectweb.cjdbc.controller.backend.DatabaseBackend;
00072
import org.objectweb.cjdbc.controller.cache.result.AbstractResultCache;
00073
import org.objectweb.cjdbc.controller.core.Controller;
00074
import org.objectweb.cjdbc.controller.jmx.AbstractStandardMBean;
00075
import org.objectweb.cjdbc.controller.jmx.MBeanServerManager;
00076
import org.objectweb.cjdbc.controller.recoverylog.AbstractRecoveryLog;
00077
import org.objectweb.cjdbc.controller.scheduler.AbstractScheduler;
00078
import org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase;
00079
import org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabaseWorkerThread;
00080
00088 public class DataCollector extends AbstractStandardMBean
00089 implements
00090 DataCollectorMBean,
00091 DataCollection
00092 {
00094 static Trace
logger = Trace.getLogger(
"org.objectweb.cjdbc.controller.jmx");
00095 Controller
controller;
00096
00106 public DataCollector(Controller controller)
00107
throws NotCompliantMBeanException,
JmxException
00108 {
00109 super(DataCollectorMBean.class);
00110
this.controller =
controller;
00111 ObjectName objectName =
JmxConstants.getDataCollectorObjectName();
00112
MBeanServerManager.registerMBean(
this, objectName);
00113
00114 }
00115
00119 public String
getAssociatedString()
00120 {
00121
return "datacollector";
00122 }
00123
00131 private VirtualDatabase getVirtualDatabase(String name)
00132
throws DataCollectorException
00133 {
00134
VirtualDatabase vd =
controller.getVirtualDatabase(name);
00135
if (vd == null)
00136
throw new DataCollectorException(
"Unknown Database");
00137
return vd;
00138 }
00139
00143 public String[][]
retrieveBackendsData() throws
DataCollectorException
00144 {
00145
throw new DataCollectorException(
"Not Implemented");
00146 }
00147
00151 public String[][]
retrieveBackendsData(String virtualDatabasename)
00152
throws DataCollectorException
00153 {
00154
VirtualDatabase vdb =
getVirtualDatabase(virtualDatabasename);
00155
try
00156 {
00157 vdb.
acquireReadLockBackendLists();
00158 }
00159
catch (InterruptedException e)
00160 {
00161 String msg =
Translate.get(
"virtualdatabase.fail.read.lock", e);
00162
throw new DataCollectorException(msg);
00163 }
00164 ArrayList backends = vdb.
getBackends();
00165
int backendListSize = backends.size();
00166 String[][] data =
new String[backendListSize][];
00167
for (
int i = 0; i < backendListSize; i++)
00168 {
00169 data[i] = ((
DatabaseBackend) backends.get(i)).getBackendData();
00170 }
00171 vdb.
releaseReadLockBackendLists();
00172
return data;
00173 }
00174
00178 public String[][]
retrieveCacheData() throws
DataCollectorException
00179 {
00180
throw new DataCollectorException(
ExceptionTypes.NOT_IMPLEMENTED);
00181
00182 }
00183
00187 public String[][]
retrieveRecoveryLogData(String databaseName)
00188
throws DataCollectorException
00189 {
00190
VirtualDatabase vdb =
getVirtualDatabase(databaseName);
00191
AbstractRecoveryLog log = vdb.
getRequestManager().getRecoveryLog();
00192
if (log == null)
00193
throw new DataCollectorException(
ExceptionTypes.NO_RECOVERY_LOG);
00194
return log.
getData();
00195 }
00196
00200 public String[][]
retrieveCacheData(String virtualDatabasename)
00201
throws DataCollectorException
00202 {
00203
VirtualDatabase vdb =
getVirtualDatabase(virtualDatabasename);
00204
AbstractResultCache cache = vdb.
getRequestManager().getResultCache();
00205
if (cache == null)
00206
throw new DataCollectorException(
ExceptionTypes.NO_CACHE_ENABLED);
00207
else
00208 {
00209
try
00210 {
00211
return cache.
getCacheData();
00212 }
00213
catch (Exception e)
00214 {
00215
throw new DataCollectorException(e.getMessage());
00216 }
00217 }
00218 }
00219
00223 public String[][]
retrieveCacheStatsData() throws
DataCollectorException
00224 {
00225
throw new DataCollectorException(
ExceptionTypes.NOT_IMPLEMENTED);
00226 }
00227
00231 public String[][]
retrieveCacheStatsData(String virtualDatabasename)
00232
throws DataCollectorException
00233 {
00234
VirtualDatabase vdb =
getVirtualDatabase(virtualDatabasename);
00235
AbstractResultCache cache = vdb.
getRequestManager().getResultCache();
00236
if (cache == null)
00237
throw new DataCollectorException(
"No Cache enabled.");
00238
else
00239 {
00240
try
00241 {
00242
return cache.
getCacheStatsData();
00243 }
00244
catch (Exception e)
00245 {
00246
throw new DataCollectorException(e.getMessage());
00247 }
00248 }
00249 }
00250
00254 public String[][]
retrieveClientsData() throws
DataCollectorException
00255 {
00256
throw new DataCollectorException(
"Not Implemented");
00257 }
00258
00262 public String[][]
retrieveClientsData(String virtualDatabasename)
00263
throws DataCollectorException
00264 {
00265
VirtualDatabase vdb =
getVirtualDatabase(virtualDatabasename);
00266 ArrayList activeThreads = vdb.
getActiveThreads();
00267
int size = activeThreads.size();
00268 String[][] data =
new String[size][];
00269
for (
int i = 0; i < size; i++)
00270 {
00271 data[i] = ((
VirtualDatabaseWorkerThread) activeThreads.get(i))
00272 .retrieveClientData();
00273 }
00274
return data;
00275 }
00276
00280 public String[][]
retrieveControllerLoadData()
00281 {
00282
long total = Runtime.getRuntime().totalMemory();
00283
long free = Runtime.getRuntime().freeMemory();
00284 String[][] data =
new String[1][6];
00285 data[0][0] =
controller.getIPAddress();
00286 data[0][1] =
"" + total / 1024 / 1024;
00287 data[0][2] =
"" + (total - free) / 1024 / 1024;
00288 data[0][3] =
"" + Thread.activeCount();
00289 data[0][4] =
""
00290 +
controller.getConnectionThread()
00291 .getControllerServerThreadPendingQueueSize();
00292 data[0][5] =
"" +
controller.getConnectionThread().getIdleWorkerThreads();
00293
return data;
00294 }
00295
00299 public String[][]
retrieveSQLStats() throws
DataCollectorException
00300 {
00301
throw new DataCollectorException(
"Not Implemented");
00302 }
00303
00307 public String[][]
retrieveSQLStats(String virtualDatabasename)
00308
throws DataCollectorException
00309 {
00310
VirtualDatabase vdb =
getVirtualDatabase(virtualDatabasename);
00311
if (vdb.
getSQLMonitor() == null)
00312
throw new DataCollectorException(
"No SQL monitoring enabled.");
00313
else
00314
return vdb.
getSQLMonitor().
getAllStatsInformation();
00315 }
00316
00320 public String[][]
retrieveVirtualDatabasesData()
00321 {
00322 ArrayList dbs =
controller.getVirtualDatabases();
00323
int size = dbs.size();
00324 String[][] data =
new String[size][4];
00325
VirtualDatabase db;
00326
for (
int i = 0; i < size; i++)
00327 {
00328 db = (
VirtualDatabase) dbs.get(i);
00329 data[i][0] = db.
getName();
00330 data[i][1] =
"" + db.
getActiveThreads().size();
00331 data[i][2] =
"" + db.
getPendingConnections().size();
00332 data[i][3] =
"" + db.
getCurrentNbOfThreads();
00333 }
00334
return data;
00335 }
00336
00340 public Controller
getController()
00341 {
00342
return controller;
00343 }
00344
00348 public String[][]
retrieveSchedulerData(String virtualDatabasename)
00349
throws DataCollectorException
00350 {
00351
VirtualDatabase vdb =
getVirtualDatabase(virtualDatabasename);
00352
AbstractScheduler scheduler = vdb.
getRequestManager().getScheduler();
00353 String[][] data =
new String[1][];
00354 data[0] = scheduler.
getSchedulerData();
00355
return data;
00356 }
00357
00361 public AbstractDataCollector retrieveDataCollectorInstance(
int dataType,
00362 String targetName, String virtualDbName)
throws DataCollectorException
00363 {
00364
switch (dataType)
00365 {
00366
00367
00368
00369
case CONTROLLER_TOTAL_MEMORY :
00370
return new TotalMemoryCollector(
controller);
00371
case CONTROLLER_USED_MEMORY :
00372
return new UsedMemoryCollector(
controller);
00373
case CONTROLLER_WORKER_PENDING_QUEUE :
00374
return new ControllerWorkerPendingQueueCollector(
controller);
00375
case CONTROLLER_THREADS_NUMBER :
00376
return new ThreadsCountCollector(
controller);
00377
case CONTROLLER_IDLE_WORKER_THREADS :
00378
return new ControllerIdleThreadsCollector(
controller);
00379
00380
00381
00382
case BACKEND_ACTIVE_TRANSACTION :
00383
return new ActiveTransactionCollector(targetName, virtualDbName);
00384
case BACKEND_PENDING_REQUESTS :
00385
return new PendingRequestsCollector(targetName, virtualDbName);
00386
case BACKEND_TOTAL_ACTIVE_CONNECTIONS :
00387
return new ActiveConnectionsCollector(targetName, virtualDbName);
00388
case BACKEND_TOTAL_REQUEST :
00389
return new RequestsCollector(targetName, virtualDbName);
00390
case BACKEND_TOTAL_READ_REQUEST :
00391
return new ReadRequestsCollector(targetName, virtualDbName);
00392
case BACKEND_TOTAL_WRITE_REQUEST :
00393
return new WriteRequestsCollector(targetName, virtualDbName);
00394
case BACKEND_TOTAL_TRANSACTIONS :
00395
return new TransactionsCollector(targetName, virtualDbName);
00396
00397
00398
00399
case DATABASES_ACTIVE_THREADS :
00400
return new ActiveDatabaseThreadCollector(virtualDbName);
00401
case DATABASES_PENDING_CONNECTIONS :
00402
return new PendingDatabaseConnectionCollector(virtualDbName);
00403
case DATABASES_NUMBER_OF_THREADS :
00404
return new DatabaseThreadsCollector(virtualDbName);
00405
00406
00407
00408
case CACHE_STATS_COUNT_HITS :
00409
return new CountHitsCollector(virtualDbName);
00410
case CACHE_STATS_COUNT_INSERT :
00411
return new CountInsertCollector(virtualDbName);
00412
case CACHE_STATS_COUNT_SELECT :
00413
return new CountSelectCollector(virtualDbName);
00414
case CACHE_STATS_HITS_PERCENTAGE :
00415
return new HitsRatioCollector(virtualDbName);
00416
case CACHE_STATS_NUMBER_ENTRIES :
00417
return new CacheEntriesCollector(virtualDbName);
00418
00419
00420
00421
case SCHEDULER_NUMBER_READ :
00422
return new NumberReadCollector(virtualDbName);
00423
case SCHEDULER_NUMBER_REQUESTS :
00424
return new NumberRequestsCollector(virtualDbName);
00425
case SCHEDULER_NUMBER_WRITES :
00426
return new NumberWriteCollector(virtualDbName);
00427
case SCHEDULER_PENDING_TRANSACTIONS :
00428
return new PendingTransactionsCollector(virtualDbName);
00429
case SCHEDULER_PENDING_WRITES :
00430
return new PendingWritesCollector(virtualDbName);
00431
00432
00433
00434
case CLIENT_BYTES_READ :
00435
return new ClientBytesReadCollector(virtualDbName, targetName);
00436
case CLIENT_BYTES_WRITTEN :
00437
return new ClientBytesWrittenCollector(virtualDbName, targetName);
00438
case CLIENT_TIME_ACTIVE :
00439
return new ClientActiveTimeCollector(virtualDbName, targetName);
00440
case CLIENT_READING_SPEED :
00441
return new ClientReadingSpeedCollector(virtualDbName, targetName);
00442
case CLIENT_WRITING_SPEED :
00443
return new ClientWritingSpeedCollector(virtualDbName, targetName);
00444
00445
00446
00447
default :
00448
throw new DataCollectorException(
ExceptionTypes.INVALID_COLLECTOR_TYPE);
00449 }
00450 }
00451
00455 public long retrieveData(
AbstractDataCollector collector)
00456
throws DataCollectorException
00457 {
00458
00459
00460 collector.setController(
controller);
00461
return collector.collectValue();
00462 }
00463
00467 public boolean hasVirtualDatabase(String name)
00468 {
00469
return controller.hasVirtualDatabase(name);
00470 }
00471 }