supervisorのWebインターフェース/XML-RPCを使う

Python で書かれた supervisor という djb の Daemontools のようなプロセス管理ツールがある。

大きく分けて4つのプログラムから成り立っている。

  • supervisord : サーバーサイドのデーモン
  • supervisorctl : クライアントサイドのコマンドラインインターフェース
  • Web 管理インターフェース
  • XML-RPC インターフェース

Web 管理インターフェースと XML-RPC インターフェースを使ってみたのでそのメモ。

基本設定

まずは、ベースラインとして4つの tornado を起動する設定を追加。

[group:tornadoes]
programs=tornado-8000,tornado-8001,tornado-8002,tornado-8003
[program:tornado-8000]
command=python /path/to/prog.py --port=8000
directory=/path/to/dir/
user=www-data
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/tornado.log
loglevel=info
[program:tornado-8001]
command=python /path/to/prog.py --port=8001
directory=/path/to/dir/
user=www-data
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/tornado.log
loglevel=info
...

$ supervisord -c /path/to/supervisord.conf

$ supervisorctl
supervisor> status
tornadoes:tornado-8000 RUNNING pid 13007, uptime 0:00:10
tornadoes:tornado-8001 RUNNING pid 13008, uptime 0:00:10
tornadoes:tornado-8002 RUNNING pid 13017, uptime 0:00:09
tornadoes:tornado-8003 RUNNING pid 13022, uptime 0:00:08

Web 管理インターフェース

“disabled by default” な inet_http_server ディレクティブを有効にする。

-;[inet_http_server]          ; inet (TCP) server disabled by default
-;port=127.0.0.1:9001        ; (ip_address:port specifier, *:port for all iface)
+[inet_http_server]          ; inet (TCP) server disabled by default
+port=0.0.0.0:9001          ; (ip_address:port specifier, *:port for all iface)

ブラウザで http://HOST:9001 を開けば確認できる。

XML-RPC インターフェース

rpcinterface ディレクティブを有効にする。

; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

コメントにもあるように XML-RPC は XML-RPC インターフェースだけでなく、Web インターフェースと supervisorctl でも利用しているので、デフォルトのままで使えるようになっているはず。

XML-RPC の API は次のページにある。

http://supervisord.org/api.html

XML-RPC なので、API ドキュメントを見れば迷わずに使える。

$ cat test_rpc.py
import pprint
import sys
import time
import xmlrpclib
server = xmlrpclib.Server('http://localhost:9001/RPC2')

print server.supervisor.getAPIVersion()
print server.supervisor.getState()
for process in server.supervisor.getAllProcessInfo():
    print process['group'],
    print process['name'],
    print process['statename'],
    print process['pid'],
    print 'uptime',
    print process['now'] - process['start']

$ python test_rpc.py
3.0
{'statename': 'RUNNING', 'statecode': 1}
tornadoes tornado-8000 RUNNING 17193 uptime 95
tornadoes tornado-8001 RUNNING 17198 uptime 94
tornadoes tornado-8002 RUNNING 17203 uptime 93
tornadoes tornado-8003 RUNNING 17208 uptime 92

“socket.error: [Errno 111] Connection refused” のようなエラーが帰ってくる場合、http サーバが立ち上がっていない可能性がある。
デフォルトでは無効な inet_http_server の設定が有効になっていることを確認すること。

利用可能なソケット一覧

各機能で利用可能なソケットは以下。当然ながら、連携する機能間でソケットをあわせておく必要がある。supervisord は UNIX ドメインソケットのみで、supervisorctl は inet というような不一致は NG。

サーバーとクライアントを別サーバにインストール

supervisord を UNIX ドメインソケットにすると、サーバ/クライアントは同一サーバー内という縛りが発生するが、inet ソケットにすれば TCP/IP で通信しているだけなのでそのような縛りもない。例えば次のように設定すると、supervisord はプロセス管理するサーバ、supervisorctl や XML-RPC プログラムは別サーバ(監視サーバ)にインストールできる。
サーバ(supervisord 用 設定)

[inet_http_server] ; inet (TCP) server disabled by default
port=0.0.0.0:9001           ; (ip_address:port specifier, *:port for all iface)
;username=user              ; (default is no username (open server))
;password=123               ; (default is no password (open server))

