仕事の成果を流用して趣味的な監視アプリケーションを作成メモ

放置していたけど、たまには雑記を書いてみたり(・∀・;)
最近、vSphere SDKを叩いたり、運用監視系のツールを作ったりもしていたので、その成果を流用して個人的に作った監視アプリケーションについて書いてみます。

システム概要

さて、開発や保守用途でVMを使うのは一般的になりつつある今日この頃ですが(・∀・)
VMの台数が増えてくると、稼働監視やリソースの使用状況のチェックも必要になってきます(・ω・;)


プライベートクラウドとか、会社のちゃんとした環境であれば、お金を出して稼働監視ツールを導入したりしますが。
自分達で勝手に作っている開発環境であれば、VMホストも無料のESXiだったり、監視ツールOSSのものを使用したりと言うことが多いと思います(・ω・)


っで、稼働監視の方法についてですが、VMゲストのWindowsLinuxについては、稼働監視ツールのエージェントをインストールして、情報収集を行うかと思います。
しかし、ESXiのホストについては、エージェントが対応していないケースがほとんどだと思います。
Linuxベースではあるので、staticな感じで無理矢理コンパイルしてみたり、スクリプトベースのエージェントもどきを作ってみるという手も無くはないですが(´д`;)
でも、そういった小細工はしなくても、ESXiが公開するWebサービスから各種パフォーマンスカウンターの値(VMware vSphere Clientのパフォーマンスタブで表示できる値に同じ)を取得できるので、その値を使用した稼働監視なら行えます(・∀・)


また、パフォーマンスカウンターについてはゲストの値も取得できるので*1、これらの値を収集してWebで表示する簡易監視アプリケーションを作ってみました(・∀・)

システム構成

概略図はこんなんです(・ω・)

ESXiが公開するWebサービスから、パフォーマンスカウンタを定期的に取得するアプリをJavaで作成して。
このアプリを、Linux上でデーモンとして動作させて、取得した各種値はMySQLに保存しています。


また、MySQLに保存した値から、稼働情報のダッシュボード表示と、パフォーマンス値のグラフ表示を行うアプリケーションをASP.NET MVCで作成して、Windows上で稼働させています(・ω・)


…っで、なんかJavaも.NETも使ったり、Linux上でもWindows上でもアプリが動いていたりしますが、本質的にはこんな構成にする必要はありません(´д`;)
このシステムと同様の事はJava/Linuxオンリー、あるいは.NET/Windowsオンリーな構成でも構築可能です。


単に、仕事でやったことの成果を流用したり、開発環境に相乗りさせているため、こんな構成になっているだけです(・∀・;)
自分は最近、JavaVMwareWebサービスを叩いたり、.NETでグラフ表示ということをやっていたので、その成果をそのまま流用するため、こんな構成になっているのでした(´д`;)

Webアプリケーション

っで、作成したアプリケーションですが、ホームを開くと下記の様なダッシュボードが表示されます。

これを見せた人からは、EVAっぽいとか、カッコイイwwwとか笑われましたが、まあ、ゼロ年代的なアニメやゲームっぽいものは意識しました(・ω・)
Webベースで単純に作って、Ajaxによる定期更新をしているだけなので、それっぽく見えるのは第一印象だけだったりしますが(´д`;)
本当は、状態が変わるときにアニメーションしたり、状態が一斉に警告になった時に挿入歌*2が流れたりすると、バカっぽくてもっとカッコイイ感じになりますが(^Д^)


っで、表示内容についてですが、各箱がVMホスト/ゲスト(最上段がホスト、その下がそこにぶらさがっているゲスト)を表していて、状態によって表示される文字や色が変わります。
状態としては稼働(RUNNING)、注意(WARNING)、警告(ALERT)、停止(STOPPED)、消失(LOST)という感じで。
ちなみに、このアプリでチェックしているのはCPU使用率、メモリ使用率、ディスク使用率だけですが、チェックする項目や閾値は設定で変更できるようにしています。


