[8.16.0] Kibana Dev Consoleでの入力をPython及びJavascriptのコードに出力する

# はじめに
KibanaのDev Console(Dev Toolsの機能)はElasticsearchのAPIを試すのに非常に有用なツールです。
https://www.elastic.co/guide/en/kibana/current/devtools-kibana.html
これまではDev Consoleで試したAPI入力をcURL形式で出力する方法はサポートされていましたが、8.16より新しくPythonとJavascriptのコードの形で出力できるようになりました。
https://www.elastic.co/guide/en/kibana/current/console-kibana.html#import-export-console-requests
今回は上記の機能に加えて8.16で追加になった履歴機能なども紹介していきます。

# Dev Tools
開発者用の便利機能集です。
- Dev Console
    - 今回紹介する機能
- Search Profiler
    - 検索にかかった時間など詳細に調べるための機能
- Grok Debugger
    - Grokパターンツール
- Painless Lab
    - Painlessスクリプトツール

# Dev Consoleとは？
左上の3本線=>Managementの下のDev Toolsをクリックすると、デフォルトでDev Consoleが開きます。8.16から以下のようになりました。
![スクリーンショット 2024-11-25 10.07.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/0356db74-f4e4-1abc-b3ff-e81f935be98f.png)
地味ですが以下の2つの機能がかなり嬉しいです。
- Clear this input
    - これまでは長くなると自分で消すしかなく面倒でしたがクリック一つで消えるようになりました。
    - 消す前に右上にある`Export requests`を実行しておくとテキストファイルとして残せます
    - 保存したテキストファイルはImportもできます
- History
    - みんな欲しかったんじゃないでしょうか。履歴はブラウザに保存されているのでブラウザの履歴を消すとDev Consoleの履歴も消えます。右下の`Add`をクリックすると選択しているものがDev Consoleにコピーされます。いや便利。
![スクリーンショット 2024-11-25 10.48.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/3b482f35-8c40-2995-c281-05d1aabbdee5.png)

## Dev Consoleの簡単な紹介
名前の通り開発者向けではありますが、ちょっと調べたいときには使えるので簡単に紹介しておきます。
基本的には下記に記載のあるAPIを実行するためのツールです。
https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html
例えば検索では以下のように使います。
`seminar`というインデックスに対して、`description`フィールドにある全文検索で`テスト`というキーワードを探す、というものです。
```
GET seminar/_search
{
  "query": {
    "match": {
      "description": "テスト"
    }
  }
}
```
インデックスを作成したり、設定の変更などにはPUTやPOSTを利用します。
よく使うのはクラスタの状態を確認する`_cat`APIです。
`GET _cat/indices?v`と入力して、赤く囲った三角をクリックすると実行されます。
![スクリーンショット 2024-11-25 14.08.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/efc70eaf-6c14-6b7c-0641-bc3760b959b8.png)
右側が実行結果ですが、これはインデックスの一覧が表示されています。
`?v`をつけることで一番上に表示されている情報が何かというのが示されています。
## Code Exportの機能
Code ExportはDev Consoleで実行したものを外部から実行する際のコードとして出力するものです。これまではcURLコマンドとして出力できました。
実行するための右矢印の横にある3つの点をクリックすると`Copy as curl`というのが出てきます。
![スクリーンショット 2024-11-25 11.35.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/e5acfab8-1754-c8b3-2687-fe654f598c2f.png)
クリップボードにコピーされているので、テキストエディタ等に貼り付けると以下のように表示されます。
(URLの部分は一部隠してあります)
```sh
curl -X GET -H "Content-Type: application/json" -d '{"query":{"match":{"description":"テスト"}}}' "https://xxxxxx.asia-northeast1.gcp.cloud.es.io:443/seminar/_search"
```
これを`sh`などで実行するとDev Consoleで表示されたものと同じものが返ってきます。
ここにAuthenticationの情報はないのでそれは追加する必要はあります。
例えば、以下のように`elastic`ユーザとパスワードを指定します。
```sh
curl -X GET -u elastic:hogehoge -H "Content-Type: application/json" -d '{"query":{"match":{"description":"テスト"}}}' "https://xxxxxx.asia-northeast1.gcp.cloud.es.io:443/seminar/_search"
```
### PythonでのExport
`Copy as curl`の横に`change`とあるので、それをクリックすると以下のようになります。
![スクリーンショット 2024-11-25 14.23.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/aa96f62e-d4f1-e1ae-9adf-54911022503e.png)
ここでPythonを選び、`Copy code`をクリックするとPythonコードがクリップボードにコピーされるので、テキストエディタに貼り付けてみます。
```python
import os
from elasticsearch import Elasticsearch

client = Elasticsearch(
    hosts=["https://xxxxxxxx.asia-northeast1.gcp.cloud.es.io:443"],
    api_key=os.getenv("ELASTIC_API_KEY"),
)

resp = client.search(
    index="seminar",
    query={
        "match": {
            "description": "テスト"
        }
    },
)
print(resp)
```
`ELASTIC_API_KEY`というAPIキーでアクセスする形のコードが出てきています。
このAPIキーは以下のページに説明があります。
https://www.elastic.co/guide/en/kibana/current/api-keys.html
#### デフォルト出力をPythonにする
以下の画面で`Set as default`をクリックするとPythonがデフォルトのExportに切り替わります。
![スクリーンショット 2024-11-25 14.35.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/bf7b8862-36fb-4f79-9bab-adcddfa5bfe0.png)
![スクリーンショット 2024-11-25 14.36.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/849b75b4-af18-232c-b347-0db87c19777c.png)

### JavascriptでのExport
Javascriptで出力すると以下のようになります。
```javascript
const { Client } = require("@elastic/elasticsearch");

const client = new Client({
  nodes: [
    "https://xxxxxxxx.asia-northeast1.gcp.cloud.es.io:443",
  ],
  auth: {
    apiKey: process.env["ELASTIC_API_KEY"],
  },
});

async function run() {
  const response = await client.search({
    index: "seminar",
    query: {
      match: {
        description: "テスト",
      },
    },
  });
  console.log(response);
}

run();
```

# まとめ
こちらの機能を利用することで、まずDev Consoleで動きを確かめてから、PythonやJavascriptで本格的にコーディングに入る、という効率的な開発を行うことができます。
新しくなったDev Consoleを是非お試しください。