IntelliJ, Docker, Dashboardsを使用してOpenSearchのデバッグ環境をサクッと作ってみた

こんにちは。Supership株式会社データソリューションスタジオの懸川です。

:::note warn
この記事は、[Supershipグループ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/supership)の23日目の記事になります。
:::
# はじめに
先日、OpenSearchの内部の処理を見てみるという目的でOpenSearchをソースコードからビルドしてIntelliJでデバッグをしてみました。挙動を理解する上で、サンプルデータがあった方が色々と都合がいいのですが、いちいち用意するのは面倒でした。そこでOpenSearch Dashboardという可視化ツールの機能の一部であるサンプルデータの生成を利用して、ワンクリックでデータを用意しました。
この記事では, DockerでOpenSeach Dashboardsを起動&サンプルデータ生成し、IntelliJでサクッとOpenSearchのデバッグ環境を作る方法を紹介したいと思います。

# 環境
* OS: macOS Ventura (m1)
* OpenSearch: v2.11.2
* OpenSearch Dashboards: v2.11.1
* IDE: IntelliJ IDEA 2023.2.5 (Community Edition) 
* Java: v17.0.9
* Docker Desktop: v4.25.2

※ 本記事はIntelliJの使用を前提としています。IntelliJはインストール後に特に設定をしなくてもポチポチするだけですぐデバッグできたのでおすすめです。IntellijのCommunity Editionであれば無料で使用することができるので是非。

# 1 IntelliJでOpenSearchをデバッグモードで起動
### 1.1 OpenSearchのソースコードをクローン
https://github.com/opensearch-project/OpenSearch
ローカルに上のリポジトリをクローンします。
```shell
$ git clone -b 2.11 git@github.com:opensearch-project/OpenSearch.git
```
今回はmainブランチではなく最新のリリースバージョンのブランチ(作成時は2.11)を使用します。これは後でDockerで起動させるOpenSearch Dashboardsとバージョンを合わせる必要があるためです。存在するDashboardsのコンテナイメージのバージョンは[こちらのDocker Hub](https://hub.docker.com/r/opensearchproject/opensearch-dashboards/tags)から確認できます。(パッチバージョンに関してはズレていても動きました)

### 1.2 OpenSearchのbuild
今回はローカル環境でのみ動けば良いので以下のコマンドでビルドします。
```
$　./gradlew localDistro
```

### 1.3 IntelliJでデバッガを起動
ここまでできたら、IntelliJを起動してクローンしたOpenSearchディレクトリを開きます。
開くと、右上に虫のマークのボタンがあると思うのでこれをクリックします。おそらくデフォルトの設定のままで問題ありません。
![スクリーンショット 2023-12-21 1.00.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629261/8393276f-db66-8ebe-7aa8-dab213cd0dfa.png)

### 1.4 デバッグモードでOpenSearchを起動
--debug-jvmオプションをつけてOpenSearchを起動させます。
```
$　./gradlew run --debug-jvm
```

うまくいけば9200番ポートでOpenSearchが立ち上がっているはずです。
```
$ curl localhost:9200
{
  "name" : "runTask-0",
  "cluster_name" : "runTask",
  "cluster_uuid" : "5VoG1PGdSRWj847fe1D8Vw",
  "version" : {
    "distribution" : "opensearch",
    "number" : "2.11.2-SNAPSHOT",
    "build_type" : "tar",
    "build_hash" : "a5cc55494530c8992220d53a94c2c09994f3e14f",
    "build_date" : "2023-12-20T15:18:42.527656Z",
    "build_snapshot" : true,
    "lucene_version" : "9.7.0",
    "minimum_wire_compatibility_version" : "7.10.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "The OpenSearch Project: https://opensearch.org/"
}

```

これでOpenSearch側の準備は完了です。

# 2 Docker でOpenSearch Dashboardsを起動
### 2.1 ファイルの準備
基本的にはOpenSearch Dashboardsのコンテナイメージがあるのでそれを使用すればいいのですが、デフォルトの設定だとユーザー名とパスワードの入力が必要になります。
[Quic Start](https://opensearch.org/docs/2.11/dashboards/quickstart/)にはどちらも`admin`で認証ができると書いてあるのですが、私の環境ではなぜか認証できませんでした。そこで今回の目的はあくまでOpenSearchの内部の処理の確認ということもあり、ユーザー認証を除外するようにします。([認証除外ドキュメント](https://opensearch.org/docs/latest/security/configuration/disable/))
以下がユーザー認証を除外しつつOpenSearch Dashboardsを起動するのに必要なファイルです。
```
$ tree opensearch-dashboards
opensearch-dashboards
├── Dockerfile
├── compose.yml
└── opensearch_dashboards.yml
```
```Dockerfile:Dockerfile
FROM opensearchproject/opensearch-dashboards:2.11.1
RUN /usr/share/opensearch-dashboards/bin/opensearch-dashboards-plugin remove securityDashboards
COPY --chown=opensearch-dashboards:opensearch-dashboards opensearch_dashboards.yml /usr/share/opensearch-dashboards/config/

```
```yaml: compose.yml
services:
  opensearch-dashboards:
    build: .
    image: opensearch-dashboards-no-security
    container_name: opensearch-dashboards
    ports:
      - 5601:5601

```
```yaml: opensearch_dashboards.yml 
---
server.name: opensearch-dashboards
server.host: "0.0.0.0"
opensearch.hosts: http://host.docker.internal:9200
```
ポイントはopensearch_dashboards.ymlの`opensearch.hosts: http://host.docker.internal:9200`です。OpenSearch自体はホストマシン上で動作しているので、opensearch-dashboardsコンテナからはDockerホストの9200番に向けて通信させるようにします。

### 2.2 OpenSearch Dashboardsのイメージのビルドとコンテナの起動
イメージのビルド
```
docker compose build
```
コンテナの起動
```
docker compose up -d
```
ブラウザから`localhost:5601`にアクセスして以下のようにホーム画面になれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629261/d230abc8-38f3-1eb9-5850-828806ea7f30.png)

### 2.3 サンプルデータの追加
ホーム画面に左下の`Add sample data`をクリックすると以下のような画像になるので好きなサンプルデータを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629261/1d97738f-701c-1efe-0a82-000f8e5ae5ff.png)

