EclipseLink supports a profiling and monitoring API through its SessionProfiler interface. This interface gives events that allows a profiler or monitoring service to record performance or metrics on the EclipseLink application.
As of EclipseLink 2.2 a PerformanceMonitor is provided to collect performance an metric information. When enabled the PerformanceMonitor will log the monitoring information at set intervals to the session log, allowing an application's performance to be analyzed.
Previous to EclipseLink 2.2, a PerformanceProfiler was provided, but it did not make use of the complete SessionProfiler API, and was only useful for profiling a single use case, not a multi-user server. A QueryMonitor was also provided that provided simple monitoring information on queries, but no detailed information.
The PerformanceMonitor is enabled through the
"eclipselink.profiler" persistence unit property in the persistence.xml file.
Persistence unit property
<property name="eclipselink.profiler" value="PerformanceMonitor"/>
The PerformanceMonitor metrics can also be accessed through the API instead of dumping to the log.
Integer cacheHits = (Integer)((PerformanceMonitor)session.getProfiler()).getOperationTimings().get(SessionProfiler.CacheHits);
To disable the monitor logging set the dump time to a large value.
Integer cacheHits = (Integer)((PerformanceMonitor)session.getProfiler()).setDumpTime(Integer.MAX_VALUE);
The profile weight can be configured for the PerformanceMonitor through the API. The default weight if the PerformanceMonitor is set is
By default no profiler is set for a persistence unit, so no profiling or monitoring is done.
The higher the level of monitoring the larger the performance overhead of the monitor.
|NONE||No monitoring is done.|
|NORMAL||Metrics are tracked, but profiling is not done.|
|HEAVY||Metrics and profiling times are tracked.|
|ALL||Metrics and profiling times are tracked.|
The PerformanceMonitor displays three types of information, counters, info, and timers.
A counter count the occurrence of an operation, such a a query, or cache hit.
An info records some static information, such as the time a session was connected, or the session's name.
A timer accumulates the total amount of time (in nano seconds) that a particular operation or query type took.
Performance Monitor:1279113281664 Operation Value (ns) Counter:CacheHits 1,375,664 Counter:CacheMisses 327 Counter:ClientSessionCreates 1,204,817 Counter:ConnectCalls 2 Counter:DataModifyQuery 48 Counter:DataModifyQuery:inventory 21 Counter:DataModifyQuery:order 27 Counter:DeleteObjectQuery 67,792 Counter:DeleteObjectQuery:Customer 1 ... Counter:ReadAllQuery 1,041,767. Counter:ReadAllQuery:Item.findByCategory 733,827 Counter:ReadAllQuery:Item.findByCategory:CacheHits 733,779 Counter:ReadAllQuery:Item.findByCategory:CacheMisses 50 ... Counter:ReadObjectQuery 1,058,273 Counter:ReadObjectQuery:Item:item 130,063 Counter:ReadObjectQuery:Item:item:CacheHits 130,063 Counter:ReadObjectQuery:Item:item:CacheMisses 1 Counter:UnitOfWorkCommits 72,568 Counter:UnitOfWorkCreates 471,491 Counter:UnitOfWorkRollbacks 1 Counter:UpdateObjectQuery 71,498 Counter:UpdateObjectQuery:Customer 62,531 ... Info:LoginTime Wed Jul 14 08:55:41 EDT 2010 Info:SessionName file:/scratch/user_domains/servers/mt-1/app.jar Timer:Caching 6,411,372,000 Timer:ConnectionManagement 17,225,641,000 Timer:DeleteObjectQuery 41,351,430,000 Timer:DeleteObjectQuery:Customer 4,441,000 Timer:DeleteObjectQuery:Customer:QueryPreparation 86,000 Timer:DeleteObjectQuery:Customer:SqlGeneration 28,000 Timer:DeleteObjectQuery:Customer:SqlPrepare 72,000 Timer:DeleteObjectQuery:Customer:StatementExecute 2,265,000 ... Timer:InsertObjectQuery 69,111,086,000 Timer:Logging 4,236,000 Timer:Merge 1,144,400,000 Timer:ObjectBuilding 31,914,397,000 Timer:QueryPreparation 984,396,000 Timer:ReadAllQuery 260,943,930,000 Timer:ReadAllQuery:Item:Item.findByCategory 14,790,333,000 Timer:ReadAllQuery:Item:Item.findByCategory:ObjectBuilding 250,959,000 Timer:ReadAllQuery:Item:Item.findByCategory:QueryPreparation 1,880,000 Timer:ReadAllQuery:Item:Item.findByCategory:RowFetch 113,552,000 Timer:ReadAllQuery:Item:Item.findByCategory:SqlGeneration 522,000 Timer:ReadAllQuery:Item:Item.findByCategory:SqlPrepare 2,055,000 Timer:ReadAllQuery:Item:Item.findByCategory:StatementExecute 107,382,000 ... Timer:Register 3,272,443,000 Timer:RowFetch 25,340,990,000 Timer:Sequencing 1,352,326,000 Timer:SqlGeneration 6,646,000 Timer:SqlPrepare 19,536,031,000 Timer:StatementExecute 508,589,220,000 Timer:TXAfterCompletion 1,854,152,000 Timer:TXBeforeCompletion 169,381,843,000 Timer:UnitOfWorkCommit 167,483,825,000 Timer:UpdateObjectQuery 46,440,589,000 Timer:UpdateObjectQuery:Customer 40,466,433,000 Timer:UpdateObjectQuery:Customer:QueryPreparation 867,496,000 Timer:UpdateObjectQuery:Customer:SqlGeneration 98,000 Timer:UpdateObjectQuery:Customer:SqlPrepare 1,319,333,000 Timer:UpdateObjectQuery:Customer:StatementExecute 32,901,366,000