■前提

Kibana <= kibana-3.0.0 milestone4


■何が起きたか

去年の12月ぐらいに、「Elasticsearch + Kibana って、ログの可視化に超便利ジャーン!」という感じでKibanaを利用していたところ、Histgramの描画でちょっと微妙な現象に遭遇。


例えば、


Timevalue
2014/11/08T09:00:0010
2014/11/08T09:30:0030
2014/11/08T10:00:0020

な感じのデータでHistgramを描画した時、自分はこう描画して欲しかった。



が、描画されるのは以下のようなグラフ。



■どういうことなのか

この二つのグラフはご覧の通り、Intervalの値が異なる。前者のグラフは30分、後者のグラフは10分。

んで、KibanaはIntervalごとに値を表示しようとする。

しかし、10分ごとの場合、9:10、9:20などには値が欠損している。

この時Kibanaは勝手に0を補完する。


いやー気が利くねー(白目


■どう思った?

確かに0を補完して描画して欲しい場合もあるだろうから、間違ってはいない。

しかし、今回の自分のように、余計なことすんじゃねーよ、という場合も普通にある。

なので、選べるようにした方がよくねー?


あと前者のグラフのように、データが一定間隔でかつ欠損がなく、Intervalの値をその間隔に設定できる場合、この事象は発生しない。

だけど、こういう場合であろうとなかろうと、発生しないでほしい。。。


■それでどうしたのか

Githubでソース読んでたら、実は既にグラフ描画の仕方が選択できるように実装されてた。ここらへん

(ちなみにこの描画方式はコード上ではstrategyと呼ばれているので、以下strategy)

なんだけど、今回のような「値のない時間に0を補完しない」というstrategyは当時はなかった。


というわけで、実装して、issue作って、プルリク送っときました。#742

そしたら忘れた頃にマージしてもらえました。

上記コードにある_getNoZeroFlotPairsがソレです。

この実装ではIntervalがどんな値だろうが、欠損値に0を補完しなくなります。


次のリリースでは乗っかると思われます。

ただ、以前コードを見た時は、そもそもstrategyを選択するUIがなかったので、画面からはまだ使えないかもしれん。。。


■すぐ使いたければどうすればいいのか

リリースまで待てない人は上記ソースを参考にして改修すると良いと思います。


もしくは、とりあえず今すぐちょっと試したい方なんかは、乱暴だけど、

app/panels/histogram/timeSeries.js

ts.ZeroFilled.prototype._getMinFlotPairs

を以下のように改修するのが一番手っ取り早いです。

1
2
3
4
5
6
  ts.ZeroFilled.prototype._getMinFlotPairs = function (result, time, i, times) {
    if(this._data[time]){
      result.push([ time, this._data[time]]);
    }
    return result;
  };

#人によっては改修後にブラウザのキャッシュクリアが必要かもしれん

ちなみにコードをいじる場合は、公式サイトからDLしたkibanaだと改修が大変なので、Github内のリリースから落としたコードを利用すると幸せになれると思います。


■まとめ

  • 今のKibanaのHistgramは欠損値に勝手に0を入れる
  • それをOFFにするオプションを実装して、プルリク送って、マージされた
  • 自分でがんばって書き換えればすぐに使えるよ