そして各箱をクリックすると表示されるのが、以下のグラフになります。

このグラフの値は、VMwareWebサービスを使ってパフォーマンスカウンタから取得した物ですが、ディスク使用量や稼働VM数などの情報については、インベントリ情報などから計算した値です。
この辺の値の計算も、プラガブルな実装になっていて、計算式クラスを増やせば任意の項目を追加できるような仕組みにはしています(`・ω・´)

仕事の成果の流用:パフォーマンス収集

っで、この監視アプリを作るために流用した、仕事の成果についても少し。


最近、VMwareWebサービスを使ってパフォーマンス収集みたいな事を仕事でやっていたんですが。
この辺、情報が少なくて(特に日本語の情報は皆無で)ちょっと苦労しました(´д`;)
公式のProgramming Guideに一通りの事はのっているんですが、個人的にはちょっとわかりにくい感じがして(´・ω・`)
もっとサンプルソースも欲しいんだけどということで、結局この書籍を購入したのでした。

VMware VI and vSphere SDK: Managing the VMware Infrastructure and vSphere

VMware VI and vSphere SDK: Managing the VMware Infrastructure and vSphere

もっとも、書籍が届く前になんとかなっちゃったんですけどね(´・ω・`)


ちなみに、稼働情報の収集に使用しているのはVimPortType.retrieveProperties()とVimPortType.queryPerf()の2つです。
まずは、retrieveProperties()でHostSystem、VirtualMachine、Datastoreの情報を収集して。
その後、ホストと各VMについては、queryPerf()により各種パフォーマンスカウンタ値を取得して。
パフォーマンスカウンタから直接取得できないような値については、取得したインベントリ情報とパフォーマンスカウンタ値から計算式クラス*3で2次計算というような事をしています(・ω・)


っで、同じようなことをやってみたい人は、とりあえず上記の書籍を購入することをお勧めします。
英語やvSphere SDKのオブジェクトモデルがよくわかんなくても、各処理のサンプルソースが載っているので、それを見ていけばなんとかなるんじゃないかと思います(・∀・)

仕事の成果の流用:グラフ(チャート)表示

グラフ表示も、ちょっと前に作った物の流用です(・ω・)
要は、RRDToolもどきの、.NET製のビットマップ作成ライブラリです。
ソースの構成は下記の様な感じで。

GraphBuilderがビットマップ作成のコアで。
サイズ、マージンにフォントや色なんかのプロパティを設定して、下記のようなIGraphHistoryのListを渡してやると、その内容に応じたグラフを作ってくれるという作り。

public interface IGraphHistory
{
    DateTime Clock { get; }
    decimal Value { get; }
}

