问题
I want to be able to query a gearman server to determine how many instances of a worker I have running (basically I want to make sure that RunTaskA
is available and RunTaskB
is available if there are no workers handling those tasks, I want to be able to send an alert out.
Is there any way to do this?
Also: Mad props if you know of a PHP way to query the gearman server.
Edit: I know about the PHP gearman extension that is available natively, but I am not looking for a task submission extension, I need something that allows me to query the gearman server and see how many workers are serving a specific task.
回答1:
class Waps_Gearman_Server {
/**
* @var string
*/
protected $host = "127.0.0.1";
/**
* @var int
*/
protected $port = 4730;
/**
* @param string $host
* @param int $port
*/
public function __construct($host=null,$port=null){
if( !is_null($host) ){
$this->host = $host;
}
if( !is_null($port) ){
$this->port = $port;
}
}
/**
* @return array | null
*/
public function getStatus(){
$status = null;
$handle = fsockopen($this->host,$this->port,$errorNumber,$errorString,30);
if($handle!=null){
fwrite($handle,"status\n");
while (!feof($handle)) {
$line = fgets($handle, 4096);
if( $line==".\n"){
break;
}
if( preg_match("~^(.*)[ \t](\d+)[ \t](\d+)[ \t](\d+)~",$line,$matches) ){
$function = $matches[1];
$status['operations'][$function] = array(
'function' => $function,
'total' => $matches[2],
'running' => $matches[3],
'connectedWorkers' => $matches[4],
);
}
}
fwrite($handle,"workers\n");
while (!feof($handle)) {
$line = fgets($handle, 4096);
if( $line==".\n"){
break;
}
// FD IP-ADDRESS CLIENT-ID : FUNCTION
if( preg_match("~^(\d+)[ \t](.*?)[ \t](.*?) : ?(.*)~",$line,$matches) ){
$fd = $matches[1];
$status['connections'][$fd] = array(
'fd' => $fd,
'ip' => $matches[2],
'id' => $matches[3],
'function' => $matches[4],
);
}
}
fclose($handle);
}
return $status;
}
}
回答2:
For quick checking, I use this bash one-liner:
# (echo status ; sleep 0.1) | netcat 127.0.0.1 4730
This opens a connection to a gearman instance running on localhost, and sends the "status" query. This contains the name and number of jobs on that instance. The information can then be processed with grep/awk/wc etc. for reporting and alerting.
I also do the same with the "workers" query which shows all connected workers.
# (echo workers ; sleep 0.1) | netcat 127.0.0.1 4730
The sleep is to keep the connection open long enough for the reply.
The full list of administrative commands, and what the output means is at http://gearman.org/index.php?id=protocol Just search for "Administrative Protocol"
回答3:
To expand on d5ve's answer, since netcat will sit and wait on the socket, you can add a -w parameter with a maximum number of seconds to run. So if you're querying localhost:
# (echo status ; sleep 0.1) | netcat 127.0.0.1 4730 -w 1
... otherwise you never get back to a command prompt.
回答4:
As far as i know there are no such extension in gearman, Managing and monitoring worker script is your responsibility you can try one of these for this purpose -
Supervisord is a python appliation for running application in background and monitoring them.
OR you can use brian moon's gearman manager
回答5:
I think you need this http://github.com/liorbk/php
回答6:
Gearman has a php extension. Have you looked into that yet?
PHP Link
回答7:
Stumbled on it today, haven't tested it myself but it looks promising.
https://github.com/yugene/Gearman-Monitor
回答8:
In Python you could do the following:
import gearman
admin_client = gearman.GearmanAdminClient(['127.0.0.1:4730',])
status = admin_client.get_status()
for w in status:
if w["task"] == "YOUR_TASK_NAME":
print(w)
Note: you have to install package named "gearman" using pip or easy_install to avoid any exceptions running the above code.
Also, Check the following admin clients that is simplifying administering gearman in general.
- Monitoring and Administerating Gearman servers easily from a Django based interface
- Monitoring tool for Gearman servers
- PHP daemon for managing gearman workers
- PHP monitoring dashboard for Gearman Job Servers
- http server that sits on top of gearman
回答9:
When everything else fails, you can use the gearadmin
tool found in the gearman-tools
package in Ubuntu by calling exec()
to execute it in the new process. Here is a reference to its output format.
This assumes PHP and Gearman are running on the same server.
来源:https://stackoverflow.com/questions/2752431/any-way-to-access-gearman-administration