NAME

Apache::Scoreboard - Perl interface to the Apache scoreboard structure

SYNOPSIS

# Configuration in httpd.conf:
# mod_status should be compiled in (it is by default)
ExtendedStatus On

# in your perl code:
 use Apache::Scoreboard ();

 #inside httpd
 my $image = Apache::Scoreboard->image;

 #outside httpd
 my $image = Apache::Scoreboard->fetch("http://localhost/scoreboard");

DESCRIPTION

Apache keeps track of server activity in a structure known as the scoreboard. There is a slot in the scoreboard for each child server and its workers (be it threads or processes), containing information such as status, access count, bytes served and cpu time, and much more. This same information is used by mod_status to provide current server statistics in a human readable form. Apache::Scoreboard provides the Perl API to access the scoreboard. Apache::VMonitor is an extended equivalent of mod_status written in Perl.

The Apache::Scoreboard Methods

fetch

This method fetches the Apache::Scoreboard object from a remote server, which must contain the following configuration:

PerlModule Apache::Scoreboard
<Location /scoreboard>
   SetHandler modperl
   PerlHandler Apache::Scoreboard::send
   order deny,allow
   deny from all
   #same config you have for mod_status
   allow from 127.0.0.1 ...
</Location>

If the remote server is not configured to use mod_perl or simply for a smaller footprint, see the apxs directory for the C module mod_scoreboard_send, which once built (like any other Apache module) can be configured as following:

LoadModule scoreboard_send_module libexec/mod_scoreboard_send.so

<Location /scoreboard>
   SetHandler scoreboard-send-handler
   order deny,allow
   deny from all
   allow from 127.0.0.1 ...
</Location>

The image can then be fetched via http:

my $image = Apache::Scoreboard->fetch("http://remote-hostname/scoreboard");

Note that if the the code processing the scoreboard running under the same server, you should be using the image() method, which retrieves the scoreboard directly from the server memory.

fetch_store

Apache::Scoreboard->fetch_store($retrieve_url, $local_filename);

Fetches a remote scoreboard and stores it in the file.

see retrieve() and store().

freeze

my $image = Apache::Scoreboard->fetch($pool, $retrieve_url);

Freeze the image so it can be later restored and used. The frozen image for example can be stored on the filesystem and then read in:

my $image = Apache::Scoreboard->fetch($pool, $retrieve_url);
my $frozen_image = $image->freeze;
Apache::Scoreboard->store($frozen_image, $store_file);

See store().

image

This method returns an object for accessing the scoreboard structure when running inside the server:

my $image = Apache::Scoreboard->image;

If you want to fetch a scoreboard from a different server, or if the code runs outside the mod_perl server use the fetch() or the fetch_store() methods.

parent_score

This method returns a object of the first parent score entry in the list, blessed into the Apache::ScoreboardParentScore class:

my $parent_score = $image->parent_score;

Iterating over the list of scoreboard slots is done like so:

for (my $parent_score = $image->parent_score;
     $parent_score;
     $parent_score = $parent_score->next) {
    my $pid = $parent_score->pid; # pid of the child

    # Apache::ScoreboardWorkerScore object
    my $wscore = $parent_score->worker_score;
    ...
}

pids

Returns an reference to an array containing all child pids:

my $pids = $image->pids;

META: check whether we get them all (if there is a hole due to a proc in the middle of the list that was killed)

retrieve

The fetch_store method is used to fetch the image once from a remote server and save it to disk. The image can then be read by other processes with the retrieve function. This way, multiple processes can access a remote scoreboard with just a single request to the remote server. Example:

Apache::Scoreboard->fetch_store($retrieve_url, $local_filename);

my $image = Apache::Scoreboard->retrieve($local_filename);

send

Apache::Scoreboard::send();

a response handler which sends the scoreboard image. See fetch() for details.

server_limit

Returns a server limit for the given Apache server.

my $server_limit = $image->server_limit;

use this instead of the deprecated Apache::Const::SERVER_LIMIT constant.

store

Apache::Scoreboard->store($frozen_image, $store_file);

stores a frozen image on the filesystem.

thaw

my $thawed_image = Apache::Scoreboard->thaw($pool, $frozen_image);

thaws a frozen image, turning it into the Apache::Scoreboard object.

thread_limit

Returns a threads limit per process for the given image.

my $thread_limit = $image->thread_limit;

use this instead of the deprecated Apache::Const::THREAD_LIMIT constant.

The Apache::ScoreboardParentScore Class

To get the Apache::ScoreboardParentScore object use the $image-parent_score()|/parent_score> and $parent_score-next()|/next> methods.

next

Returns the next Apache::ScoreboardParentScore object in the list of parent scores (servers):

my $parent_score_next = $parent_score->next;

next_active_worker_score

my $worker_score_next = $parent_score->next_active_worker_score($worker_score)

