| Works
SolidFireのIOPSを取得するスクリプト②
昨日の続き。
もうちょっと手を入れてみた。
同じシステムで使っている他のストレージはRead/Write/TotalのそれぞれのIOPSを監視しているのですが、SolidFireでも同じ事をしたい。しかし、SolidFireの管理GUIではRead IOPSやWrite IOPSを確認できるのですが、REST APIから取れる値には見当たらない。
ユーザーガイドを読んでいたら、以下のように記載されていました。
Input / Output Calculations:
The calculations and keys used for Input / Output are shown below.
・"Read IOPS": current (readOps) - previous (readOps)
・"Write IOPS": current (writeOps) - previous (writeOps)
・"Total IOPS": readOps + writeOps
ようは"readOPS"と"writeOPS"を2回とって計算すればいいわけですね。
昨日のスクリプトをちょっと変更。
#!/usr/bin/python
import sys
import time
import json
import pycurl
from io import BytesIO
sfuser = 'admin'
sfpass = 'password'
api_endpoint = 'https://192.168.0.1/json-rpc/8.0'
api_params = {"method": "GetClusterStats", "params": {}, "id": "1" }
delta = 30
tmpfile = '/var/tmp/sfiops.txt'
def main():
data1 = get_clusterstats()
time.sleep(delta)
data2 = get_clusterstats()
rio = (data2['result']['clusterStats']['readOps'] - data1['result']['clusterStats']['readOps']) / delta
wio = (data2['result']['clusterStats']['writeOps'] - data1['result']['clusterStats']['writeOps']) / delta
tio = rio + wio
f = open(tmpfile, 'w')
f.write('total,read,write\n' + str(tio) + ',' + str(rio) + ',' + str(wio))
#print('Total IOPS {}'.format(tio))
#print('Read IOPS {}'.format(rio))
#print('Write IOPS {}'.format(wio))
f.close()
def get_clusterstats():
response = BytesIO()
conn = pycurl.Curl()
conn.setopt(pycurl.URL, api_endpoint)
conn.setopt(pycurl.SSL_VERIFYPEER, False)
conn.setopt(pycurl.SSL_VERIFYHOST, False)
conn.setopt(pycurl.HTTPAUTH, pycurl.HTTPAUTH_BASIC)
conn.setopt(pycurl.USERPWD, "%s:%s" % (sfuser, sfpass))
conn.setopt(pycurl.POST, 1)
conn.setopt(pycurl.HTTPHEADER, ['Accept: application/json', 'Content-Type: application/json'])
conn.setopt(pycurl.POSTFIELDS, json.dumps(api_params))
conn.setopt(pycurl.WRITEFUNCTION, response.write)
conn.perform()
http_code = conn.getinfo(pycurl.HTTP_CODE)
if not http_code is 200:
sys.exit(1)
else:
return json.loads(response.getvalue())
if __name__ == "__main__":
main()
sys.exit(0)
変数"delta"で値をとる間隔(秒)を設定しています。
余談ですが、SolidFireは専用の仮想アプライアンスを通してメーカーに統計情報を送ることができます。その情報はActive IQというサイトで見ることができるので、SolidFireだけであれば自前の監視システムは要らないかもしれません。
実際はストレージしかないシステムなんてほとんどないでしょうから、統合監視をするなら結局は作り込まないといけないということですね。