るいすときのこの物語

オタクエンジニアの雑記

ZabbixでSquidのFile descriptor諸々監視をする。


Squidが時たま調子が悪くて、一つの要因にFile descriptorに目を付けてるけどこれじゃない感じもある。 cache.logにも決まり文句もないし。

ともあれ虱潰しにしようということで、Zabbixで監視をしてみます。

 

Zabbixの外部スクリプトの場所を確認しよう

[root@proxmox-zabbix ~]# cat /etc/zabbix/zabbix_server.conf | grep "ExternalScripts"
### Option: ExternalScripts
# ExternalScripts=${datadir}/zabbix/externalscripts
ExternalScripts=/usr/lib/zabbix/externalscripts

"ExternalScripts=/usr/lib/zabbix/externalscripts" ここに外部スクリプトを起きます。

 

squidclientを入れよう

yum install squid

squidclientで情報を取得しに行くのでsquidを入れます。 squidclientだけ入れることはできないんだろうか。

 

外部スクリプト本体

<?php
/**
 * @param string $host 第1引数 IPアドレス
 * @param string $key 第2引数 maximum or largest or number or file or .....
 */
$host = $argv[1];
$key = $argv[2];
file_put_contents("result", shell_exec("squidclient -h ${host} mgr:info"));
$result = file("result");
switch($key){
    case 'maximum':
        $maximum = preg_replace("/\\D/", "", $result[72]); //Maximum number of file descriptors
        echo $maximum;
        break;
    case 'largest':
        $largest = preg_replace("/\\D/", "", $result[73]); //Largest file desc currently in use
        echo $largest;
        break;
    case 'number':
        $number = preg_replace("/\\D/", "", $result[74]); //Number of file desc currently in use
        echo $number;
        break;
    case 'file':
        $file = preg_replace("/\\D/", "", $result[75]); //Files queued for open
        echo $file;
        break;
    case 'available':
        $available = preg_replace("/\\D/", "", $result[76]); //Available number of file descriptors
        echo $available;
        break;
    case 'reserved':
        $reserved = preg_replace("/\\D/", "", $result[77]); //Reserved number of file descriptors
        echo $reserved;
        break;
    case 'store':
        $store = preg_replace("/\\D/", "", $result[78]); //Store Disk files open
        echo $store;
        break;
    default:
        die();
}

https://gist.github.com/rluisr/76bf3845a5daafdb40c7

このファイルをさっきのディレクトリへ保存し

chmod 755 SquidInfo.php result
chown zabbix:zabbix SquidInfo.php result

シェルスクリプトと、Pythonが割りとメジャーらしいけどどっちも分からないのでPHPで書くことにしました。 一度ファイルに保存してるのは行数指定で変数にぶち込みたかったから。

例えば Maximum number of file descriptors の数値が欲しい時は

php SquidInfo.php 192.168.x.x maximum

とすれば、数値(実際には文字列)だけが返ってきます。

php SquidInfo.php 192.168.x.x number

とすれば、Number of file desc currently in useが返ってきます。

 

Squidに登録

SnapCrab_NoName_2016-2-4_18-36-26_No-00

アイテムの追加から、こんな感じに設定すれば取得可能。 データ型は”文字列”でないと取得できません。

一つ一つアプリケーションを追加していくのはダルいのでテンプレートを作成しておくといいです。 トリガーとしては、Maximum number of file descriptorsが65535となっており Number of file desc currently in useが65000を超えるとアクションを起こすように。

自動でSquidを再起動するようにアクションを仕掛けてもいいですね!!!