5.27.2013

Nagios: Template for Monitoring Log Files

Nagios 3系 ログ監視用のテンプレート

Nagios でログ監視を行う場合、デフォルト設定のままでは意図した動作にならないことがある。
注意点と対策についてメモしておく。

 

環境

 

監視要件

 

  • 5分間隔(以下、インターバルとする)で、サーバ内のあらかじめ設定した任意のログファイル
    (UTF-8エンコーディングのテキストファイル) をチェックする
  • インターバルの間に更新された行について、特定の正規表現パターン(以下、検知文字列とする)
    にマッチする場合、あらかじめ設定した任意のメールアドレスに通知メールを発信する
  • 検知文字列の内容によって WARNING と CRITICAL のレベルを出し分ける
  • 検知文字列が含まれている行であっても、特定の正規表現パターン(以下、監視除外文字列とする)
    とマッチしたら通知は行わない
  • インターバルの間に複数の行が検知された場合でも通知メールは1通だけとする。
    その場合、検知された行全てのテキストをメール本文に含める必要はない
 
問題点
  • デフォルトのプラグイン「check_log」ではレベルの出し分け、監視除外文字列の設定ができない
    =>  check_log3.pl を使えばよい (check_log3.pl - Nagios Exchange)
  • 営業時間外のメッセージが通知されない
    => テンプレート(templates.cfg) の linux-server では、通知時間帯 (notification_period) がデフォルトで
    workhours に設定されている。
    これは timeperiods.cfg に記述されている 月曜〜金曜 9:00-17:00 の時間帯定義であり
    それ以外の時間帯には通知が抑止されてしまう。 
  • Nagios の実行ユーザに、/var/adm/messages などのログファイルの参照権限がない
    => sudo コマンドを介して check_log3.pl を実行する必要がある。
    そのとき、requiretty が設定されていると sudo に失敗してしまう。
  • リトライ回数が指定されている場合、通知が行われない
    => 試行回数 (max_check_attemps) が 2以上に設定されていると、異常を検知した後(デフォルトは1分後)
    に自動的にリトライが行われる。
    リトライが正常終了となれば(ログ監視の場合は大半がこのパターンだろう)、一切の通知は行われない。 
  • 検知文字列が連続したインターバルに出力されたとき、2回目以降が検知されない
    => デフォルトのサービスは異常状態が続いた時は notification_interval の間隔
    (デフォルト1時間)でしか通知が行われない。
    ログ監視の場合はインターバルごとに異常を検知する必要があるので Volatile(=変わりやすい、の意)
    サービスに設定する必要がある。 
  • フラッピング状態となった場合に通知が行われない
    => Nagios 3系では、デフォルトでフラッピング(監視対象の状態が頻繁に変化する状態のときに不要な
    通知を抑止する機能)が有効となっており、正常・異常の状態が頻繁に変わると一定時間
    一切の通知が行われなくなる。
  • 不要な RECOVERY メッセージが通知される
    => サービスで通知される種別のデフォルト (notification_options) は
    WARNING(w), UNKNOWN(u), CRITICAL(c), 復旧状態(r) の4つ。 
    w, u, c のみに変更するとよい。

  

対応策
  • 追加プラグイン check_log3.pl を libexec ディレクトリ以下に配備する
    ファイルに実行パーミッションを付与すること 
  • visodo コマンドを行い、Nagios 実行ユーザに対して適切な権限を追加する
    /etc/sudoers 設定例
    Defaults:nagios !requiretty
    nagios ALL=NOPASSWD:/usr/local/nagios/libexec/check_log3.pl
    
    Nagios によるチェックは TTY でないので、Cronと同様 requiretty を無効化するのがポイント。
  • ログ監視サービス用のテンプレート例 (templates.cfg)
define service{
        use                             local-service
        name                            check-log-service
        is_volatile                     1
        max_check_attemps               1
        flap_detection_enabled          0
        notification_options            w,u,c
        register                        0
        }
  • コマンド定義例 (commands.cfg)
define command{
        command_name    check_log_crit
        command_line    sudo $USER1$/check_log3.pl -l $ARG1$ -s $ARG2$ -p $ARG3$ -c 1 $ARG4$
        }

define command{
        command_name    check_log_warn
        command_line    sudo $USER1$/check_log3.pl -l $ARG1$ -s $ARG2$ -p $ARG3$ $ARG4$
        }

(検知行数ではなく)検知文字列によってレベルを出し分ける場合は、2つのサービスに分けて登録する必要がある。

  • サービス定義例
define service{
        use                             check-log-service
        host_name                       localhost
        service_description             SysLog Warn
        check_command                   check_log_warn!/var/log/messages!/tmp/.messages.warn.seek!warn!-i
        }

"-i" は英大文字・小文字の区別をなくすオプション。(ignore case)

 

 

補足

NRPEを利用してリモートサーバのログを監視する場合、デフォルトの10秒のタイムアウトでは間に合わない場合がある。

check_nrpe コマンドのオプションとしてタイムアウト(-t)を明示的に指定することをお勧めする。

  • コマンド定義例 (タイムアウトを30秒に設定、ARG2 でその他のオプションを設定可能に)
define command{
 command_name check_nrpe
 command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -t 30 $ARG2$
 }

 

check_log3.pl 自体のタイムアウトは

/usr/local/nagios/libexec/utils.pm
の記載内容を引き継いでいるので
タイムアウトを引き延ばす場合は Perl スクリプト側の修正も必要。(デフォルト15秒)

 

References

0 件のコメント:

コメントを投稿