0
# Monitoring and Statistics
1
2
Comprehensive performance monitoring and statistics collection framework providing detailed insights into database connections, SQL execution, and system performance with JMX integration and web interfaces.
3
4
## Core Monitoring Services
5
6
### DruidStatService - Main Statistics Service
7
8
```java { .api }
9
// Primary statistics service
10
class DruidStatService {
11
public static DruidStatService getInstance();
12
13
// REST-style API access
14
public String service(String url);
15
16
// Configuration
17
public boolean isResetEnable();
18
public void setResetEnable(boolean value);
19
20
// JMX integration
21
public static void registerMBean();
22
public static void unregisterMBean();
23
}
24
```
25
26
### Statistics API Endpoints
27
28
```java
29
// Available service endpoints via service(String url) method
30
31
// Core statistics
32
"/basic.json" // Basic system statistics
33
"/datasource.json" // All DataSource statistics
34
"/sql.json" // SQL execution statistics
35
"/sql.json?orderBy=ExecuteCount" // Ordered SQL statistics
36
"/activeConnectionStackTrace.json" // Active connection debugging
37
38
// Security and web statistics
39
"/wall.json" // Security wall statistics
40
"/weburi.json" // Web URI access statistics
41
"/webapp.json" // Web application statistics
42
"/websession.json" // Web session statistics
43
"/spring.json" // Spring method statistics
44
45
// Management operations
46
"/reset-all.json" // Reset all statistics
47
"/log-and-reset.json" // Log current stats and reset
48
```
49
50
### DruidDataSourceStatManager - DataSource Statistics Management
51
52
```java { .api }
53
// DataSource statistics manager
54
class DruidDataSourceStatManager {
55
public static DruidDataSourceStatManager getInstance();
56
57
// DataSource registration
58
public boolean addDataSource(Object dataSource, String name);
59
public boolean removeDataSource(Object dataSource);
60
61
// Statistics access
62
public Set<DruidDataSourceStatValue> getDataSourceList();
63
public static Set<Object> getDruidDataSourceInstances();
64
65
// Management operations
66
public void reset();
67
public void logAndResetDataSource();
68
public long getResetCount();
69
70
// JMX support
71
public TabularData getDataSourceList();
72
}
73
```
74
75
## DataSource Statistics
76
77
### JdbcDataSourceStat - Individual DataSource Statistics
78
79
```java { .api }
80
// DataSource-level statistics collector
81
class JdbcDataSourceStat {
82
// SQL statistics management
83
public Map<String, JdbcSqlStat> getSqlStatMap();
84
public JdbcSqlStat getSqlStat(String sql);
85
public JdbcSqlStat createSqlStat(String sql);
86
public Map<String, JdbcSqlStat> getSqlStatMapAndReset();
87
88
// Connection statistics
89
public long getConnectionActiveCount();
90
public long getConnectionActiveCountMax();
91
public long getConnectionCloseCount();
92
public long getConnectionCommitCount();
93
public long getConnectionRollbackCount();
94
public long getConnectionConnectCount();
95
public long getConnectionConnectErrorCount();
96
97
// Timing statistics
98
public long getConnectionConnectMillisTotal();
99
public long getConnectionConnectMillisMax();
100
public long getConnectionConnectMillisMin();
101
public long[] getConnectionHistogramValues();
102
public long[] getConnectionHoldTimeHistogramValues();
103
104
// Resource management
105
public long getBlobOpenCount();
106
public long getClobOpenCount();
107
public long getReadStringLength();
108
public long getReadBytesLength();
109
public long getInputStreamOpenCount();
110
public long getReaderOpenCount();
111
112
// Management operations
113
public void reset();
114
public long getResetCount();
115
}
116
```
117
118
### Connection Statistics Example
119
120
```java
121
import com.alibaba.druid.pool.DruidDataSource;
122
import com.alibaba.druid.stat.JdbcDataSourceStat;
123
124
// Access DataSource statistics
125
DruidDataSource dataSource = getDataSource();
126
JdbcDataSourceStat stat = dataSource.getDataSourceStat();
127
128
// Connection metrics
129
long activeConnections = stat.getConnectionActiveCount();
130
long maxConnections = stat.getConnectionActiveCountMax();
131
long totalConnections = stat.getConnectionConnectCount();
132
long connectionErrors = stat.getConnectionConnectErrorCount();
133
134
// Connection timing
135
long totalConnectTime = stat.getConnectionConnectMillisTotal();
136
long maxConnectTime = stat.getConnectionConnectMillisMax();
137
long[] connectionHistogram = stat.getConnectionHistogramValues();
138
139
// Transaction statistics
140
long commits = stat.getConnectionCommitCount();
141
long rollbacks = stat.getConnectionRollbackCount();
142
```
143
144
## SQL Execution Statistics
145
146
### JdbcSqlStat - Individual SQL Statement Statistics
147
148
```java { .api }
149
// SQL statement statistics
150
class JdbcSqlStat {
151
// Execution counts
152
public long getExecuteCount();
153
public long getExecuteSuccessCount();
154
public long getExecuteErrorCount();
155
public long getRunningCount();
156
public long getConcurrentMax();
157
158
// Timing statistics
159
public long getExecuteMillisTotal();
160
public long getExecuteMillisMax();
161
public long getExecuteMillisMin();
162
public double getExecuteMillisMean();
163
164
// Row operations
165
public long getFetchRowCount();
166
public long getFetchRowCountMax();
167
public long getUpdateCount();
168
public long getUpdateCountMax();
169
170
// Histogram data
171
public long[] getHistogramValues(); // Execution time distribution
172
public long[] getFetchRowCountHistogramValues();
173
public long[] getUpdateCountHistogramValues();
174
public long[] getExecuteAndResultHoldTimeHistogramValues();
175
176
// Transaction context
177
public long getInTransactionCount();
178
179
// Error information
180
public Throwable getLastError();
181
public long getLastErrorCount();
182
public Date getLastErrorTime();
183
public String getLastErrorMessage();
184
public String getLastErrorClass();
185
public String getLastErrorStackTrace();
186
187
// Timing details
188
public Date getLastTime();
189
public Date getMaxTimespan();
190
public long getLastExecuteTimeNano();
191
192
// Data access
193
public Map<String, Object> getData();
194
public JdbcSqlStatValue getValue(boolean reset);
195
}
196
```
197
198
### SQL Statistics Usage
199
200
```java
201
import com.alibaba.druid.stat.JdbcSqlStat;
202
203
// Access SQL statistics
204
Map<String, JdbcSqlStat> sqlStats = dataSourceStat.getSqlStatMap();
205
206
for (Map.Entry<String, JdbcSqlStat> entry : sqlStats.entrySet()) {
207
String sql = entry.getKey();
208
JdbcSqlStat stat = entry.getValue();
209
210
// Performance metrics
211
long executions = stat.getExecuteCount();
212
long errors = stat.getExecuteErrorCount();
213
long totalTime = stat.getExecuteMillisTotal();
214
long maxTime = stat.getExecuteMillisMax();
215
double avgTime = stat.getExecuteMillisMean();
216
217
// Row operations
218
long rowsFetched = stat.getFetchRowCount();
219
long rowsUpdated = stat.getUpdateCount();
220
221
// Concurrency
222
long currentRunning = stat.getRunningCount();
223
long maxConcurrent = stat.getConcurrentMax();
224
225
// Error information
226
if (stat.getLastError() != null) {
227
System.out.println("Last error: " + stat.getLastErrorMessage());
228
System.out.println("Error time: " + stat.getLastErrorTime());
229
}
230
}
231
```
232
233
## Statistics Collection Configuration
234
235
### StatFilter - Statistics Collection Filter
236
237
```java { .api }
238
// Statistics collection filter
239
class StatFilter extends FilterEventAdapter implements StatFilterMBean {
240
// Configuration
241
public void setSlowSqlMillis(long millis); // Default: 3000ms
242
public long getSlowSqlMillis();
243
public void setLogSlowSql(boolean enabled); // Default: false
244
public boolean isLogSlowSql();
245
public void setMergeSql(boolean enabled); // Default: false
246
public boolean isMergeSql();
247
248
// Connection tracking
249
public void setConnectionStackTraceEnable(boolean enabled);
250
public boolean isConnectionStackTraceEnable();
251
252
// SQL merging and parameterization
253
public String mergeSql(String sql);
254
public String mergeSql(String sql, DbType dbType);
255
256
// Statistics access
257
public JdbcDataSourceStat getDataSourceStat();
258
public TabularData getSqlList();
259
public CompositeData getSqlStat(String sql);
260
261
// Management operations
262
public void reset();
263
public long getResetCount();
264
}
265
```
266
267
### StatFilter Configuration Example
268
269
```java
270
import com.alibaba.druid.filter.stat.StatFilter;
271
import com.alibaba.druid.pool.DruidDataSource;
272
273
// Configure statistics collection
274
DruidDataSource dataSource = new DruidDataSource();
275
276
// Method 1: Via filters string
277
dataSource.setFilters("stat");
278
279
// Method 2: Programmatic configuration
280
StatFilter statFilter = new StatFilter();
281
statFilter.setSlowSqlMillis(5000); // 5 second slow SQL threshold
282
statFilter.setLogSlowSql(true); // Log slow SQL statements
283
statFilter.setMergeSql(true); // Merge similar SQL statements
284
statFilter.setConnectionStackTraceEnable(true); // Capture connection stack traces
285
286
dataSource.getProxyFilters().add(statFilter);
287
```
288
289
## Web Interface Integration
290
291
### StatViewServlet - Web Statistics Interface
292
293
```java { .api }
294
// Web interface servlet
295
class StatViewServlet extends HttpServlet {
296
// Configuration parameters
297
// resetEnable - Allow statistics reset via web interface
298
// jmxUrl, jmxUsername, jmxPassword - Remote JMX connection
299
// allow, deny - IP access control
300
}
301
```
302
303
### Web Interface Setup
304
305
```xml
306
<!-- web.xml configuration -->
307
<servlet>
308
<servlet-name>DruidStatView</servlet-name>
309
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
310
<init-param>
311
<param-name>resetEnable</param-name>
312
<param-value>true</param-value>
313
</init-param>
314
<init-param>
315
<param-name>loginUsername</param-name>
316
<param-value>admin</param-value>
317
</init-param>
318
<init-param>
319
<param-name>loginPassword</param-name>
320
<param-value>password</param-value>
321
</init-param>
322
</servlet>
323
<servlet-mapping>
324
<servlet-name>DruidStatView</servlet-name>
325
<url-pattern>/druid/*</url-pattern>
326
</servlet-mapping>
327
```
328
329
## JMX Integration
330
331
### MBean Registration and Access
332
333
```java { .api }
334
// JMX ObjectNames
335
// com.alibaba.druid:type=DruidStatService
336
// com.alibaba.druid:type=DruidDataSourceStat
337
// com.alibaba.druid:type=DruidDataSource,id={name}
338
```
339
340
### JMX Usage Examples
341
342
```java
343
import javax.management.MBeanServer;
344
import javax.management.ObjectName;
345
import java.lang.management.ManagementFactory;
346
347
// Access statistics via JMX
348
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
349
350
// DruidStatService MBean
351
ObjectName statServiceName = new ObjectName("com.alibaba.druid:type=DruidStatService");
352
String datasourceStats = (String) server.invoke(statServiceName, "service",
353
new Object[]{"/datasource.json"}, new String[]{String.class.getName()});
354
355
// SQL statistics with pagination
356
String sqlStats = (String) server.invoke(statServiceName, "service",
357
new Object[]{"/sql.json?page=1&perPageCount=100&orderBy=ExecuteCount&orderType=desc"},
358
new String[]{String.class.getName()});
359
360
// DataSource manager MBean
361
ObjectName managerName = new ObjectName("com.alibaba.druid:type=DruidDataSourceStat");
362
TabularData dataSourceList = (TabularData) server.getAttribute(managerName, "DataSourceList");
363
Long resetCount = (Long) server.getAttribute(managerName, "ResetCount");
364
365
// Reset all statistics
366
server.invoke(managerName, "reset", null, null);
367
```
368
369
## Performance Monitoring
370
371
### Histogram Analysis
372
373
```java
374
// Execution time histogram buckets
375
long[] histogram = sqlStat.getHistogramValues();
376
// Index 0: 0-1ms
377
// Index 1: 1-10ms
378
// Index 2: 10-100ms
379
// Index 3: 100ms-1s
380
// Index 4: 1s-10s
381
// Index 5: 10s-100s
382
// Index 6: 100s-1000s
383
// Index 7: >1000s
384
385
// Analyze performance distribution
386
long totalExecutions = sqlStat.getExecuteCount();
387
long slowExecutions = histogram[4] + histogram[5] + histogram[6] + histogram[7];
388
double slowPercentage = (double) slowExecutions / totalExecutions * 100;
389
390
System.out.println("Slow executions (>1s): " + slowPercentage + "%");
391
```
392
393
### Active Connection Monitoring
394
395
```java
396
// Monitor active connections and detect leaks
397
DruidStatService statService = DruidStatService.getInstance();
398
String activeConnectionsJson = statService.service("/activeConnectionStackTrace.json");
399
400
// Parse JSON to analyze connection stack traces
401
// Identify potential connection leaks and problematic code paths
402
```
403
404
## Statistics Reset and Management
405
406
### Reset Operations
407
408
```java
409
// Reset individual DataSource statistics
410
JdbcDataSourceStat stat = dataSource.getDataSourceStat();
411
stat.reset();
412
413
// Reset all DataSource statistics via manager
414
DruidDataSourceStatManager.getInstance().reset();
415
416
// Reset via StatService
417
DruidStatService statService = DruidStatService.getInstance();
418
if (statService.isResetEnable()) {
419
statService.service("/reset-all.json");
420
statService.service("/log-and-reset.json"); // Log before reset
421
}
422
```
423
424
### Periodic Statistics Collection
425
426
```java
427
import java.util.concurrent.ScheduledExecutorService;
428
import java.util.concurrent.Executors;
429
import java.util.concurrent.TimeUnit;
430
431
// Automated statistics collection
432
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
433
434
scheduler.scheduleAtFixedRate(() -> {
435
DruidStatService statService = DruidStatService.getInstance();
436
437
// Collect current statistics
438
String datasourceStats = statService.service("/datasource.json");
439
String sqlStats = statService.service("/sql.json?orderBy=ExecuteCount");
440
441
// Send to monitoring system
442
sendToMonitoringSystem(datasourceStats, sqlStats);
443
444
// Optional: Reset statistics after collection
445
if (shouldReset()) {
446
statService.service("/reset-all.json");
447
}
448
}, 0, 60, TimeUnit.SECONDS);
449
```
450
451
## Complete Monitoring Setup Example
452
453
```java
454
import com.alibaba.druid.pool.DruidDataSource;
455
import com.alibaba.druid.filter.stat.StatFilter;
456
import com.alibaba.druid.stat.DruidStatService;
457
458
public class DruidMonitoringConfiguration {
459
460
public static DruidDataSource createMonitoredDataSource() {
461
// Create DataSource with monitoring
462
DruidDataSource dataSource = new DruidDataSource();
463
dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
464
dataSource.setUsername("dbuser");
465
dataSource.setPassword("dbpass");
466
467
// Configure StatFilter
468
StatFilter statFilter = new StatFilter();
469
statFilter.setSlowSqlMillis(3000); // 3 second slow SQL threshold
470
statFilter.setLogSlowSql(true); // Log slow SQL
471
statFilter.setMergeSql(true); // Merge similar queries
472
statFilter.setConnectionStackTraceEnable(true); // Debug connection leaks
473
474
dataSource.getProxyFilters().add(statFilter);
475
476
// Enable reset functionality
477
DruidStatService.getInstance().setResetEnable(true);
478
479
// Register MBeans for JMX access
480
DruidStatService.registerMBean();
481
482
return dataSource;
483
}
484
485
public static void printStatistics(DruidDataSource dataSource) {
486
JdbcDataSourceStat stat = dataSource.getDataSourceStat();
487
488
// DataSource metrics
489
System.out.println("Active Connections: " + stat.getConnectionActiveCount());
490
System.out.println("Total Connections: " + stat.getConnectionConnectCount());
491
System.out.println("Connection Errors: " + stat.getConnectionConnectErrorCount());
492
System.out.println("Commits: " + stat.getConnectionCommitCount());
493
System.out.println("Rollbacks: " + stat.getConnectionRollbackCount());
494
495
// SQL statistics
496
Map<String, JdbcSqlStat> sqlStats = stat.getSqlStatMap();
497
System.out.println("Unique SQL statements: " + sqlStats.size());
498
499
for (Map.Entry<String, JdbcSqlStat> entry : sqlStats.entrySet()) {
500
JdbcSqlStat sqlStat = entry.getValue();
501
if (sqlStat.getExecuteCount() > 0) {
502
System.out.printf("SQL: %s%n", entry.getKey());
503
System.out.printf(" Executions: %d, Errors: %d%n",
504
sqlStat.getExecuteCount(), sqlStat.getExecuteErrorCount());
505
System.out.printf(" Avg Time: %.2fms, Max Time: %dms%n",
506
sqlStat.getExecuteMillisMean(), sqlStat.getExecuteMillisMax());
507
}
508
}
509
}
510
}
511
```
512
513
This comprehensive monitoring framework provides detailed visibility into database performance, connection usage, SQL execution patterns, and system health, enabling effective performance tuning, troubleshooting, and capacity planning.