When it’s ready.

出来るまで出来ない

Pythonで自動化、GoogleDocsのSpreadSheetを使ったディスク使用量モニタースクリプト

気づいたらDiskの残量がメチャ減ってるときってありますよね。Nagiosとか監視ツール使って閾値超えたら警告出すとかやってる人も居るかと思います。監視ツールはエラーの発生はログ取りするけど、日々の使用料を記録して見やすくなってないのが大気がします。大きめのファイルサーバ使っていると、今後の容量計画を行う場合は現状把握が大切です。各ドライブごとにどれくらいの容量増加傾向があるのかを知るためには、監視ツールのみだとやや物足りない感じがします。

ログる内容は、dfコマンドで表示出来る分で十分なのでコレを毎日ダンプし続けると良いかもしれないですが、やっぱり結果はグラフで見たいし、いつも最新の状態が見たいですよね。さらにグラフは、画像ファイルとかでサクっとウェブで見えたりしたらさらに便利

ということで、こんなの作ってみました。

dfで見えるようにドライブをマウントしておいて、dfコマンで出る各パラメータを日時とともにDocsのスプレッドシートに記録するPythonスクリプトです。また、各パラメータは、別々のシートに記録してグラフ化した際に見やすいようにしてあります。

virtualenv環境で各モジュールをインストール

virtualenvwrapperをインストールして、mkvirtualenvしました。
今回の環境名は、"gdata"にしました。

easy_install virtualenv
easy_install virtualenvwrapper
mkvirtualenv gdata

pitのコンフィグにgdataのエントリーを追加

~/.pit/default.yaml

gdata:
  email: yourID@gmail.com
  password: yourPasswd

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に登録しても正常に動いてくれません、設定方法わかる方いたら是非教えてください。