Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

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