当記事では、LogStare Collector v2.0.0 build200731(以下、LSCと記載)から新規機能として実装された、メトリクス監視の具体的な実装例を記載します。
実装した成果物は、皆さんもLSCのデモサイトから確認することができます。(sv-temp-monitorという名称の機器になります。)
※公開している一部のソースコードなどを使用して、何らかの損害が発生したとしても責任は負いかねますのでご注意ください。
目次
サーバラックの温度を監視する経緯
弊社セキュアヴェイルは大阪に本社、東京に支社があります。
東京の支社はオフィスタワーの一室にあります。
弊社ホームページをご覧いただけるとわかりますが、オフィスの一画にサーバラックを置いています。
このサーバラックは、エンジニアが機器の検証などを行う際に用いるものです。
ご存じかもしれませんが、ハードウェアは熱の上昇に弱いです。
(機器によっては自身の周囲の温度を取得して、自動的に停止します。)
サーバラック内の温度が高いと、最悪の場合、検証に使用する機器などが利用できなくなるため、東京支社ではサーバラックの温度を管理しています。
しかしながら、管理するのは人間ですのでどうしてもミスは起こり得るものです。
また、リモートワークも行っているため、サーバラックの温度をツールを利用して監視できないかと考えました。
サーバラックの温度を監視する要件
サーバラックの温度を監視するにあたり、要件をまとめました。
まず、温度監視システムを実装するにあたりハードウェアとして、以前購入して埃をかぶりそうになっていた(言葉の綾です、弊社では機器を大切に扱っています。)「Raspberry pi」を使用することが良いだろうと考えました。
その「Raspberry pi」にPythonにて定期的に温度を取得するプログラムを作成・実装し一分毎に計測した温度情報を「Raspberry pi」のローカルストレージに保存します。
規定以上の温度を観測した場合には、東京支社のメンバーにアラートを通知、というものを構想しました。
ただし「Raspberry pi」のローカルストレージに温度情報を保存するのはよいものの、
いちいちローカルストレージにアクセスして現在の温度情報を確認するのは面倒ですし、監視という観点から、一目でどういった推移で温度が変化しているのかをグラフ等で確認出来ることが望ましいのですが、そうしたプログラムを作成・実装するのはある程度時間がかかってしまいます。
そして、温度監視プログラム自体の監視機能も実装する必要があります。
従って、温度監視システムの要件をまとめると下記の通りになります。
実装にあたり問題がない要件
- 温度計測は「Raspberry pi」を使用すること
- 「Raspberry pi」への実装言語はPythonにすること
- 1分毎に計測された温度情報を取得して、「Raspberry pi」のローカルストレージに温度情報を保存すること
- 規定以上の温度を観測した場合には、各メンバーに通知を送れること
実装にあたり検討が必要な要件
- 取得した温度情報をローカルストレージにアクセスする以外の方法で簡便に確認出来ること
- 温度の推移をダッシュボード等で確認出来ること
- 温度監視プログラムが意図せずに停止しているか確認出来ること
上記要件を実現するために、弊社ソフトウェアであるLSCを温度監視システムの一つに組み込もうと思いました。
LSCを使用するに至ったわけ
LSCのダッシュボード画面にて、取得した監視値をグラフィカルに表示することができます。
例えば、SNMP監視で取得したCPU使用率などは折れ線グラフで推移を簡単に確認できます。
(以下デモサイトで公開しているダッシュボード画面になります。)
始めはSNMP監視に使用するOIDを手動で作成し、「Raspberry pi」が取得した温度をLSCから取得できるようにしようと思いました。
しかし、LogStare Collectorの仕様上、SNMP監視をカスタムすることはできません。
(弊社が追加した監視項目しかLSCは監視できないということです。)
この代替となる方法がないのかを考えていたところ、最近実装されたメトリクス監視を使用することで、SNMPを使用しなくても今回実装したい監視を行うことができると閃きました。
メトリクス監視とは
LSCにおけるメトリクス監視は、json形式のページにアクセスし、指定したjsonの「key」に紐づく値を取得するというものです。
(現在、追加機能を実装予定です。)
「Raspberry pi」にてwebサーバを起動させ、取得したサーバラック内の温度をjson形式に変換して表示するようにすれば、LSCのメトリクス監視にて温度情報を取得できます。
従って、上記にて要検討とした事項を満たせると思いました。
- 取得した温度情報をローカルストレージにアクセスする以外の方法で簡便に確認出来ること
→ LSCのメトリクス監視にて対応可能 - 温度の推移をダッシュボード等で確認出来ること
→ LSCの基本機能にて対応可能 - 温度監視プログラムが意図せずに停止しているか確認出来ること
→ LSCの基本機能にて対応可能
実装準備
最近、社内にてプログラミングが流行っています。
その中でPythonを勉強することがありましたので、そちらで温度監視プログラムを実装することにしました。
また、実装するにあたりAmazonで温度センサーを購入しました。
・DSD TECH DHT22 温湿度センサーモジュール AM2302チップ付き
(はんだ付けする必要もないためオススメです。)
おおよその取得値がラック内の温度と同じであったため、誤差もほとんどないかと思われます。
上記のセンサーはC言語での温度取得プログラムしかライブラリーがないのですが、Pythonでの実装事例などがありましたので、費用対効果を考えてこちらに決めました。
また、アラートの通知方法ですが、IFTTTを経由してLINE宛に通知することとしました。
このあたりがIoT機器らしく、機器自体がインターネットへアクセスできるため、外部サービス等のAPIを使用しての通知が可能なのです。
実装
温度取得方法
温度センサーから温度を取得する方法については、実装例の通り動作しないことから、個人的に調べることにしました。
まず、温度センサーの使用方法ですが、「Raspberry pi」に対して3つのピンへつなげる必要があります。
・POWER
・GND(グランド)
・GPIO
どこのピンからデータを取得するのかをソースコードに対して反映させる必要があります。
(それぞれのピンに対して実行してみれば取得できるピンが一つしかないことに気づくと思います。)
使用するライブラリは以下のものを使っています。
https://github.com/adafruit/Adafruit_Python_DHT
ソースコードを読んでみて、使用方法が分かったので、以下の通り実装しました。
import Adafruit_DHT
SENSOR = Adafruit_DHT.DHT22
PIN = 4
def returnTemperature():
humidity, getTemperature = Adafruit_DHT.read_retry(SENSOR, PIN)
if getTemperature is not None:
return '{0:0.1f}'.format(getTemperature)
else:
sys.exit(1)
異常値の場合にIFTTTにリクエストを行う
今回最も時間がかかると思っていましたが、かなり簡単でした。
IFTTTでのWebhooksを使っての実装になりました。
細かい内容については記載しませんが、
最初の「If This」の「Add」ではWebhooksを選択し、
二つ目の「Then That」の「Add」では、LINEを選択します。
LINEの設定では以下のように行います。
・Recipientには通知を送るグループなどを選択
・Messsageでは、通知を送る際に使用する文字列を定義
色の違うValue1は、いわば変数です。
この変数の使用方法はWebhookのDocumentationに記載されています。
簡単に言えば、IFTTTが指定したURLにvalue1などを含めた、jsonのPOSTリクエストを送ればいいだけです。
PythonでのPOSTリクエストの実施は簡単です。
url="https://maker.ifttt.com/trigger/..."
payload={'value1':temp}
headers={'Content-Type':'application/json'}
response = requests.post(url, data=json.dumps(payload),headers=headers)
urlにIFTTが指定するURLを含めて、payloadにはBody部を定義します。
あとはrequest.postして、それぞれを指定すれば通知を送ることができます。
通知が行われると以下のようになります。
(実装が楽しいあまりお昼を早々に食べ終えてテストしていました。)
通知も行えるようになったので、ほぼ目的はクリアしました。
LSCからRaspberry pi を監視する
LSCから「Raspberry pi」を監視するという第二の目的がありましたので、
社内のLSCに監視用の設定を投入していきます。
まずは「Raspberry pi」のデバイス登録から。
次にメトリクス監視の設定を行います。
今回の実装では、8000ポートでHTTPをリッスンしています。
メトリクス監視の設定画面にて「Wizard」がありますので、こちらをクリックします。
すると簡単にjsonのkeyを取得することができます。
指定し終えたら、設定を完了します。
少し時間をおいて、ログを確認すると問題なく値が取得できています。(値が正常に取得出来ない時は取得値エラーと判定されます。)
またメトリクス監視にて取得した結果をグラフィカルに表示することも可能です。
ダッシュボードより設定を行うことで以下のような表示になります。
次にローカルに保存しているログファイルを「SCPファイル収集」を使って取得する設定も行います。
収集してきたファイルは、LSC上からダウンロードすることができます。
これらの設定を行うことで、最初に問題として挙げた以下の要件を満たすことができます。
- 取得した温度情報をローカルストレージにアクセスする以外の方法で簡便に確認出来ること
→ メトリクス監視で自動的に温度情報を取得する。 - 温度の推移をダッシュボード等で確認出来ること
→ LSCの標準機能の一つであるダッシュボードにてメトリクス監視で取得した温度情報をグラフに描画する。 - 温度監視プログラムが意図せずに停止しているか確認出来ること
→ メトリクス監視にて温度情報が取得できず、取得値エラーが継続した場合にプログラムが停止したと判断する。
その他、PING監視やTCPポート監視等の設定を行うことも可能であるため、機器自体の疎通が取れないのか、プログラムが停止したのかの切り分けも可能です。
実装後
稼働状況としては特に問題なく、想定通りの動作をしています。
冒頭にも記述しましたが、弊社のLogStare Collectorのデモサイトにて実装例を公開しています。
ただ、LINEに通知が来たことがないため、温度監視システムが真の能力を発揮したことはありません。
しかしやはり監視を行っているというのは、非常に安心感があります。
LSCの長所は設定の簡便さです。
システムの中に組み込むソフトウェアとしても、その準備には手間はかかりません。
システム開発の現場においても動作テストを行うことはあるかと思います。
LSCを使うことで、それらの手間を抑えることが可能と存じます。
さらに柔軟な監視が行えるようになったLSCを使っていただけると幸いです。
https://www.secuavail.com/product/logstarecollector/download-free/
以上で本記事の説明は終了となります。
記載されている会社名、システム名、製品名は一般に各社の登録商標または商標です。
当社製品以外のサードパーティ製品の設定内容につきましては、弊社サポート対象外となります。