これでDashboards側の準備は完了です。

# 3 IntelliJでブレークポイントを追加し、DashboardsからAPIを叩いてみる
最後に私がこれらを使ってどのように挙動を確認しているか紹介します。
### 3.1 IntelliJでブレークポイントの設置
今回はドキュメント数を返すAPIが実装されている箇所にブレークポイントを設置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629261/ce091bb6-9066-0b41-d43b-51816492015b.png)

### 3.2 DashboardsからOpenSearchAPIにリクエスト
Dashboardsのホーム画面 > Interact with OpenSearch APIから以下のようなコンソール画面が開けて、ここからAPIに対してリクエストができます。今回は`GET _count`で実行してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629261/4a4e9d7e-6b3d-cb4a-7f39-9b75eef640a2.png)

### 3.3 IntelliJで確認
Dashboardからリクエストをすると画像のようにブレークポイントで処理が止まり、呼び出しの流れや変数の中身などを確認することができます。キャプチャ中央あたりに`4691 hits`と書いてあるのがわかるかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629261/b6e3f311-2b60-03eb-0b3f-a84db3352f91.png)

## おわりに
今回はIntelliJやDocker, OpenSearch Dashboardsを使用して簡単にOpenSearchのデバッグ環境を作成する方法を紹介しました。必要な作業も少なく、また一度環境を作ってしまえば次からは数コマンドで作り直すことができるので「OpenSearchの内部を確認する」という本来の目的に集中できるのではないかと思います。


:::note
**最後に宣伝です。**

Supershipではプロダクト開発やサービス開発に関わる人を絶賛募集しております。
ご興味がある方は以下リンクよりご確認ください。
[Supership 採用サイト](https://supership.jp/recruit/)
是非ともよろしくお願いします。
:::