HEARTBEATS

Nagios status.dat をパースする Python ライブラリを書きました

   

斎藤です。こんにちは。

今日は、社内の業務自動化に際して書いた、 Nagios の status.dat をパースする Python ライブラリご紹介します。

Nagios のステータスを別のプログラムから確認する

Nagios の監視状況を他のプログラムから確認しようとした場合、大きく分けて次の2つの方法があります。

  • 管理画面のHTML をスクレイパーを使って読む
  • stauts.dat を読む

1は、疎結合ではありますが、スクレイパーを使うとなるとパースが面倒なのは自明です。

2は、 Nagios が自分自身の監視状況を管理するために生成している status.dat を読みます。1に比べたら、HTMLのパースほど複雑ではないので、開発者への負担が少なそうです。

ただ、2の方法でパースする方法はいくつかネット上にやり方があったものの、どうもしっくり来るものが無かったため、自分で書く事にしました。

ソースコード

こちらからどうそ。

データ構造

parseStatus.dat.py 唯一のメソッドである parseFile() を呼んだ際に、第二引数"result"に渡されるdict形式の値は次の構造になっています。

主に使うのは「host」と「service」の項目になるかと思います。


result = {
    "info" => {
        "created" = ?,
        "version" = ?
    },
    "program" => {
        [VALUE1] = ?,
        [VALUE2] = ?,
           :
        [VALUEn] = ?
    },
    "host" = {
        [HOST1] => {
            [VALUE1] = ?,
            [VALUE2] = ?,
               :
            [VALUEn] = ?
        },
        [HOST2] => {
            (HOST1と同じ)
        },
         :
        [HOSTn] => {
            (HOST1と同じ)
        }
    },
    "service" => {
        [HOST1] => {
            [SERVICE1] = {
                [VALUE1] = ?,
                [VALUE2] = ?,
                   :
                [VALUEn] = ?
            },
            [SERVICE2] = {
                (SERVICE1と同じ)
            },
             :
            [SERVICEn] = {
                (SERVICE1と同じ)
            },
        },
        [HOST2] => {
            (HOST1と同じ)
        },
         :
        [HOSTn] => {
            (HOST1と同じ)
        }
    }
}

注意点として、全ての値は「文字列」として保存されています。従って、見た目は数値のものでも、文字列として評価する必要があります。

よく使いそうな値

Nagiosが監視時に記録している情報がいくつもあるのですが、そのうち私なりに「これはよく使いそうだ」と考えたものをピックアップしてみます。

  • current_state = "0": 正常, "1": WARNING, "2": CRITICAL, "3": UNKNOWN
  • notifications_enabled = "0" or "1"
  • active_checks_enabled = "0" or "1"
  • passive_checks_enabled = "0" or "1"
  • acknowledgement_type = "0" or "1"
  • performance_data = (Pluginが返した結果)

変数の説明は...名前の通りなので省略します。値は、0 or 1 の場合、0がFalse、1がTrueです。その他は、変数に付記した通りです。

実際に参照する時は、このように行います。ここでは、ホスト名を仮に "vm001"、サービス監視項目名を "disk_sda1" とします。

  • ホスト: value = result[ "host" ][ "vm001" ][ "current_state" ]
  • サービス: value = result[ "host" ][ "vm001" ][ "disk_sda1" ][ "notifications_enabled" ]

全部を取得したい場合は、forを用いて回せば良いかと思います。

最後に

ここまで、Nagios の status.dat をパースする Python ライブラリをご紹介しました。

なお、 status.dat に保存されていない主な情報として「サービスグループ」と「ホストグループ」があります。もちろん、このソースでもパースする事ができません。ご注意ください。

このライブラリが、 Nagiosの監視データを用いてツールを作られたい方のお役に立てば幸いです。

それでは、ごきげんよう。

株式会社ハートビーツの技術情報やイベント情報などをお届けする公式ブログです。



ハートビーツをフォロー

  • Twitter:HEARTBEATS
  • Facebook:HEARTBEATS
  • HATENA:HEARTBEATS
  • RSS:HEARTBEATS

殿堂入り記事