Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

KarateでElasticsearchの状態をチェックする

こんにちは、Elastic Certified Engineerのshin0higuchiです😊

みなさん、Elasticsearchの正常性確認はどうしていますか?

実際にサービスを運用するとなると、一口に「正常性確認」と言っても色々な観点でのチェックが必要です。
システムの死活、リソースの状態、パフォーマンス、検索queryの妥当性などなど......

Monitoring+Alertingで監視したり、その他の監視ツールやelasticのsupport-diagnosticsを使ったり、人によってはcurlコマンドで確認するシーンもあるのではないでしょうか?
ただ、個人的には、観点が多いと色々なツールを組み合わせたチェックが必要になり、多少手間を感じていました。


そこで、今回は上司に教えてもらったKarateというテスト自動化ツールが、Elasticsearchと相性が良さそうだったのでしてみました。

そもそもKarateとは?

Karateは、CucumberというBDD(ビヘイビア駆動開発)を行うためのフレームワークをJavaVM上に移植したもので、Gherkinの文法を自然言語に近い形で記述できるユニットテストツールです。

こちらの@takanorigさんのQiita記事を読めば大体わかります。
qiita.com

個人的に感じているメリットとしては、

  1. シナリオベースのテストが簡単にかける
  2. 学習コストが低い
  3. JSONが扱いやすい

といったところです。

実際にやってみる

KarateでElasticsearchのStatusなどをチェックしてみましょう。
今回は一例として

  1. 想定する設定と実際のクラスタ設定の差分がないか?
  2. indexの検索などが正常に行われるか?
  3. 操作が特定時間以上かかっていないか?

などを確認します。

細かい説明は前述の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になっていることがすぐにわかりますね。
f:id:acro-engineer:20190529100428p:plain:w800

まとめ

APIステータスコードを確認する他、レスポンスのJSONを扱うのが容易で、サクサクとテストケースがかけるのは非常に便利だと感じました。

設定が手軽であることにくわえ、柔軟なテストケースを作成できることが魅力の一つ。
登録→検索→削除のようなシナリオを試験したり、プラグインのバージョンチェックなどもできるので、定期実行させておくと便利そうです。

以上です。お読みいただきありがとうございました。

Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

世界初のElastic認定エンジニアと一緒に働きたい人Wanted! - Acroquest Technology株式会社のエンジニア中途・インターンシップの求人 - Wantedlywww.wantedly.com