InfluxDBへ保存したFlowServiceのログをGrafanaでグラフにしてみる


前回から

InfluxDBPutコンポーネントを作成して、InfluxDBへFlowServiceのログをInfluxDBへ入れてみました。
データを入れたら時系列データベースですし、グラフにしたくなります。

Grafana

何かお手頃にグラフにできるものということでGrafanaを使ってみます。
https://grafana.com/

アカウントを作ってログインします。

Data Sources で InfluxDB がありますので追加します。

URLだけでつながりそうです。
今回はAWSのインスタンスを使用しているので、つながるようにしておきます。

つながりました。

データの問題

クエリーを試していて気が付きましたが、ログデータが欠落していました。
FlowServiceのログにはよくあることですが、同じ時刻に複数のログを出力しています。
これは問題です・・・
全てのログを入れたいので、保存するデータの時間単位をNanoSecondsにした場合、
timeへMilliSecondsの値を指定すると、こっそりナノ秒を追加して同じ時刻にならないようにPutコンポーネントを修正しました。

if (FIELD_NAME_TIME.equals(name)) {
    if (timeUnit.equals(TimeUnit.NANOSECONDS)) {
        //nanoはFlowでは無理なので、ここで追加してやる
        //timeをDateTimeで指定した場合でもNANOSECONDSであれば、timeが重ならないようにすることができるようにする
        //Flowのログ対策
        time = fieldValue.longValue() * 1000000;
    } else {
        fieldTime = fieldValue.longValue();
    }

また、タグを指定した場合にInfluxDBのフィールドが予期しない事になるのでタグは指定しないようにしました。
現象:statusフィールドが、statusとstatus_1のフィールドになり、検索できなくなる。

試行錯誤の結果、以下のようなレコードストリームを使用することにしました。

<Record>
    <Field name="time" type="String">2019-03-26T09:03:28.012585455Z</Field>
    <Field name="code" type="String">AFRM_I_9017</Field>
    <Field name="data" type="String">プロセス監視スレッドを起動します</Field>
    <Field name="status" type="String">DEBUG</Field>
    <Field name="worker" type="String">[framework,main]</Field>
</Record>

使用するログのレコードは7458レコードで、バッチ件数10000に設定したPutコンポーネントで一発で登録します。

グラフ

10分間隔で、3つの棒グラフを並べてみました。

フローの実行開始数のグラフ
SELECT count("status") FROM "test" WHERE ("code" = 'FLEX_I_0001') AND $timeFilter GROUP BY time(10m)

エラー数のグラフ
SELECT count("status") FROM "test" WHERE ("status" = 'ERROR') AND $timeFilter GROUP BY time(10m)

フローの実行終了数のグラフ
SELECT count("status") FROM "test" WHERE ("code" = 'FLEX_I_0002') AND $timeFilter GROUP BY time(10m)

まとめ

なんとかFlowServiceのログをグラフにすることができました。
クエリーでグラフを後から自由に作成できるのはうれしいです。
タグの件は不明なので、もう少し調べたいです。