っで、単にグラフのビットマップを作るだけなら単純な話なんですが、各パフォーマンス値によって目盛りのふりかたやスケーリング、グラフの描画方法(線、塗りつぶし)を変えるとなるとやっかいになってきて(´д`;)
その辺をStrategyで実装しているのが他のファイルになります。
っで、今回のVM用のグラフ表示では、それら各種Strategyを下記の様な定義で使用しています。

new GraphDef()
{
    No = 1,
    CounterId1 = Counter.CpuUsage,
    Display = "CPU使用率",
    Render = new LineRender() { LineWidth = 1.7f },
    Range = new FixRange( 10000 ),
    Separator = new FuncSeparator( 1000, _ => _ + 1000 ),
    TextFormatter = new NumTextFormatter() { Unit = "%", NumDigits = 2, Divisor = 100 },
    SeparateTextFormatter = new NumTextFormatter() { Divisor = 100 },
},      
...
new GraphDef()
{
    No = 5,
    Display = "ネットワーク受信/送信",
    CounterId1 = Counter.NetRecv,
    CounterId2 = Counter.NetSend,
    Render = new LineRender() { LineWidth = 1.7f },
    Range = new SizeRange(),
    Separator = new FuncSeparator( 16, _ => _ * 2 ) { Separets = 8 },
    TextFormatter = new SizeFormatter() { Suffix = "B/s", NumDigits = 1 },
    SeparateTextFormatter = new SizeFormatter() { NumDigits = 1, OptionalDotZero = true },
},
new GraphDef()
{
    No = 6,
    Display = "稼働時間",
    CounterId1 = Counter.SysUptime,
    Render = new FillRender(),
    Range = new TimeRange(),
    Separator = new TimeSeparator(),
    TextFormatter = new TimeFormatter() { NumDigits = 2 },
    SeparateTextFormatter = new TimeFormatter(),
},
new GraphDef()
{
    No = 7,
    Display = "VM総数/稼働数",
    CounterId1 = Counter.VmTotal,
    CounterId2 = Counter.VmActive,
    Render = new LineRender() { LineWidth = 1.7f, LineType = LineType.Max },
    Range = new CeilRange( 5 ),
    Separator = new FuncSeparator( 1, _ => ( _ == 1 ? 5 : _ + 5 ) ),
    TextFormatter = new NumTextFormatter() { Unit = "vm", NumDigits = 1, OptionalDotZero = true },
    SeparateTextFormatter = new NumTextFormatter(),
},

CPUを例に取ってみると、描画は線(LineRender)で、上限値は100%の固定(10000というのは、VMwareが使用率を0.01%単位の整数で返すから)、横軸の線は10%(1000)単位で描画して、グラフ下部の現在値や平均値については値を100でわったものに%をつけて描画、っというような内容になります(・ω・)
他の例で言えば、ネットワークの送受信なんかは2の倍数単位でスケールの計算と、K、M、Gとかの単位で文字を描画しますし。
稼働時間は秒、分、時、日(d)〜等の人間が見やすい単位でスケール計算、VM数については5単位でのスケール計算という風な感じになっています。


まあ、このライブラリについては、汎用化するにはもう少し各種プロパティの整理が必要というのと、名称についてもちょっと見直しが必要かなという感はありますが(´・ω・`)

まとめ

っということで、仕事の成果を流用してVMの稼働監視を行うアプリケーションができたのでした。
若干ネタ的な部分があったり、正直実用性は?な部分もありますが。
だって、これとは別にMuninやZabbixも動かしてるし(・∀・;)
まあ、ダッシュボードを見せて、笑いを取るために作ったという意味合いが強いので、そんなんで良しとします。


っで、あとちょっと思ったのだけど、普段事務システムしか作ったことが無いような人も、たまにはこういうおもちゃ(?)を作ってみるのも良いと思うのよね(・ω・)
なぜかというと、こういうものを作るためのノウハウというのは、事務システムを作っているだけでは学べない部分が多いから。
例えばデザパタの知識なんかも、ありがちな事務システムとか作る上では、ぶっちゃけ必要なかったりもますが。*4


でも、だからと言って、そういう知識が必要無いわけではなくて。
むしろこれからの時代は、アドホックなシステム構築のためにも、そういった知識は必須というか常識になるわけで、こういうのをサクサクっと作れない人は、危機感を持った方が良いと思うのよね(・ω・;)
っということで、みんな趣味でミドルやフレームワークを実装してみるのだ、つって(・∀・)

*1:補足すると、この値はホストがゲストに割り当てている値の意味合いなので、例えば同じCPU使用率と言っても、Webサービスから取得できる値と、ゲストOS上で認識できる値では、値も意味合いも異なりますが(・ω・)

*2:警告灯がわりに(・∀・;) 個人的にはJAM Projectあたりを希望(・∀・)

*3:実装としては、稼働VM数/VM総数を計算するHostVirtualMachineCalculatorクラス、DatastoreやVMのDisk情報からディスク使用量等を計算するHostDiskCalculator、GuestDiskCalculatorクラス等を用意

*4:その代わり、むしろアーキテクチャパターンはちゃんと学べ(`・ω・´)