문제

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.

도움이 되었습니까?

해결책

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;
    }

}

다른 팁

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"

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.

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

I think you need this http://github.com/liorbk/php

Gearman has a php extension. Have you looked into that yet?

PHP Link

Stumbled on it today, haven't tested it myself but it looks promising.

https://github.com/yugene/Gearman-Monitor

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.

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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top