対象者
システム開発チーム、システム運用チーム、SRE
効果
昨今、マイクロサービスや他社サービスとの連携が多くなる中で、サービスリリースにあたっては自社内のテストだけでは不十分になってきており、実環境(またはより実環境に近い環境)へデプロイした上でテストを行うことの重要性が増しています(ブルーグリーンデプロイメント、カナリアリリースなど)。当然、そのテストを自動化することはリリースを迅速に行うためには必要不可欠です。
今回、New Relicの外形監視サービス(*)であるNew Relic Syntheticsを活用して、エンドツーエンドのテストをCI/CDパイプラインに組み込み、自動化する方法をご紹介します。サービス運用中に稼働状況を外部から定期的に監視するのがNew Relic Syntheticsの主たるユースケースですが、これをリリース時にも利用するという内容です。New Relic Synthethicsを活用することで以下のようなメリットがあります。
- New Relicが全世界に保持するロケーションからテストが実行できるため、テスト用のマシンを用意、管理する必要がありません
- CI/CD時のテスト(チェック)と、リリース後に外形監視で行うチェックを同じものにできるため、トラブルシュートの方法が運用前から確立できます。チェックのためのコードが共有できます
- リアルユーザに近い環境でのテストが行えるため、プロアクティブにユーザ体験を計測・改善できます
- CI/CDパイプラインで自動化できるカバレッジが上がります(テスト、およびテスト用スクリプトのデプロイ)
*: サービスが正常に稼働することを保証するために、定期的に外部からサービスへアクセスして稼働状況を監視すること。
New Relic 製品
New Relic Synthetics, New Relic Insights, New Relic One
実現方法
New Relic Syntheticsを活用してエンドツーエンドのテストをオンデマンドに実行するスクリプトを実装してみます。当該スクリプトをCI/CDパイプラインに組み込むことで、リリース時にエンドツーエンドテストの実行を自動化できます。大まかな流れは以下の通りです。
- 事前準備
- APIキーの取得
- Synthetics Monitorの作成
- Synthetics Monitorによるテスト実行(以下をスクリプトで実装)
- 対象となるSynthetics Monitorの情報(状態など)取得
- Synthetics Monitorを有効化
- Synthetics Monitorによるテスト実行(有効化の延長で自動的に実施)
- Synthetics Monitorの無効化
それでは順番に見ていきましょう。
事前準備:APIキーの取得
Synthetics Monitorでテストを実行するスクリプトの中でNew RelicのAPIを使うため、API呼び出し時のユーザ認証に必要な以下のAPI Keyを準備します(画面で表示されているものをコピペ)。
- Admin User API Key: Synthetics Monitorの有効化、無効化を実施
- 取得方法はこちらを参照
- Query API Key: Synthetics Monitorによるテスト結果を取得
- 取得方法はこちらを参照
事前準備:Synthetics Monitorの作成
New Relicの画面SyntheticsからSynthetics Monitorを作成します。作成方法の詳細はこちらを参照。
New Relic Syntheticsは外形監視の方法として4種類の手段を提供していますが、今回はユーザによるWebサイトの操作を模倣することのできるScripted Browserという手段を利用します。この方法では、ユーザの画面遷移を模倣したJavaScriptのコードを登録することで、実装された通りの画面遷移を実行して成否を確認することができます。JavaScriptのコードを記述することもできますし、Google Chromeの拡張機能として提供されているSelenium IDEを使ってコーディングレスでJavaScriptのコードを生成して登録することもできます。
なお、今回はCI/CDパイプラインの中でオンデマンドでテストを実行することをゴールとしていますので、作成したSynthetics Monitorは必要でない時は無効化(Disabled)にし、有効化したらすぐに実行されるように実行間隔を1分間としています。
以下がSynthetics Monitorの定義画面のスクリーンショットです。
以降はSynthetics Monitorを実行するためのスクリプトの説明です。以下の説明で参照するコードは以下のGitHubにも登録してありますので試したい方はダウンロードしてみてください。
Synthetics Monitorの情報を取得する
今回テストを実行するSynthetics MonitorのIDとステータス(Enable / Disable)の情報を取得します。IDとステータスは後のステップで利用します。利用するAPIは、https://synthetics.newrelic.com/synthetics/api/v3/monitorsで、定義済みSynthetics Monitorをリストで取得できます。以下のコードではリストの取得後に、パラメタで指定された名称に一致するもののIDとステータスを取得しています。APIの説明はこちらを参照してください。
MONITOR=$(curl -s -X GET -H "X-Api-Key:${ADMIN_USER_KEY}" \
-H "Content-Type: application/json" https://synthetics.newrelic.com/synthetics/api/v3/monitors/ | \
jq '[.monitors[] | select(.name == "'${MONITOR_NAME}'") | {id,status}] | .[0]')
ID=$(jq -r '.id' <<< $MONITOR)
STATUS=$(jq -r '.status' <<< $MONITOR)
Synthetics Monitorを有効にする
Synthetics Monitorは無効にしてあるので有効にし、テストが実行されるようにします。利用するAPIは、https://synthetics.newrelic.com/synthetics/api/v3/monitors/{id}です。ステータスの変更 (enabled) のみなのでPATCHを使います。APIの説明はこちらを参照してください。
curl -s -X PATCH -H "X-Api-Key:${ADMIN_USER_KEY}" \
-H "Content-Type: application/json" https://synthetics.newrelic.com/synthetics/api/v3/monitors/${ID} \
-d '{ "status" : "enabled" }'
Synthetics Monitorのテスト結果(スクリプトによるユーザ操作のシミュレート結果)を取得する
Synthetics Monitorのチェック結果はNew Relicのイベントとしてデータベースに格納されます。データベースに格納されたイベントのデータはNRQL (New Relic Query Language)というSQLに似たクエリ言語を使って結果を取得します。利用するAPIは、https://insights-api.newrelic.com/v1/accounts/{アカウントID}/query?nrql={エンコード済みクエリ}です。なお、実行後にデータベースへ格納されるまでにタイムラグがあるので、結果が格納されていない場合は一定時間後にリトライします。APIの説明はこちらか、もしくはNew Relicのダッシュボード作成画面を参照してください。
NRQL="SELECT result FROM SyntheticCheck SINCE ${SINCE} WHERE monitorName = '${MONITOR_NAME}' limit 1"
ENC_NRQL=$(echo "$NRQL" | nkf -WwMQ | sed 's/=$//g' | tr = % | tr -d '\n')
for i in `seq 1 ${RETRY}`
do
RESULT=$(curl -s -H "Accept: application/json" \
-H "X-Query-Key: ${QUERY_KEY}" \
"https://insights-api.newrelic.com/v1/accounts/${ACCOUNT_ID}/query?nrql=${ENC_NRQL}" | \
jq -r '.results[0].events[0].result')
if [ "$RESULT" != "null" ]; then
echo "Synthetic Check has finished with status ${RESULT}"
break
fi
echo "Synthetic Check seems not finished (${RESULT}). Will check again after ${INTERVAL} sec"
sleep ${INTERVAL}
done
Synthetics Monitorを無効にする
Synthetics Monitorのチェックが終わりましたので無効にします。運用中常時実行するわけではなく、CI/CDのタイミングでオンデマンドに実行するためです。利用するAPIは有効にする場合と同じです。APIの説明はこちらを参照してください。
curl -s \
-X PATCH -H "X-Api-Key:${ADMIN_USER_KEY}" \
-H "Content-Type: application/json" https://synthetics.newrelic.com/synthetics/api/v3/monitors/${ID} \
-d '{ "status" : "disabled" }'
以上がスクリプトの説明になります。
上記を一通り実装したスクリプトの実行結果は以下のようになります。環境依存の情報はパラメタで渡してください。なお、実行するには、curl、date (Macの場合はgdate)、nkfといったコマンドがインストールされていない場合はインストールしてください。
./invoke_synthethics.sh {Admin User API Key} {Query API Key} {New RelicアカウントID} {Synthetics Monitor名}
最後に
今回は、スクリプトから実行してSynthetics Monitorのテストを実行できるところまで確認しました。Circle CIやGitHub Actions、Jenkinsと行ったCI/CDツールに組み込んで、テストを自動化することによりメリットを教授してみてください。
番外
- New Relic Syntheticsは、あらかじめ用意されているロケーションからテストをトリガーするだけでなく、オンプレミスやクローズドなネットワークの環境においたエージェントからテストをトリガーすることも可能です(参照)。外部環境からアクセスできる環境へデプロイする前にテストしたい場合や、外部から直接アクセスされないサービスのテストをしたい場合はこちらを組み合わせてご利用いただけます。
- Scripted Browserのテストで利用するスクリプトはUIから登録するだけでなく、APIを使って登録することも可能です(参照)。UIの開発と合わせて、テスト用のスクリプトを開発しCI/CDパイプラインの中でAPIを使って登録することでマニュアル操作を排除することができます。
New Relicを試してみたい方はこちらへ。
The views expressed on this blog are those of the author and do not necessarily reflect the views of New Relic. Any solutions offered by the author are environment-specific and not part of the commercial solutions or support offered by New Relic. Please join us exclusively at the Explorers Hub (discuss.newrelic.com) for questions and support related to this blog post. This blog may contain links to content on third-party sites. By providing such links, New Relic does not adopt, guarantee, approve or endorse the information, views or products available on such sites.