リアルタイムでモニタリングしたい
構内で写真撮影をしているとき,撮影の日時,枚数をざっくりリアルタイムに観たいなと思っていました.ワークショップとか授業に使えるんじゃないかと.
そんな中,FlashAirのバージョン3以降は,Luaスクリプトによるプログラミングが可能であることを知りました.
以下の画像は,Datadogを使ってモニタリングしている様子です.
Datadogサービス
ログを記録・可視化するのに一番便利なサービスとして, Datadogというサービスがあります.研究室にあるサーバーはこのサービスで監視しています.
Datadogの特徴としてメトリクスが自由に定義できるところです.メトリクスには複数のタグをつけることができます.そして,APIが充実しているので,簡単にサービス固有のメトリクスを定義して収集することができます.研究用のWebアプリケーションにはPloneというCMSを使っています.PloneはPython上で動作するので,Python用のライブラリを用いて収集ツールを作成して,固有のメトリクスを送信しています.
Ploneの収集ツールを経由する
Plone用の収集ツールは,Script(Python)からも送信できるようにしてあるので,TTWで受信用のメソッドを作成が可能です.パフォーマンスは出ませんが便利なのでこれを使います.
フロー
フローは, デジカメ(FlashAir) –> Plone + DD Agent –> Datadog となります.
ログの可視化の時,カメラ(FlashAir)毎にフィルタできるように,カウント(1)を渡すときにカメラのモデル名も渡します.
撮影のタイミング = SDメモリーに書き込みイベント?
FlashAir Developpersサイトによると,SDメモリーに書き込みイベントに対してスクリプト実行する機能 LUA_SD_EVENT
がありました.このイベントを撮影日時と捉え,このイベント発生を通知するようにしました.
撮影イベントを送信
ファイル /dd.lua
を作成して下記のように記述
-- Ploneへ撮影したことを通知 v: 値, mdl:固有タグ local function writeCamera(v, mdl) url='http:///photo?value='..v..'&model='..mdl b, c, h = fa.request{ url = url, headers = {Connection = 'close'} } end -- Main writeCamera(1, 'gxr')
これは,SDカードへ書き込みが起こったときに, fa.request
関数でPloneサーバーのURL:photo アドレスにURLパラメータとして,カウント(1)とカメラのモデル名(gxr)を指定しています.
※FlashAirの fa.request
は8080ポート等への通信はできないので注意が必要です.
FlashAirのCONFIGを編集する
SD_WLAN
フォルダ内の CONFIG
ファイルを編集します.
APPMODE=5 APPSSID= APPNETWORKKEY= DNSMODE=0 LUA_SD_EVENT=/dd.lua
APPMODEを5としてSTAモードにします.APPSSID,APPNETWORKKEYを利用するWiFiネットワークにします.DNSMODEを0にします.LUA_SD_EVENTに先ほどのスクリプトを指定します.
PloneのphotoアドレスのScript(Python)
ZMIにて /portal_skins/custom
へ移動し Script(Python)を作成します.
Idに photo
と記入して Save&Edit
ボタンをクリックします.
Parameter List
に value=0, model=''
を入力します.
テキストエリアにDatadogとの通信用の記述をします.このサーバーは,Datadog agentが動いているのでAgentとの通信となります.
request = container.REQUEST response = request.response from ngi.notify.datadog.dd import metric_datadog value = int(value) model = model metric_datadog('photo.count', value=value, tags={'camera': model}) print value return printed
以上で準備ができました.
metric_datadog('photo.count', value=value, tags={'camera': model})
ここでメトリクス名を photo.count
として、カウンタ(1)に対してcameraタグをつけて送信しています.
試してみる
FlashAirカードをカメラに差し込み,シャッターを押します.
- 上段のリストが直近1時間の機種毎の撮影枚数です.
-
下段のグラフは直近1時間の機種毎の撮影タイミングです.撮影した時刻が値1となります.
DatadogのダッシュボードもTTWで簡単に作成できます.
おわりに
写真撮影のログの可視化にチャレンジしてみました.FlashAirとDatadogの連携も手軽にできることがわかりました.Lua言語を初めて使ってみましたが,シンプルで楽しかった! 次は,現在は,WiFiネットワークがないときは,モニタリングできないので,ネットワークが無いときは,ローカルに記録し,ネットワークがあるときにまとめて送信なんてことにチャレンジしてみようと思う.