Gearman Admin Interface
by Mike
I have recently been playing with gearman for a big project for one of our clients here at Sysdom. Getting it up and running was super easy, but we needed to integrate monitoring into our admin pages, so here is a little piece of code to get you up and running…
<?php error_reporting(E_ALL); echo "Queues\n"; $service_port = 4730; //$address = gethostbyname('www.example.com'); $address='127.0.0.1'; $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($socket === false) { echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n"; } //echo "Attempting to connect to '$address' on port '$service_port'..."; $result = socket_connect($socket, $address, $service_port); if ($result === false) { echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n"; } $in = "status\n"; $out = ''; socket_write($socket, $in, strlen($in)); while ($out = socket_read($socket, 2048,PHP_NORMAL_READ)) { echo "$out"; if ($out==".\n") break; } socket_close($socket); ?>
Yes, it is a quick and dirty proof of concept, but I hope this will help other people with monitoring gearman in their own apps.
Output is pretty simple:
root@debian:~# php gmstatus.php Queues test 1 0 0 reverse 0 0 1 .
with the function, total jobs in queue, running jobs and available workers seperated by tabs.
Note: yes, I know there is the PEAR library for doing the same, but adding it when you are using the PECL extension is an extra dependency that we’d rather not have.
The gearman admin protocol is available here, but I’ll repost the snippet so people have an easy reference to it.
Administrative Protocol ----------------------- The Gearman job server also supports a text-based protocol to pull information and run some administrative tasks. This runs on the same port as the binary protocol, and the server differentiates between the two by looking at the first character. If it is a NULL (\0), then it is binary, if it is non-NULL, that it attempts to parse it as a text command. The following commands are supported: workers This sends back a list of all workers, their file descriptors, their IPs, their IDs, and a list of registered functions they can perform. The list is terminated with a line containing a single '.' (period). The format is: FD IP-ADDRESS CLIENT-ID : FUNCTION ... Arguments: - None. status This sends back a list of all registered functions. Next to each function is the number of jobs in the queue, the number of running jobs, and the number of capable workers. The columns are tab separated, and the list is terminated with a line containing a single '.' (period). The format is: FUNCTION\tTOTAL\tRUNNING\tAVAILABLE_WORKERS Arguments: - None. maxqueue This sets the maximum queue size for a function. If no size is given, the default is used. If the size is negative, then the queue is set to be unlimited. This sends back a single line with "OK". Arguments: - Function name. - Optional maximum queue size. shutdown Shutdown the server. If the optional "graceful" argument is used, close the listening socket and let all existing connections complete. Arguments: - Optional "graceful" mode. version Send back the version of the server. Arguments: - None. The Perl version also has a 'gladiator' command that uses the 'Devel::Gladiator' Perl module and is used for debugging.
I hope someone finds this useful and feel free to send any comments to mike at technomonk dot com
tags: