撮影ログをDatadogでリアルタイム可視化

リアルタイムでモニタリングしたい

構内で写真撮影をしているとき,撮影の日時,枚数をざっくりリアルタイムに観たいなと思っていました.ワークショップとか授業に使えるんじゃないかと.

そんな中,FlashAirのバージョン3以降は,Luaスクリプトによるプログラミングが可能であることを知りました.

以下の画像は,Datadogを使ってモニタリングしている様子です.

dd_board

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 Listvalue=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カードをカメラに差し込み,シャッターを押します.

dd_board

  • 上段のリストが直近1時間の機種毎の撮影枚数です.
  • 下段のグラフは直近1時間の機種毎の撮影タイミングです.撮影した時刻が値1となります.

DatadogのダッシュボードもTTWで簡単に作成できます.

おわりに

写真撮影のログの可視化にチャレンジしてみました.FlashAirとDatadogの連携も手軽にできることがわかりました.Lua言語を初めて使ってみましたが,シンプルで楽しかった! 次は,現在は,WiFiネットワークがないときは,モニタリングできないので,ネットワークが無いときは,ローカルに記録し,ネットワークがあるときにまとめて送信なんてことにチャレンジしてみようと思う.

参考