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.management.geronimo.stats;
019    
020    import javax.management.j2ee.statistics.CountStatistic;
021    import javax.management.j2ee.statistics.RangeStatistic;
022    import javax.management.j2ee.statistics.TimeStatistic;
023    
024    import org.apache.geronimo.management.stats.StatsImpl;
025    import org.apache.geronimo.management.stats.StatisticImpl;
026    import org.apache.geronimo.management.stats.CountStatisticImpl;
027    import org.apache.geronimo.management.stats.RangeStatisticImpl;
028    import org.apache.geronimo.management.stats.BoundedRangeStatisticImpl;
029    import org.apache.geronimo.management.stats.TimeStatisticImpl;
030    
031    /**
032     * Geronimo implementation of the JSR-77 style WebConnectorStats interface. This
033     * is not required by JSR-77, but provides useful statistics. This will be
034     * discovered by mejb using 'stats' attribute.
035     * 
036     * @version $Revision: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
037     */
038    
039    public class TomcatWebConnectorStatsImpl extends StatsImpl implements TomcatWebConnectorStats {
040        private TimeStatisticImpl requestTime; // total, max, count
041    
042        private CountStatisticImpl activeRequestCount;
043    
044        private CountStatisticImpl errorCount;
045    
046        private CountStatisticImpl bytesSentCount;
047    
048        private CountStatisticImpl bytesReceivedCount;
049        
050        // these come from ThreadPool
051        private RangeStatisticImpl openConnectionCount; 
052        
053        private CountStatisticImpl busyThreadCount;
054        
055        // TODO - change the name to BoundedRangeStatisticsImpl
056        private BoundedRangeStatisticImpl busyThreads;
057        // TODO - spareThreads metrics = current - busy, maxSpareThreads, minSpareThreads 
058    
059        public TomcatWebConnectorStatsImpl() {
060            requestTime = new TimeStatisticImpl("Request Time", StatisticImpl.UNIT_TIME_MILLISECOND,
061                    "The time to process all requests");
062            activeRequestCount = new CountStatisticImpl("Active Request Count", StatisticImpl.UNIT_COUNT,
063                    "currently active requests ", 0);
064            errorCount = new CountStatisticImpl("Error Count", StatisticImpl.UNIT_COUNT,
065                    "The numbet of Errors during the observed period", 0);
066            bytesSentCount = new CountStatisticImpl("Bytes Sent", StatisticImpl.UNIT_COUNT,
067                    "The number of bytes sent during the observerd period", 0);
068            bytesReceivedCount = new CountStatisticImpl("Bytes Received", StatisticImpl.UNIT_COUNT,
069                    "The number of bytes received during the observerd period", 0);
070            openConnectionCount = new RangeStatisticImpl("" + "Open Connections", StatisticImpl.UNIT_COUNT,
071                    "Range for connections opened during the observed period", 0); // all 0's
072            busyThreads = new BoundedRangeStatisticImpl("Busy Threads", StatisticImpl.UNIT_COUNT,
073                    "BoundedRange for Threads currently busy serving requests", 0, 0, 0);
074            addStat("RequestTime", requestTime); // better name
075            addStat("activeRequestCount", activeRequestCount);
076            addStat("errorCount", errorCount);
077            addStat("bytesSent", bytesSentCount);
078            addStat("bytesReceived", bytesReceivedCount);
079            addStat("openConnectionCount", openConnectionCount);
080            addStat("busyThreads", busyThreads);
081        }
082    
083        public RangeStatistic getActiveRequestCount() {
084            // TODO 
085            return null;
086        }
087    
088        public TimeStatistic getRequestTime() {
089            return requestTime;
090        }
091    
092        public CountStatistic getErrorCount() {
093            return errorCount;
094        }
095    
096        public CountStatistic getBytesSentCount() {
097            return bytesSentCount;
098        }
099    
100        public CountStatistic getBytesReceivedCount() {
101            return bytesReceivedCount;
102        }
103       
104        public RangeStatistic getOpenConnectionCount() {
105            return openConnectionCount;
106        }
107        
108        // TODO - Move this to container statistics
109        public RangeStatistic getSpareThreadCount() {
110            return null;
111        }
112        
113        /**
114         * These setters are used by native implementation
115         */
116        public void setBytesReceivedCount(long bytesReceived) {
117            this.bytesReceivedCount.setCount(bytesReceived);
118        }
119    
120        public void setBytesSentCount(long bytesSent) {
121            this.bytesSentCount.setCount(bytesSent);
122        }
123    
124        public void setActiveRequestCount(int activeRequestCount) {
125            this.activeRequestCount.setCount(activeRequestCount);
126        }
127    
128        public void setErrorCount(int errorCount) {
129            this.errorCount.setCount(errorCount);
130        }
131    
132        public void setRequestTime(int count, long minTime, long maxTime, long totalTime) {
133            this.requestTime.setCount(count);
134            this.requestTime.setMinTime(minTime);
135            this.requestTime.setMaxTime(maxTime);
136            this.requestTime.setTotalTime(totalTime);
137        }
138     
139        public void setOpenConnection(long current, long highMark, long lowMark) {
140            openConnectionCount.setCurrent(current);
141            openConnectionCount.setHighWaterMark(highMark);
142            openConnectionCount.setLowWaterMark(lowMark);
143        }
144        
145        public void setBusyThreads(long current, long highWaterMark, long lowWaterMark,
146                long upperBound, long lowerBound) {
147            busyThreads.setCurrent(current);
148            busyThreads.setHighWaterMark(highWaterMark);
149            busyThreads.setLowWaterMark(lowWaterMark); //0?
150            busyThreads.setLowerBound(lowerBound); //0?
151            busyThreads.setUpperBound(upperBound);  // always maxThreads
152        }
153        
154        /**
155         * Used to access the native implementation in order to call setters
156         * TODO implement these if needed by console
157         */
158        public RangeStatisticImpl getActiveRequestCountImpl() {
159            return null;
160        }
161    
162        public TimeStatisticImpl getRequestDurationImpl() {
163            return null;
164        }
165    
166        public CountStatisticImpl getTotalErrorCountImpl() {
167            return null;
168        }
169    
170        public CountStatistic getTotalRequestCountImpl() {
171            return null;
172        }
173    
174    }