【アップデート】Profile API を Kibana でいい感じで可視化できるようになりました

ブログネタがたまりまくりで全然消化できていない、藤本です。

12月8日に Elastic Stack の 5.1.1 がリリースされました。

本日はKibana 5.1.1 releasedで紹介されている Profile API の可視化を試してみました。

Profile API

Elasticsearch 2.2 から Elasticsearch のAPIを解析する Profile API を機能追加しました。

Profile API

例えば、期待する Search クエリの結果と、実際に返ってくる結果が違う、特定の API のレスポンスが遅い、期待する順番でソートされていない(スコアリングが想定と違う)、といった状況はよくあるのではないでしょうか。Elasticsearch を導入してみたけど、運用してみたけど、Elasticsearch が中で何しているのか全然分からない、という方(私)へ Profile API により解析のヒントを得ることが可能となりました。クエリによって Elasticsearch の内部でどのような解析がされていて、どのような結果を受け取って、それら処理がそれぞれどのくらい時間がかかっているのかを取得することができます。

例えば、このブログのタイトルをインデキシングしてみて、検索してみましょう。Analyzer はkuromojiを利用しています。

Console_-_Kibana 4

「いい感じに可視化」でクエリを投げてみます。

Console_-_Kibana 5

検索に引っかかりました。引っかかりそうな気がしますが、内部でどのようなクエリが発行され、その結果を取得できているのでしょうか。

これを解析するのが Profile API です。それでは Profile API を有効化して、検索します。Profile API はクエリに"profile": trueを追加するだけです。

Console_-_Kibana 6

シンプルなクエリでも結果は非常に長い JSON です。272 行あります。ざっくりサマリます。

今回のインデックスにはシャードが 2つあり、それぞれから検索しています。

  "profile": {
    "shards": [
      {
        "id": "[u1qouO4MTKia7YVCafxbng][blog][0]",
        "searches": [
          :
      },
      {
        "id": "[u1qouO4MTKia7YVCafxbng][blog][1]",
        "searches": [
          :
      }
    ]
  }

「いい感じに可視化」という文字列を「いい」、「感じ」、「可視」、「化」に分け、それぞれ TermQuery を実施し、それらの結果を BooleanQuery(And)を実施していることがなんとなく分かります。

    "shards": [
      {
        "id": "[u1qouO4MTKia7YVCafxbng][blog][0]",
        "searches": [
          {
            "query": [
              {
                "type": "BooleanQuery",
                "description": "title:いい title:感じ title:可視 title:化",
                  :
                "children": [
                  {
                    "type": "TermQuery",
                    "description": "title:いい",
                      :
                  },
                  {
                    "type": "TermQuery",
                    "description": "title:感じ",
                      :
                  },
                  {
                    "type": "TermQuery",
                    "description": "title:可視",
                      :
                  },
                  {
                    "type": "TermQuery",
                    "description": "title:化",
                      :
                  }
                ]
              }
            ],
            :
          }
        ],

またクエリにかかった時間や、件数、スコアなどが細かく出力されています。(Profile API 自体はこっちの解析の)

                  {
                    "type": "TermQuery",
                    "description": "title:いい",
                    "time": "0.04540600000ms",
                    "breakdown": {
                      "score": 334,
                      "build_scorer_count": 1,
                      "match_count": 0,
                      "create_weight": 34468,
                      "next_doc": 694,
                      "match": 0,
                      "create_weight_count": 1,
                      "next_doc_count": 2,
                      "score_count": 1,
                      "build_scorer": 9905,
                      "advance": 0,
                      "advance_count": 0
                    }
                  },

いかがしょうか?わかると言えば、わかりますが、、複雑なクエリとなると解析に時間がかかりそうです。。。

Profile API のドキュメントにも下記のように記載されています。

The output from the Profile API is very verbose, especially for complicated requests executed across many shards. Pretty-printing the response is recommended to help understand the output

Profile API

Profile API の可視化

そこで今回のアップデートである Kibana とのインテグレーションです。

ちなみに今回のこの機能は X-Pack の機能となります。X-Pack といえば、有償プラグインのイメージが強いですが、この機能は無償で利用することができます。ここ大事!

Elastic のサブスクリプションは OPEN SOURCE、BASIC、GOLD、PLATINUM の 4種類があります。Profile API の可視化は BASIC で利用でき、BASIC は Web フォームに入力するだけで利用できます。X-Pack Monitoring のシングルクラスタ利用と同じ扱いとなります。

それでは早速試してみましょう。

Console の上に Profiler が追加されています。

Kibana

Index、Type、クエリの内容を入力し、Profile をクリックします。

いい感じの画面が表示されました。Web API の JSON のレスポンスに比べると、圧倒的に理解が早いですね!

まとめ

いかがでしたでしょうか?

今まで提供されていたが、利用するのに気力が必要だった Profile API が、Kibana とのインテグレーションにより可視化されました。しかも、無償利用できます!使わない手はないでしょー。