Returns the next active Apache::ScoreboardWorkerScore object of the given parent score. An active worker is defined as a worker that does something at the moment this method was called (for the live image) or if it did something when the snapshot of the scoreboard was taken (via send() or freeze().

This is how to traverse all active workers for the given parent score:

for (my $worker_score = $parent_score->worker_score;
        $worker_score;
        $worker_score = $parent_score->next_active_worker_score($worker_score)
    ) {
    # do something with $worker_score
}

See also: worker_score(), next_live_worker_score() and next_worker_score().

next_live_worker_score

my $worker_score_next = $parent_score->next_live_worker_score($worker_score)

Returns the next live Apache::ScoreboardWorkerScore object of the given parent score. The live worker is defined as a worker that have served/serves at least one request and isn't yet dead.

This is how to traverse all workers for the given parent score:

for (my $worker_score = $parent_score->worker_score;
        $worker_score;
        $worker_score = $parent_score->next_live_worker_score($worker_score)
    ) {
    # do something with $worker_score
}

See also: worker_score(), next_active_worker_score() and next_worker_score().

next_worker_score

my $worker_score_next = $parent_score->next_worker_score($worker_score)

Returns the next Apache::ScoreboardWorkerScore object of the given parent score.

This is how to traverse all workers for the given parent score:

for (my $worker_score = $parent_score->worker_score;
        $worker_score;
        $worker_score = $parent_score->next_worker_score($worker_score)
    ) {
    # do something with $worker_score
}

See also: worker_score(), next_active_worker_score() and next_live_worker_score().

pid

Returns the pid of the parent score (server):

my $pid = $parent_score->pid;

worker_score

Returns the first Apache::ScoreboardWorkerScore object of the given parent score:

my $worker_score = $parent_score->worker_score;

See also: next_active_worker_score(), next_live_worker_score() and next_worker_score().

The Apache::ScoreboardWorkerScore Methods

To get the Apache::ScoreboardWorkerScore object use the following methods: worker_score(), next_active_worker_score(), next_live_worker_score() and next_worker_score().

access_count

The access count of the worker:

my $count = $worker_score->access_count;

bytes_served

Total number of bytes served by this child:

my $bytes = $worker_score->bytes_served;

client

The ip address or hostname of the client:

#e.g.: 127.0.0.1
my $client = $worker_score->client;

conn_bytes

Number of bytes served by the last connection in this child:

my $bytes = $worker_score->conn_bytes;

conn_count

Number of requests served by the last connection in this child:

my $count = $worker_score->conn_count;

most_recent

META: complete

my_access_count

META: complete

my_bytes_served

META: complete

request

The first 64 characters of the HTTP request:

#e.g.: GET /scoreboard HTTP/1.0
my $request = $worker_score->request;

req_time

Returns the time taken to process the request in milliseconds:

my $req_time = $worker_score->req_time;

This feature was ported in Apache 2.0.53.

start_time

In a list context this method returns a 2 element list with the seconds and microseconds since the epoch, when the request was started. In scalar context it returns floating seconds like Time::HiRes::time()

my($tv_sec, $tv_usec) = $worker_score->start_time;

my $secs = $worker_score->start_time;

META: as of Apache 2.0.53 it's yet unavailable (needs to be ported)

status

$status = $worker_score->status();

This method returns the status of the given worker as a dual-variable. In the string context it gives a single letter, which can be mapped to the long description via the following list

"_" Waiting for Connection
"S" Starting up
"R" Reading Request
"W" Sending Reply
"K" Keepalive (read)
"D" DNS Lookup
"C" Closing connection
"L" Logging
"G" Gracefully finishing
"I" Idle cleanup of worker
"." Open slot with no current process

In the numerical context it returns the numerical status (which corresponds to a C define like SERVER_DEAD, SERVER_READY, etc) for which we don't really have the use at the moment. You should use the string context to get the status.

stop_time

In a list context this method returns a 2 element list with the seconds and microseconds since the epoch, when the request was finished. In scalar context it returns floating seconds like Time::HiRes::time()

my($tv_sec, $tv_usec) = $worker_score->stop_time;

my $secs = $worker_score->stop_time;

META: as of Apache 2.0.53 it's yet unavailable (needs to be ported)

thread_num

XXX

tid

XXX

times

In a list context, returns a four-element list giving the user and system times, in seconds, for this process and the children of this process.

my($user, $system, $cuser, $csystem) = $worker_score->times;

In a scalar context, returns the overall CPU percentage for this worker:

my $cpu = $worker_score->times;

vhost

Returns the vhost string if there is one.

my $vhost = $worker_score->vhost;

Outside of mod_perl Usage

Apache::DummyScoreboard is used internally if the code is not running under mod_perl. It has almost the same functionality with some limitations. See the Apache::DummyScoreboard manpage for more info.

SEE ALSO

Apache::VMonitor(3), GTop(3)

AUTHOR

Doug MacEachern

Stas Bekman

Malcolm J Harwood