こんにちは、Elastic Certified Engineerのshin0higuchiです😊
みなさん、Elasticsearchの正常性確認はどうしていますか?
実際にサービスを運用するとなると、一口に「正常性確認」と言っても色々な観点でのチェックが必要です。
システムの死活、リソースの状態、パフォーマンス、検索queryの妥当性などなど......
Monitoring+Alertingで監視したり、その他の監視ツールやelasticのsupport-diagnosticsを使ったり、人によってはcurlコマンドで確認するシーンもあるのではないでしょうか?
ただ、個人的には、観点が多いと色々なツールを組み合わせたチェックが必要になり、多少手間を感じていました。
そこで、今回は上司に教えてもらったKarateというテスト自動化ツールが、Elasticsearchと相性が良さそうだったのでしてみました。
そもそもKarateとは?
Karateは、CucumberというBDD(ビヘイビア駆動開発)を行うためのフレームワークをJavaVM上に移植したもので、Gherkinの文法を自然言語に近い形で記述できるユニットテストツールです。
こちらの@takanorigさんのQiita記事を読めば大体わかります。
qiita.com
個人的に感じているメリットとしては、
- シナリオベースのテストが簡単にかける
- 学習コストが低い
- JSONが扱いやすい
といったところです。
実際にやってみる
KarateでElasticsearchのStatusなどをチェックしてみましょう。
今回は一例として
- 想定する設定と実際のクラスタ設定の差分がないか?
- indexの検索などが正常に行われるか?
- 操作が特定時間以上かかっていないか?
などを確認します。
細かい説明は前述のQiita記事を読んでもらうとして、
Karateでは*.featureというファイルにテストしたい内容を記述します。
フォルダ構成は下記のようになっています。
src
├── main
│ └── java
└── test
├── java
│ ├── health
│ │ ├── HealthRunner.java
│ │ └── health.feature
│ ├── karate-config.js
│ └── logback-test.xml
テストケースはhealth.featureに記述していきます。
設定例
Feature: Health Test
Background:
* url 'http://localhost:9200'
* def index_pattern = 'kibana_sample_data_logs'
* def total_nodes_num = 1
* def data_nodes_num = 1
* def master_nodes_num = 1
Scenario: clusterのステータスがgreen
Given path '_cat/health'
When method get
Then status 200
And print response
And match response contains "green"
Scenario: kibana_sample_data_logs が検索可能
Given path index_pattern + '/_search'
When method get
Then status 200
Scenario: indexの検索レスポンスが100msec未満
Given path index_pattern + '/_search'
When method get
And assert responseTime < 100
And print responseTime
Scenario: cluster statsの結果が正常
Given path '/_cluster/stats'
When method get
Then status 200
And match response.nodes.count.total == total_nodes_num
And match response.nodes.count.data == data_nodes_num
And match response.nodes.count.master == master_nodes_num
And assert response.nodes.os.mem.free_percent > 10
ざっくり説明すると、
Backgroundというセクションで URLやその他の変数を定義しています。こちらは外部ファイルから読み込むことも可能なようです。
そして、各Scenario内で実際にAPIを叩いてその結果を検証しています。
今回はシンプルなケースにしていますが、Scenarioという名前の通り、連続した実行も可能です。
例えば _cat/indicesを叩いて、その結果を使って各indexのstatsを確認するなど。
実行コマンド
mvn clean test -Dtest=HealthRunner
結果
Karateの実行結果は、コンソール出力されるだけでなく、見やすいHTMLを生成してくれます。
例えば下の結果を見れば、StatusがGreenであることを確認するテストが失敗しています。
内容を見ると、クラスタのステータスがyellowになっていることがすぐにわかりますね。