Python で munin plugin を書いてみる

4,294 views

Published on

0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,294
On SlideShare
0
From Embeds
0
Number of Embeds
1,829
Actions
Shares
0
Downloads
7
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Python で munin plugin を書いてみる

  1. 1. Python でmunin plugin を書いてみる 2013-04-13 Shizuoka.py
  2. 2. 自己紹介● となか(@ftnk)● インフラエンジニア ○ Solaris / Puppet / Nagios / munin / GrowthForecast / serverspec etc. ○ Python はまれに運用・監視用のスクリプトを書く ■ shell script だと面倒で Ruby がない環境の時 ■ まれにしか書かないので、覚えない● 開発? ○ 最近、serverspec に Solairs 用の matcher 追加 の pull request を送ったりしてます
  3. 3. agenda1. 今回の目的2. munin ?3. munin plugin ?4. munin plugin の構成5. python-munin6. cpu 使用率の plugin を書く (ただし、Solaris)7. まとめ
  4. 4. 今回の目的● Python がよくわかっていなくても、簡単に munin plugin が書けることを知ってもらう
  5. 5. munin ?● munin はリソース監視ツール ○ リソースの値を取得してグラフ化● 類似のツール ○ mrtg / cacti / CloudForecast / GrowthForecast etc.
  6. 6. munin plugin?● リソースの値の取得とグラフに関する情報を扱 う● リソースの値の取得 ○ なんらかのコマンドを実行するなどして値を取得● グラフに関する情報 ○ グラフの形式 (draw) ■ LINE / AREA / STACK ○ 値のあつかい (type) ■ GAUGE / DERIVE / COUNTER
  7. 7. munin plugin の構成● 必要な機能 ○ グラフに関する情報の出力 ■ plugin にオプションとして "config" を渡すと出力され る ○ リソースの値の取得と出力 ■ plugin にオプションを渡さなければ、リソースの値が 出力される
  8. 8. グラフに関する情報の出力● グラフ全体に関する情報 ○ graph_title: グラフのタイトル ○ graph_category: グラフのカテゴリー ○ graph_vlabel: 縦軸のタイトル ○ graph_scale: 値に合わせてグラフをスケールさせる か?
  9. 9. グラフに関する情報の出力● リソースごとのグラフに関する情報 ○ system.label: system というグラフのラベル ○ system.draw: system というグラフの形式 ○ system.type: system というグラフの値のあつかい
  10. 10. リソースの値の取得と出力● 値の取得 ○ 好きなようにとってください● 出力 ○ 出力は以下のフォーマットでおこなう ■ system.value (値)
  11. 11. python-munin● 今回は python-munin というライブラリを使って plugin を書いてみます。● http://samuelks.com/python-munin/● インストール ○ git や tarball でソースを入手 ○ python setup.py build ○ sudo python setup.py install
  12. 12. python-muninpython-munin を使うと、以下のような感じで plugin が書けます。from munin import MuninPluginclass CPUPlugin(MuninPlugin): # グラフ全体の情報 title = "cpu usage (test)" @property def fields(self): # 各グラフの情報の出力 return fuga def execute(self): # 値の取得と出力 return hogeif __name__ == "__main__": CPUPlugin().run()
  13. 13. CPU 使用率の plugin を書く● 今回は munin 本体に含まれ、shell script で書 かれている CPU 使用率の plugin を python- munin を使って書いてみます。
  14. 14. 大枠の用意import commandfrom munin import MuninPlugin ● プラグイン内部でコマンドを実行するので、"importclass CPUPlugin(MuninPlugin): command" が必要 # グラフ全体の情報 title = "cpu usage (test)" @property def fields(self): # 各グラフの情報の出力 return fuga def execute(self): # 値の取得と出力 return hogeif __name__ == "__main__": CPUPlugin().run()
  15. 15. グラフ全体の情報class CPUPlugin(MuninPlugin) title = "cpu usage (test)" args = "--base 1000 -l 0" vlabel = "cpu usage" scale = False category = system
  16. 16. 個々のグラフの情報def fields(self): retun [ ● 個々のグラフの情報をリストでまとめて返しま ("kernel", dict( す label = "system", draw = "AREA", ● 各グラフの情報は辞書にまとめます min = "0", type = "DERIVE", ● グラフの描画に前回取得した値との差を使う ので、type が "DERIVE" です )), ("user", dict( label = "system", ● グラフは塗り潰しで積み重ねるので、 1 つ目 のグラフの draw を "AREA"、2 つ目以降の draw = "STACK", グラフの draw を "STACK" にします min = "0", type = "DERIVE", )), (省略) ]
  17. 17. config をつけて実行% python cpu-test.py configgraph_title cpu usage (test) ● config をつけて実行すると、左のよgraph_category systemgraph_args --base 1000 -l 0 うにグラフの情報が出力されることgraph_vlabel cpu usage を確認できますgraph_scale nokernel.draw AREAkernel.min 0kernel.type DERIVEkernel.label systemuser.draw STACKuser.min 0user.type DERIVEuser.label userwait.draw STACKwait.min 0wait.type DERIVEwait.label waitidle.draw STACKidle.min 0idle.type DERIVEidle.label idle
  18. 18. 値の取得と出力● 以下のコマンドの出力を集計します% kstat -p -c misc -m cpu_stat -s /^(user|kernel|wait|idle)$/cpu_stat:0:cpu_stat0:idle 701652cpu_stat:0:cpu_stat0:kernel 135979cpu_stat:0:cpu_stat0:user 34858cpu_stat:0:cpu_stat0:wait 0cpu_stat:1:cpu_stat1:idle 609950cpu_stat:1:cpu_stat1:kernel 221631cpu_stat:1:cpu_stat1:user 40414cpu_stat:1:cpu_stat1:wait 0cpu_stat:2:cpu_stat2:idle 702211cpu_stat:2:cpu_stat2:kernel 132556cpu_stat:2:cpu_stat2:user 37226cpu_stat:2:cpu_stat2:wait 0cpu_stat:3:cpu_stat3:idle 633591cpu_stat:3:cpu_stat3:kernel 198948cpu_stat:3:cpu_stat3:user 39449cpu_stat:3:cpu_stat3:wait 0
  19. 19. 値の取得def execute(self): stats = commands.getoutput( ● commands.getoutput で"kstat -p -c misc -m cpu_stat -s /^ コマンドの実行結果を取(user|kernel|wait|idle)$?/" ) 得 values = { idle:0, kernel:0, wait:0, idle:0 } ● 値は辞書で返す for i in stats.splitlines(): ● 集計のため 0 で初期化 key, value = i.split(:)[-1].split(t) ● コマンドの実行結果を行ご values[key] += int(value) とに処理して集計 return values
  20. 20. 実行% python cpu-test.pykernel.value 546745idle.value 2077219user.value 124432wait.value 0
  21. 21. グラフ以下のようなグラフができる
  22. 22. まとめ● Python をよくわかっていなくても python-munin を使うことで、munin-plugin が書ける

×