Pythonで自動化、GoogleDocsのSpreadSheetを使ったディスク使用量モニタースクリプト
気づいたらDiskの残量がメチャ減ってるときってありますよね。Nagiosとか監視ツール使って閾値超えたら警告出すとかやってる人も居るかと思います。監視ツールはエラーの発生はログ取りするけど、日々の使用料を記録して見やすくなってないのが大気がします。大きめのファイルサーバ使っていると、今後の容量計画を行う場合は現状把握が大切です。各ドライブごとにどれくらいの容量増加傾向があるのかを知るためには、監視ツールのみだとやや物足りない感じがします。
ログる内容は、dfコマンドで表示出来る分で十分なのでコレを毎日ダンプし続けると良いかもしれないですが、やっぱり結果はグラフで見たいし、いつも最新の状態が見たいですよね。さらにグラフは、画像ファイルとかでサクっとウェブで見えたりしたらさらに便利
ということで、こんなの作ってみました。
dfで見えるようにドライブをマウントしておいて、dfコマンで出る各パラメータを日時とともにDocsのスプレッドシートに記録するPythonスクリプトです。また、各パラメータは、別々のシートに記録してグラフ化した際に見やすいようにしてあります。
virtualenv環境で各モジュールをインストール
virtualenvwrapperをインストールして、mkvirtualenvしました。
今回の環境名は、"gdata"にしました。
easy_install virtualenv easy_install virtualenvwrapper mkvirtualenv gdata
- gdata
- pit
- easy_installで入れた
Docs上でスプレッドシートを作成
スクリプトでは、ファイルがある前提でアクセスするので事前にスプレッドシートを作成しておきます。名前は、スクリプト内で変更可能です。デフォルトでの名前は
- スプレッドシート ファイル名
- MacBookDisk
- シート名(小文字アルファベットのみ推奨)
- all
- use
- available
- percent
- 各シートの1列目項目(英数小文字のみ、マウント名は変更してください)
- date
- media
- public
こんなスプレッドシートが出来るはず(イメージはすでにデータが入っている状態)
スクリプト
pythonファイル
df2docs.py
#!/bin/env python #encoding:utf-8 import os from pit import Pit import gdata.spreadsheet.text_db import subprocess import datetime os.environ['PATH'] = "/bin:/usr/bin" cwd = "/" cmdline = 'df -m' ################################################################## ### Settings # Google Docsで作成されるスプレッドシートファイル名 FILE_NAME='MacBookDisk' # スプレッドシートで作成されるシート名 TABLE_NAME = ['all', 'use', 'available', 'percent'] # 監視したいマウントポイントとそのラベル名 ELEM_TABLE = {'/Volumes/Media':'media', '/Volumes/Public':'public'} ################################################################### account = Pit.get('gdata') p = subprocess.Popen(cmdline,shell=True,cwd=cwd, stdin = subprocess.PIPE,stdout = subprocess.PIPE, stderr = subprocess.PIPE, close_fds = True) (stdouterr, stdin) = (p.stdout, p.stdin) res = [i.strip().split() for i in stdouterr.readlines()] elm, all, use, ava, per = [], [], [], [], [] for d in res[5:7]: elm.append(ELEM_TABLE[d[5]]) all.append(d[1]) use.append(d[2]) ava.append(d[3]) per.append(d[4]) dflist = [elm, all, use, ava, per] date = datetime.datetime.today().strftime('%Y/%m/%d/%H:%M') print dflist client = gdata.spreadsheet.text_db.DatabaseClient( username=account['email'], password=account['password']) db = client.GetDatabases(name=FILE_NAME)[0] for tname in TABLE_NAME: table = db.GetTables(name=tname)[0] idx = TABLE_NAME.index(tname) + 1 table.AddRecord({'date':date, dflist[0][0]:dflist[idx][0], dflist[0][1]:dflist[idx][1], }) print 'status: Sheet "%s" OK'%(tname)
このPythonスクリプトを呼ぶshell
df_upload.sh
#/bin/bash source ~/.virtualenvwrapperrc workon gdata python ~/local/bin/df2docs.py
実行する
% ./df_upload.sh /Users/atusi/Dropbox/repos/dotFile/.virtualenvs/gdata/lib/python2.6/site-packages/gdata/tlslite/utils/cryptomath.py:9: DeprecationWarning: the sha module is deprecated; use the hashlib module instead import sha status: Sheet "all" OK status: Sheet "use" OK status: Sheet "available" OK status: Sheet "percent" OK
起動スクリプトがないと、毎回workonしするはめになるので作成しました。あとは記録したいときに、df_upload.shを実行するだけで実行時のディスクの使用量や残容量がシート別に各マウント分記録されます。実行しているのがPython2.6のためhashlib使いなさいと起こられますが、結果には影響ないみたい。cryptmath.pyをいじれば良いかと思います。>from hashlib import sha1 as sha にするとか
あとは、Docsの機能でグラフを作成しておけばデータがアップされる度に更新されてハッピー。
こんなふうになりました。サンプリング数とドライブが少ないのでショボーンですが・・・
cronで動かしたい
起動シェルをcronで動かす予定だったけど、なぜかcronに登録しても正常に動いてくれません、設定方法わかる方いたら是非教えてください。