mod_proxy_balancerのLoad Balancer Manager
Apache2.2.4のmod_proxy_balancer.cを何気なく眺めていたら、
672: if (apr_table_get(params, "xml")) {
な行を発見。Manager画面にアクセスする際、パラメータ「xml=1」(「1」の部分は何かの文字列)をつけてアクセスしてみると、XML形式で出力されるみたいですね。
<?xml version="1.0" encoding="UTF-8" ?> <httpd:manager xmlns:httpd="http://httpd.apache.org"> <httpd:balancers> <httpd:balancer> <httpd:name>balancer://172.17.3.219</httpd:name> <httpd:workers> <httpd:worker> <httpd:scheme>http</httpd:scheme> <httpd:hostname>172.17.3.219</httpd:hostname> <httpd:loadfactor>1</httpd:loadfactor> </httpd:worker> <httpd:worker> <httpd:scheme>http</httpd:scheme> <httpd:hostname>172.17.3.219</httpd:hostname> <httpd:loadfactor>2</httpd:loadfactor> </httpd:worker> </httpd:workers> </httpd:balancer> </httpd:balancers> </httpd:manager>
ただし、HTML形式のものと比べて情報があまりに少なすぎる。status出てこないし。。。ということで、
*** mod_proxy_balancer.c.org 2006-12-20 06:56:16.000000000 +0900 --- mod_proxy_balancer.c 2007-01-31 14:17:23.000000000 +0900 *************** *** 681,686 **** --- 681,688 ---- ap_rputs(" <httpd:workers>\n", r); worker = (proxy_worker *)balancer->workers->elts; for (n = 0; n < balancer->workers->nelts; n++) { + char fbuf[50]; + ap_rputs(" <httpd:worker>\n", r); ap_rvputs(r, " <httpd:scheme>", worker->scheme, "</httpd:scheme>\n", NULL); *************** *** 688,693 **** --- 690,725 ---- "</httpd:hostname>\n", NULL); ap_rprintf(r, " <httpd:loadfactor>%d</httpd:loadfactor>\n", worker->s->lbfactor); + + ap_rprintf(r, " <httpd:route>%s</httpd:route>\n", + worker->s->route); + ap_rprintf(r, " <httpd:routeRedir>%s</httpd:routeRedir>\n", + worker->s->redirect); + ap_rprintf(r, " <httpd:lbset>%d</httpd:lbset>\n", + worker->s->lbset); + + ap_rputs(" <httpd:status>", r); + if (worker->s->status & PROXY_WORKER_DISABLED) + ap_rputs("Dis ", r); + if (worker->s->status & PROXY_WORKER_IN_ERROR) + ap_rputs("Err ", r); + if (worker->s->status & PROXY_WORKER_STOPPED) + ap_rputs("Stop ", r); + if (worker->s->status & PROXY_WORKER_HOT_STANDBY) + ap_rputs("Stby ", r); + if (PROXY_WORKER_IS_USABLE(worker)) + ap_rputs("Ok", r); + if (!PROXY_WORKER_IS_INITIALIZED(worker)) + ap_rputs("-", r); + ap_rputs("</httpd:status>\n", r); + + ap_rprintf(r, " <httpd:elected>%" APR_SIZE_T_FMT "</httpd:elected>\n", + worker->s->elected); + ap_rprintf(r, " <httpd:to>%s</httpd:to>\n", + apr_strfsize(worker->s->transferred, fbuf)); + ap_rprintf(r, " <httpd:from>%s</httpd:from>\n", + apr_strfsize(worker->s->read, fbuf)); + ap_rputs(" </httpd:worker>\n", r); ++worker; }
のようにしてやると、いい感じに出てきます :-) 監視アプリなんかと組み合わせられるかも。
<?xml version="1.0" encoding="UTF-8" ?> <httpd:manager xmlns:httpd="http://httpd.apache.org"> <httpd:balancers> <httpd:balancer> <httpd:name>balancer://172.17.3.219</httpd:name> <httpd:workers> <httpd:worker> <httpd:scheme>http</httpd:scheme> <httpd:hostname>172.17.3.219</httpd:hostname> <httpd:loadfactor>1</httpd:loadfactor> <httpd:route></httpd:route> <httpd:routeRedir></httpd:routeRedir> <httpd:lbset>0</httpd:lbset> <httpd:status>Ok</httpd:status> <httpd:elected>26</httpd:elected> <httpd:to> 14K</httpd:to> <httpd:from> 61K</httpd:from> </httpd:worker> <httpd:worker> <httpd:scheme>http</httpd:scheme> <httpd:hostname>172.17.3.219</httpd:hostname> <httpd:loadfactor>2</httpd:loadfactor> <httpd:route></httpd:route> <httpd:routeRedir></httpd:routeRedir> <httpd:lbset>0</httpd:lbset> <httpd:status>Ok</httpd:status> <httpd:elected>52</httpd:elected> <httpd:to> 28K</httpd:to> <httpd:from>1.1M</httpd:from> </httpd:worker> </httpd:workers> </httpd:balancer> </httpd:balancers> </httpd:manager>
あとで調べてみると、1年以上前にネタが出てました。。。orz