ZuKitでInfluxDBをUnity Editorと繋いでデータをビジュアライズをする



概要

大量のデータの時系列での変化をグラフにしたかったんだけど面倒くさかったのでinfluxDBに丸投げビジュアライズできるようにした。


ZuKit

これ。

https://github.com/sassembla/ZuKit



influxDBとChronografのセットアップについてはこの辺を参考にする。

「InfluxDB + Chronograf 」をDocker Composeで動かす

https://zutech.netlify.app/posts/20200613/



どういうことがしたかったか

Unity Editor上でフレームごとに出る大量のデータがあり、そのデータのフレーム単位での推移をグラフ化したかった。

データの非可逆な圧縮と展開を行う必要があり、それらの再現度もチェックしたかったので、同時に多量のデータを1つの図に載っけないといけない、という需要があり、とにかく辛かったので作った。


ZuKit側がInfluxDBへとprecision(精度) nsでデータを送りつけている。



今回使うInfluxDBのdocker-composeと起動


こんな感じ。

version: '3.1'

services:

  influxdb:

    container_name: influxdb

    image: influxdb

    ports:

      - "8086:8086"

    volumes:

      - influxdb:/var/lib/influxdb


  chronograf:

    container_name: chronograf

    image: chronograf

    ports:

      - "8888:8888"

    links:

      - influxdb

    volumes:

      - chronograf:/var/lib/chronograf


volumes:

  influxdb:

  chronograf:


んでlocalhost:8888にアクセスするとChronografのUIが表示できるんだけど、localhost~って書いてあるところをindluxdbに書き換えないとchronograf->influxdbへの接続ができない。

これどうやって解決したっけな、、忘れた。



使い方

1. InfluxDBにmyZuDBとか適当な名前でDBを作る


これに

スクリーンショット 2020-12-27 21.57.08.png

こう。

名前は適当でいいんだけど、Unity側からも指定する必要がある。

スクリーンショット 2020-12-27 22.14.33.png



2. UnityのStart関数とかにZuKitのSetupコードを書く


こんな感じ

ZuKit.Setup(

    "http://localhost:8086",

    "myZuDB",

    () =>

    {

        return new ZuValues(

            (new ZuKey("key", ("index", 0), ("temp", 1)), Time.frameCount),

            (new ZuKey("key", ("index", 1), ("temp", 2)), Random.Range(-100 * Time.frameCount, 100 * Time.frameCount))

        );

    }

);

一応同時にOnApplicationQuitとかにZuKitの終了メソッドを書いておくと良い

void OnApplicationQuit()

{

    ZuKit.Teardown();

}


3. UnityでPlayすると後は勝手にフレーム単位でデータがInfluxDBに届いてビジュアライズできるぞ


こうなる。myZuDBにUnityでセットしたkey、index値、temp(追加した適当なキー)で値が入る。

スクリーンショット 2020-12-27 22.04.30.png

そのままUnityEditorPlayさせとくと、こんな感じになる。5sで自動updateとかにするといい感じに推移が

スクリーンショット 2020-12-27 22.05.45.png

やったぜ!



余談

InfluxDBはデータの送り手側が精度を指定できる。

で、精度指定のためのフォーマットとしてRFC3339とかがあるんだけど、ここで問題が出た。


C#にはUnix Time(https://en.wikipedia.org/wiki/Unix_time)を算出できる関数もRFC3339を取得できる関数もない。 msが欠けた状態のRFC3339を得ることはできるが本当にとても微妙なので、そのへんで無駄な努力を強いられて辛かった。


なんとかTimeとかのバカでっかいライブラリで取得できるっちゃあできるんだが、オーバーヘッドが凄まじい。というか言語がいい仕掛け持っててくれ、、

まあC#のdate系は閏秒すらなかったのがここ最近の話なので、スッと諦めて別の手を試した。


こういうので苦労しないようにRFCをガンガン実装したC++実装作ってUnityからぶっ叩けるようにしようかな~って思ってちょいちょいやってる。