クライアント(supervisorctl 用 設定)
supervisorctl ディレクティブだけでOK

$ cat ctl.conf
[supervisorctl]
serverurl=http://daemon.server:9001 ; use an http:// url to specify an inet socket
;username=chris ; should be same as http_username if set
;password=123 ; should be same as http_password if set
;prompt=mysupervisor ; cmd line prompt (default "supervisor")
history_file=~/.sc_history ; use readline history if available
$ supervisorctl -c ctl.conf
...

この考えを発展させれば、supervisord はアプリがデプロイされた複数のサーバーで起動しても、supervisorctl や XML-RPC プログラムを監視サーバ1台にインストールしてしまえば、serverurl を切り替えるだけで各サーバーの supervisord を制御できる。

ロギング

デフォルトのログレベルは infoinfo レベルだと、 Web サーバーへのリクエストや XML-RPC の処理の流れをおえないので、少なくとも開発時には必要なログも取れるように trace にしておくのが良い。各ログレベルは以下のようになっている。

Config File Value Output Code Description
critical CRIT Messages that indicate a condition that requires immediate user attention, a supervisor state change, or an error in supervisor itself.
error ERRO Messages that indicate a potentially ignorable error condition (e.g. unable to clear a log directory).
warn WARN Messages that indicate an anomalous condition which isn’t an error.
info INFO Normal informational output. This is the default log level if none is explicitly configured.
debug DEBG Messages useful for users trying to debug process configuration and communications behavior (process output, listener state changes, event notifications).
trace TRAC Messages useful for developers trying to debug supervisor plugins, and information about HTTP and RPC requests and responses.
blather BLAT Messages useful for developers trying to debug supervisor itself.

ログレベルを trace に変更して、XML-RPC と Web 管理画面を利用した時のログが以下

 [supervisord]
 logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
 logfile_maxbytes=50MB        ; (max main logfile bytes b4 rotation;default 50MB)
 logfile_backups=10           ; (num of main logfile rotation backups;default 10)
-loglevel=info                ; (log level;default info; others: debug,warn,trace)
+loglevel=trace               ; (log level;default info; others: debug,warn,trace)

$ tail -f /path/to/supervisord.log
2012-04-22 00:44:40,720 TRAC XML-RPC method called: supervisor.getAPIVersion()
2012-04-22 00:44:40,720 TRAC XML-RPC method supervisor.getAPIVersion() returned successfully
2012-04-22 00:44:40,720 TRAC 127.0.0.1:53747 - - [21/Apr/2012:15:44:40 +0900] "POST /RPC2 HTTP/1.1" 200 251
2012-04-22 00:46:27,946 TRAC 192.168.*.*:54088 - - [21/Apr/2012:15:46:27 +0900] "GET / HTTP/1.1" 200 5704
2012-04-22 00:46:27,974 TRAC 192.168.*.*:54088 - - [21/Apr/2012:15:46:27 +0900] "GET /images/state2.gif HTTP/1.1" 200 1292
2012-04-22 00:46:28,008 TRAC 192.168.*.*:54088 - - [21/Apr/2012:15:46:28 +0900] "GET /favicon.ico HTTP/1.1" 404 264
Tagged with: , ,
Posted in middleware

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
  • RT @__apf__: How to write a research paper: a guide for software engineers & practitioners. docs.google.com/presentation/d… /cc @inwyrd 1 week ago
  • RT @HayatoChiba: 昔、自然と対話しながら数学に打ち込んだら何かを悟れるのではと思いたち、専門書1つだけ持ってパワースポットで名高い奈良の山奥に1週間籠ったことがある。しかし泊まった民宿にドカベンが全巻揃っていたため、水島新司と対話しただけで1週間過ぎた。 それ… 3 weeks ago
  • RT @googlecloud: Ever wonder what underwater fiber optic internet cables look like? Look no further than this deep dive w/ @NatAndLo: https… 3 weeks ago
  • @ijin UTC+01:00 な時間帯で生活しています、、、 6 months ago
  • RT @mattcutts: Google's world-class Site Reliability Engineering team wrote a new book: amazon.com/Site-Reliabili… It's about managing produc… 9 months ago
%d bloggers like this: