001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018 package org.apache.geronimo.tomcat.stats; 019 020 import java.util.Iterator; 021 import java.util.Set; 022 023 import javax.management.MBeanServer; 024 import javax.management.ObjectInstance; 025 import javax.management.ObjectName; 026 import javax.management.j2ee.statistics.Stats; 027 028 import org.apache.commons.logging.Log; 029 import org.apache.commons.logging.LogFactory; 030 import org.apache.tomcat.util.modeler.Registry; 031 import org.apache.geronimo.management.stats.WebConnectorStatsImpl; 032 033 /** 034 * This will query MBeanServer and provide jsr77 Stats for connectors. 035 * 036 * @version $Revision: 511136 $ $Date: 2007-02-23 17:12:09 -0500 (Fri, 23 Feb 2007) $ 037 */ 038 public class ConnectorStats { 039 private static final Log log = LogFactory.getLog(ModuleStats.class); 040 protected MBeanServer mBeanServer = null; 041 042 protected Registry registry; 043 044 private ObjectName grpName; 045 046 private ObjectName tpName; 047 048 private WebConnectorStatsImpl stats = new WebConnectorStatsImpl(); 049 050 public ConnectorStats() { 051 // Retrieve the MBean server 052 registry = Registry.getRegistry(null, null); 053 mBeanServer = Registry.getRegistry(null, null).getMBeanServer(); 054 try { 055 grpName = new ObjectName("*:type=GlobalRequestProcessor,*"); 056 tpName = new ObjectName("*:type=ThreadPool,*"); 057 } catch (Exception ex) { 058 log.error("Error - " + ex.toString()); 059 } 060 } 061 062 public Stats getStats(String port) { 063 stats.setStartTime(); 064 updateStats(stats, port); 065 return stats; 066 067 } 068 069 public Stats updateStats(String port) { 070 updateStats(stats, port); 071 return stats; 072 073 } 074 075 private void updateStats(WebConnectorStatsImpl stats, String port) { 076 Iterator iterator; 077 Set set; 078 ObjectName objectName; 079 try { 080 // Query Thread Pools 081 set = mBeanServer.queryMBeans(tpName, null); 082 iterator = set.iterator(); 083 while (iterator.hasNext()) { 084 ObjectInstance oi = (ObjectInstance) iterator.next(); 085 objectName = oi.getObjectName(); 086 if (objectName.getKeyProperty("name").indexOf(port) > -1) { 087 tpName = objectName; 088 break; 089 } 090 } 091 // Query Global Request Processors 092 set = mBeanServer.queryMBeans(grpName, null); 093 iterator = set.iterator(); 094 while (iterator.hasNext()) { 095 ObjectInstance oi = (ObjectInstance) iterator.next(); 096 objectName = oi.getObjectName(); 097 if (objectName.getKeyProperty("name").indexOf(port) > -1) { 098 grpName = objectName; 099 break; 100 } 101 } 102 stats.setLastSampleTime(); 103 // Any http connector ! 104 long maxTime = ((Long) (mBeanServer.getAttribute(grpName, "maxTime"))).longValue(); 105 long processingTime = ((Long) (mBeanServer.getAttribute(grpName, "processingTime"))).longValue(); 106 int requestCount = ((Integer) (mBeanServer.getAttribute(grpName, "requestCount"))).intValue(); 107 int errorCount = ((Integer) (mBeanServer.getAttribute(grpName, "errorCount"))).intValue(); 108 long bytesReceived = ((Long) (mBeanServer.getAttribute(grpName, "bytesReceived"))).longValue(); 109 long bytesSent = ((Long) (mBeanServer.getAttribute(grpName, "bytesSent"))).longValue(); 110 stats.setRequestTime(requestCount, -1, maxTime, processingTime); 111 stats.setErrorCount(errorCount); 112 stats.setBytesSentCount(bytesSent); 113 stats.setBytesReceivedCount(bytesReceived); 114 long openConnections = 0; 115 // TODO find these 116 //long openConnections = ((Long) (mBeanServer.getAttribute(grpName, "countOpenConnections"))).longValue(); 117 long maxOpenConnections = 0; 118 //long maxOpenConnections = ((Long) (mBeanServer.getAttribute(grpName, "maxOpenConnections"))).longValue(); 119 stats.setOpenConnection(openConnections, maxOpenConnections, 0); 120 // ThreadPool 121 int currentThreadsBusy = ((Integer) (mBeanServer.getAttribute(tpName, "currentThreadsBusy"))).intValue(); 122 //stats.setActiveRequestCount(currentThreadsBusy); ?? 123 int currentThreadCount = ((Integer) (mBeanServer.getAttribute(tpName, "currentThreadCount"))).intValue(); 124 // these are available from "*:type=Connector,*" 125 //int minSpareThreads = ((Integer) (mBeanServer.getAttribute(tpName, "minSpareThreads"))).intValue(); 126 //int maxSpareThreads = ((Integer) (mBeanServer.getAttribute(tpName, "maxSpareThreads"))).intValue(); 127 int maxThreads = ((Integer) (mBeanServer.getAttribute(tpName, "maxThreads"))).intValue(); 128 // keepAliveCount is also available 129 stats.setBusyThreads(currentThreadsBusy, currentThreadCount, 0, maxThreads, 0); 130 // TODO - spareThreads (current-busy, maxSpareThread, minSpareThreads) 131 } catch (Exception ex) { 132 log.error("Error getting attribute " + grpName + " " + ex.toString()); 133 } 134 135 } 136 }