Python で munin plugin を書いてみる
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Python で munin plugin を書いてみる

  • 3,881 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
3,881
On Slideshare
2,344
From Embeds
1,537
Number of Embeds
10

Actions

Shares
Downloads
4
Comments
0
Likes
3

Embeds 1,537

http://nomufamily.blogspot.jp 790
http://blog.kzfmix.com 576
http://www.ftnk.jp 103
https://twitter.com 35
http://nomufamily.blogspot.com 13
http://192.168.1.101 10
http://nomufamily.blogspot.kr 6
http://nomufamily.blogspot.com.au 2
http://webcache.googleusercontent.com 1
http://nomufamily.blogspot.de 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Python でmunin plugin を書いてみる 2013-04-13 Shizuoka.py
  • 2. 自己紹介● となか(@ftnk)● インフラエンジニア ○ Solaris / Puppet / Nagios / munin / GrowthForecast / serverspec etc. ○ Python はまれに運用・監視用のスクリプトを書く ■ shell script だと面倒で Ruby がない環境の時 ■ まれにしか書かないので、覚えない● 開発? ○ 最近、serverspec に Solairs 用の matcher 追加 の pull request を送ったりしてます
  • 3. agenda1. 今回の目的2. munin ?3. munin plugin ?4. munin plugin の構成5. python-munin6. cpu 使用率の plugin を書く (ただし、Solaris)7. まとめ
  • 4. 今回の目的● Python がよくわかっていなくても、簡単に munin plugin が書けることを知ってもらう
  • 5. munin ?● munin はリソース監視ツール ○ リソースの値を取得してグラフ化● 類似のツール ○ mrtg / cacti / CloudForecast / GrowthForecast etc.
  • 6. munin plugin?● リソースの値の取得とグラフに関する情報を扱 う● リソースの値の取得 ○ なんらかのコマンドを実行するなどして値を取得● グラフに関する情報 ○ グラフの形式 (draw) ■ LINE / AREA / STACK ○ 値のあつかい (type) ■ GAUGE / DERIVE / COUNTER
  • 7. munin plugin の構成● 必要な機能 ○ グラフに関する情報の出力 ■ plugin にオプションとして "config" を渡すと出力され る ○ リソースの値の取得と出力 ■ plugin にオプションを渡さなければ、リソースの値が 出力される
  • 8. グラフに関する情報の出力● グラフ全体に関する情報 ○ graph_title: グラフのタイトル ○ graph_category: グラフのカテゴリー ○ graph_vlabel: 縦軸のタイトル ○ graph_scale: 値に合わせてグラフをスケールさせる か?
  • 9. グラフに関する情報の出力● リソースごとのグラフに関する情報 ○ system.label: system というグラフのラベル ○ system.draw: system というグラフの形式 ○ system.type: system というグラフの値のあつかい
  • 10. リソースの値の取得と出力● 値の取得 ○ 好きなようにとってください● 出力 ○ 出力は以下のフォーマットでおこなう ■ system.value (値)
  • 11. python-munin● 今回は python-munin というライブラリを使って plugin を書いてみます。● http://samuelks.com/python-munin/● インストール ○ git や tarball でソースを入手 ○ python setup.py build ○ sudo python setup.py install
  • 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. CPU 使用率の plugin を書く● 今回は munin 本体に含まれ、shell script で書 かれている CPU 使用率の plugin を python- munin を使って書いてみます。
  • 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. グラフ全体の情報class CPUPlugin(MuninPlugin) title = "cpu usage (test)" args = "--base 1000 -l 0" vlabel = "cpu usage" scale = False category = system
  • 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. 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. 値の取得と出力● 以下のコマンドの出力を集計します% 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. 値の取得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. 実行% python cpu-test.pykernel.value 546745idle.value 2077219user.value 124432wait.value 0
  • 21. グラフ以下のようなグラフができる
  • 22. まとめ● Python をよくわかっていなくても python-munin を使うことで、munin-plugin が書ける