このサーバーに関する統計 (ヒット、スレッド、ecc) を生成する Web サーバー (ジグソー) に属する httpdstatistics.java という Java クラスがあります。この情報を、私が作成した別のクラスにエクスポートします。このクラス httpdstatistics.java をプロジェクトにインポートし、get メソッドを呼び出してデータを取得するだけで十分ですか?
// httpdStatistics.java
// $Id: httpdStatistics.java,v 1.10 2003/02/25 17:51:43 ylafon Exp $
// (c) COPYRIGHT MIT and INRIA, 1996.
// Please first read the full copyright statement in file COPYRIGHT.html
package org.w3c.jigsaw.http;
import java.net.URL;
// FIXME
import org.w3c.jigsaw.http.socket.SocketClientFactory;
import org.w3c.jigsaw.http.socket.SocketClientFactoryStats;
/**
* This class maintains server wide statistics about hits.
* This class should probably be coded as a resource itself, and made
* accessible through a specific HTTPResource. I am just having fun
* for the time being.
*/
public class httpdStatistics {
protected httpd server = null ;
/**
* The min processing time in ms.
*/
protected long r_min = Long.MAX_VALUE ;
/**
* The min processing time in ms for dynamic content
*/
protected long rd_min = Long.MAX_VALUE ;
/**
* The URL that has been processed the fastest.
*/
protected URL u_min = null ;
/**
* The URL that has been processed the fastest for dynamic content
*/
protected URL ud_min = null ;
/**
* The maximum processing time in ms.
*/
protected long r_max = 0 ;
/**
* The maximum processing time in ms for dynamic content
*/
protected long rd_max = 0 ;
/**
* The URL that has been processed the slowest.
*/
protected URL u_max = null ;
/**
* The URL that has been processed the slowest for dynamic content
*/
protected URL ud_max = null ;
/**
* The total number of hits.
*/
protected long t_hits = 0 ;
/**
* The total number of hits for dynamic content
*/
protected long td_hits = 0 ;
/**
* The total number of emited bytes.
*/
protected long t_bytes = 0 ;
/**
* The total number of emited bytes for dynamic content
*/
protected long td_bytes = 0 ;
/**
* The total time spent in processing requests in ms.
*/
protected long t_req = 0 ;
/**
* The total time spent in processing requests in ms for dynamic content
*/
protected long td_req = 0 ;
/**
* The date at which the server was started (ms since Java epoch).
*/
protected long start_time = 0;
// FIXME temporary hack
protected SocketClientFactoryStats factoryStats = null;
protected boolean init = false;
/**
* Update the current statistics with the given request.
* @param client The client that processed the request.
* @param request The request that has been processed.
* @param nbytes The number of emited bytes in reply's body.
* @param duration The processing time of the request.
*/
protected synchronized void updateStatistics(Client client
, Request request, Reply reply
, int nbytes
, long duration) {
if (reply.isDynamic()) {
if ( duration > rd_max ) {
rd_max = duration ;
ud_max = request.getURL() ;
}
if ( duration < rd_min ) {
rd_min = duration ;
ud_min = request.getURL() ;
}
td_req += duration ;
td_bytes += nbytes ;
td_hits++ ;
} else {
if ( duration > r_max ) {
r_max = duration ;
u_max = request.getURL() ;
}
if ( duration < r_min ) {
r_min = duration ;
u_min = request.getURL() ;
}
t_req += duration ;
t_bytes += nbytes ;
t_hits++ ;
}
}
/**
* Get the current server load.
* @return A number between <strong>1</strong> and <strong>4</strong>.
*/
public int getServerLoad() {
if (!init) {
initFactoryStats();
}
if (factoryStats != null) {
return factoryStats.getLoadAverage();
}
// return server.pool.loadavg;
return -1;
}
/**
* Get the number of free threads in the server.
* @return The number of threads ready to server client requests.
*/
public int getFreeThreadCount() {
if (!init) {
initFactoryStats();
}
if (factoryStats != null) {
return factoryStats.getFreeConnectionsCount();
}
// return server.pool.freeCount;
return -1;
}
/**
* Get the number of idle threads in the server.
* Idle threads are the threads ready to accept more requests on a given
* connection.
* @return The number of idle threads.
*/
public int getIdleThreadCount() {
if (!init) {
initFactoryStats();
}
if (factoryStats != null) {
return factoryStats.getIdleConnectionsCount();
}
// return server.pool.idleCount;
return -1;
}
/**
* Get the total number of client threads.
* @return The total number of created threads.
*/
public int getTotalThreadCount() {
if (!init) {
initFactoryStats();
}
if (factoryStats != null) {
return factoryStats.getClientCount();
}
// return server.pool.clientCount;
return -1;
}
/**
* Get the total number of hits.
* @return The total number of processed requests since the server is up.
*/
public long getHitCount() {
return (t_hits+td_hits) ;
}
/**
* Get the total number of hits for dynamic content.
* @return The total number of processed requests since the server is up.
*/
public long getDynamicHitCount() {
return td_hits ;
}
/**
* Get the total number of hits for static content.
* @return The total number of processed requests since the server is up.
*/
public long getStaticHitCount() {
return t_hits ;
}
/**
* Get the mean request processing time.
* @return The average time to process a request.
*/
public long getMeanRequestTime() {
return ((t_hits+td_hits) > 0) ? (t_req+td_req) / (t_hits+td_hits) : -1;
}
/**
* Get the mean request processing time for dynamic content
* @return The average time to process a request.
*/
public long getMeanDynamicRequestTime() {
return (td_hits > 0) ? (td_req / td_hits) : -1;
}
/**
* Get the mean request processing time.
* @return The average time to process a request.
*/
public long getMeanStaticRequestTime() {
return (t_hits > 0) ? (t_req / t_hits) : -1;
}
/**
* Get the max request processing time.
* @return A long giving the maximum duration for a request.
*/
public long getMaxRequestTime() {
return Math.max(r_max,rd_max) ;
}
/**
* Get the max request processing time for dynamic content
* @return A long giving the maximum duration for a request.
*/
public long getMaxDynamicRequestTime() {
return rd_max ;
}
/**
* Get the max request processing time for static content
* @return A long giving the maximum duration for a request.
*/
public long getMaxStaticRequestTime() {
return r_max ;
}
/**
* Get the URL of the request that took the longest time to be processed.
* @return A String giving the URL of the corresponding request, or
* <strong>null</strong> if no request has been processed yet.
*/
public URL getMaxRequestURL() {
return (r_max > rd_max) ? u_max : ud_max ;
}
/**
* Get the min request processing time.
* @return A long giving the minimum request processing time.
*/
public long getMinRequestTime() {
return Math.min(r_min, rd_min) ;
}
/**
* Get the min request processing time for dynamic content
* @return A long giving the minimum request processing time.
*/
public long getMinDynamicRequestTime() {
return rd_min ;
}
/**
* Get the min request processing time.
* @return A long giving the minimum request processing time.
*/
public long getMinStaticRequestTime() {
return r_min ;
}
/**
* Get the URL of the request that took the smallest time to be processed.
* @return A String giving the URL of the corresponding request, or
* <strong>null</strong> if no request has been processed yet.
*/
public URL getMinRequestURL() {
return (r_min < rd_min) ? u_min : ud_min ;
}
/**
* Get the total number of bytes emited.
* @return A long giving the total number of bytes emited by the server.
* This count that not include the reply's header, but only the reply's
* body (or <em>entity</em> size).
*/
public long getEmittedBytes() {
return t_bytes + td_bytes ;
}
/**
* Get the time at which the server was started.
* @return A number of milliseconds since java epoch, giving the date
* at which the server started.
*/
public long getStartTime() {
return start_time;
}
/**
* As we can't start the after the server socket (client factory)
* we have to create when requested, which is always after the creation
* of the whole server..
*/
private void initFactoryStats() {
if (server.factory instanceof SocketClientFactory) {
SocketClientFactory f = (SocketClientFactory) server.factory;
factoryStats = new SocketClientFactoryStats(f);
}
init = true;
}
httpdStatistics (httpd server) {
this.server = server ;
this.start_time = System.currentTimeMillis();
}
}