001 /** 002 * 003 * Licensed to the Apache Software Foundation (ASF) under one or more 004 * contributor license agreements. See the NOTICE file distributed with 005 * this work for additional information regarding copyright ownership. 006 * The ASF licenses this file to You under the Apache License, Version 2.0 007 * (the "License"); you may not use this file except in compliance with 008 * the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 019 package org.apache.geronimo.tomcat.stats; 020 021 import java.util.Iterator; 022 import java.util.Set; 023 024 import javax.management.MBeanServer; 025 import javax.management.ObjectInstance; 026 import javax.management.ObjectName; 027 import javax.management.j2ee.statistics.Stats; 028 029 import org.apache.catalina.core.StandardContext; 030 import org.apache.commons.logging.Log; 031 import org.apache.commons.logging.LogFactory; 032 import org.apache.tomcat.util.modeler.Registry; 033 import org.apache.geronimo.management.stats.WebModuleStatsImpl; 034 035 /** 036 * Query MBeanServer and provide jsr77 Stats for module, i.e. a webapp 037 * 038 * @version $Revision: 511136 $ $Date: 2007-02-23 17:12:09 -0500 (Fri, 23 Feb 2007) $ 039 */ 040 041 public class ModuleStats { 042 043 private static final Log log = LogFactory.getLog(ModuleStats.class); 044 045 private MBeanServer mBeanServer = null; 046 047 private ObjectName mgrName; 048 049 private WebModuleStatsImpl stats = new WebModuleStatsImpl(); 050 051 public ModuleStats(StandardContext context) { 052 assert context != null; 053 // Retrieve the MBean server 054 mBeanServer = Registry.getRegistry(null, null).getMBeanServer(); 055 056 try { 057 // org.apache.commons.modeler.BaseModelMBean@Geronimo:type=Manager,path=/,host=localhost 058 mgrName = new ObjectName("*:type=Manager,*"); 059 } catch (Exception ex) { 060 log.error("Error - " + ex.toString()); 061 } 062 // Query Session Managers 063 Set set = mBeanServer.queryMBeans(mgrName, null); 064 Iterator iterator = set.iterator(); 065 ObjectName objectName; 066 while (iterator.hasNext()) { 067 ObjectInstance oi = (ObjectInstance) iterator.next(); 068 objectName = oi.getObjectName(); 069 if (objectName.getKeyProperty("path").indexOf(context.getPath()) > -1) { 070 mgrName = objectName; 071 break; 072 073 } 074 } 075 076 // initialize static values 077 stats.setProcessingTime(context.getProcessingTime()); 078 stats.setStartupTime(context.getStartupTime()); 079 stats.setTldScanTime(context.getTldScanTime()); 080 } 081 082 public Stats getStats() { 083 // Initialize startTime for all statistics 084 stats.setStartTime(); 085 // get transient statistics 086 updateStats(stats); 087 return stats; 088 } 089 090 public Stats updateStats() { 091 // get transient statistics 092 updateStats(stats); 093 return stats; 094 } 095 096 /* 097 * return updated value of all trainsient statistics 098 * 099 */ 100 private void updateStats(WebModuleStatsImpl stats) { 101 stats.setLastSampleTime(); 102 103 // transient data 104 try { 105 int maxActive = ((Integer) (mBeanServer.getAttribute(mgrName, 106 "maxActive"))).intValue(); 107 int sessionMaxAliveTime = ((Integer) (mBeanServer.getAttribute( 108 mgrName, "sessionMaxAliveTime"))).intValue(); 109 int sessionAverageAliveTime = ((Integer) (mBeanServer.getAttribute( 110 mgrName, "sessionAverageAliveTime"))).intValue(); 111 int activeSessions = ((Integer) (mBeanServer.getAttribute(mgrName, 112 "activeSessions"))).intValue(); 113 int rejectedSessions = ((Integer) (mBeanServer.getAttribute( 114 mgrName, "rejectedSessions"))).intValue(); 115 int expiredSessions = ((Integer) (mBeanServer.getAttribute(mgrName, 116 "expiredSessions"))).intValue(); 117 int sessionCounter = ((Integer) (mBeanServer.getAttribute(mgrName, 118 "sessionCounter"))).intValue(); 119 120 stats.setSessionAliveTime(maxActive, -1, sessionMaxAliveTime, 121 sessionAverageAliveTime * maxActive); 122 stats.setRejectedSessionCount(rejectedSessions); 123 stats.setExpiredSessionCount(expiredSessions); 124 stats.setActiveSessionCount(activeSessions); 125 stats.setSessionCount(sessionCounter); 126 127 } catch (Exception ex) { 128 log.error("Error getting attribute " + mgrName + " " + ex.toString()); 129 } 130 131 } 132 133 }