カナリアリリースのためのNew Relic 活用方法

早いサイクルで機能をリリース、いち早く実際のユーザーからフィードバックを得るための手法として、カナリアリリースがあります。

少しのユーザーやトラフィックのみを新しいバージョンのアプリケーションに流し、その他の多くは現行バージョンのアプリケーションで処理を行うという方法です。

少しだけ振り分ける、というと字面だけでは簡単ですが、データの不整合が起こらないような開発やリリースをしなければいけませんし、「何を持ってカナリアが倒れたとするのか」を見極められなければ、カナリアリリースの効果を最大限に発揮できません。

ここでは、カナリアリリースの仕方などには触れません。アプリケーションサーバーのカナリアリリース中に、新バージョンがうまく動いていることをどうやって観測するのか、New Relic の活用方法をご紹介いたします。

カナリアリリース分析手順

1. New Relic APM を利用する

アプリケーションサーバーの性能を見るためには、New Relic のAPM をご利用ください。

New Relic ではユーザーがアクセスしたときの応答時間や、エラーなどの情報を New Relic APM のエージェントが収集しています。

APM の使い方についてはWebセミナーや動画で説明していますのでご確認ください。

2. 付加情報としてバージョン情報を追加する

New Relic APM では、Transaction やTransactionError という「イベント」データを使ってアプリケーションの応答速度やエラーがどれくらい発生していたのかを見ていくのですが、このイベントには「カスタムアトリビュート」という情報を追加できる機能があります。

カスタムアトリビュートを使うと、性能監視をよりビジネスに合わせることができます。例えばフリーミアム(基本無料)もある会員制のサイトであれば、有料会員と無料会員という軸で、使っている機能の傾向は違うのか、応答速度は違うのか、エラー発生率は違うのか、ということを観測できるようになります。

カナリアリリースの観測を行う場合は、このカスタムアトリビュートを使って、「バージョン情報」を付加しましょう。

例えばNode.js であれば、以下のようなコードをソースに埋め込むことで、情報を付加できます。

newrelic.addCustomAttributes({
"version": "0.0.1"
});

ソースコードを埋め込む場所ですが、リクエストを受け取った直後、できる限り処理の早い段階をお勧めします。
そうしておけば、万が一エラーが発生した場合にももれなくバージョン情報が付加されます。
Node.js 以外にも各言語でカスタムアトリビュートを追加できますので、詳細はこちらのドキュメントをご確認ください。

3. ダッシュボードで新旧バージョンを比較する

バージョンを追加した後は、ダッシュボードを作ってバージョン比較を行いましょう。

スループット(rpm:分間リクエスト数)やトラフィックの比率が設定通りになっているのか、バージョン毎に応答速度はどう変わっているのかであったり、応答速度は安定しているのか、など、バージョンを比較した性能分析ができます。

このように視覚的に見るダッシュボードを作成したり、エラー発生率が前よりも高くなってしまった後にアラートを受け取るなど、運用に合わせてカスタマイズできます。

4. サンプルNRQL 集

カスタムアトリビュートを追加した後に使える、カナリアリリース用のNRQL クエリをご用意いたしました。用途に合わせてご活用ください。
なお、’ec2-micro-front-end’ はサンプルのアプリケーション名ですので、appName = ‘${アプリケーション名}’ に置き換えてご利用ください。

    1. スループットバージョン比較
FROM Transaction SELECT rate(count(*), 1 minute) FACET version
WHERE appName = 'ec2-micro-front-end' TIMESERIES
    1. トラフィック比率
FROM Transaction SELECT
percentage(count(*), WHERE version ='0.0.1') as 'v0.0.1',
percentage(count(*), WHERE version ='0.0.2') as 'v0.0.2'
WHERE appName = 'ec2-micro-front-end' TIMESERIES
    1. 応答速度比較
FROM Transaction SELECT percentile(duration, 50) FACET version
WHERE appName = 'ec2-micro-front-end' TIMESERIES
    1. 応答速度安定度比較
FROM Transaction SELECT stddev(duration) FACET version
WHERE appName = 'ec2-micro-front-end'
    1. リクエスト割合
FROM Transaction SELECT stddev(duration) FACET version
WHERE appName = 'ec2-micro-front-end'
    1. トランザクションエラー率

For version 0.0.1

FROM Transaction SELECT count(*) FACET name
WHERE appName = 'ec2-micro-front-end' AND version = '0.0.1'

For version 0.0.2

FROM Transaction SELECT count(*) FACET name
WHERE appName = 'ec2-micro-front-end' AND version = '0.0.2'

まとめ

本記事では、カナリアリリースで有効活用できるバージョン情報をカスタムアトリビュートで付加し、NRQL での取得サンプルをご紹介いたしました。
カナリアリリース自体、アグレッシブに機能をリリースしていく手法ですので、アプリケーションや体制を変えないできないことかもしれません。
しかし、バージョン情報を付加してアプリケーションのパフォーマンスを確認していくことは、ABテストに使ったり、一般的なリリース方法に対しても有効に使えます。

デプロイ・リリース方法にあった観測方法について質問がございましたら、お気軽にご相談ください。

NewRelicソリューションコンサルタント。ERPパッケージベンダーにてSaaS製品を開発。SREも担当し運用自動化に励む。その後総合系コンサルティングファームに転職し、BtoCサービスの構築支援としてモバイルアプリを主としたサービスの開発リーダーを担当。 アーキテクチャの設計からCICD、バックエンド・フロントエンド開発という全領域の開発に加え、SREで経験した運用も踏まえたアプリケーションを中心としたパフォーマンス管理・チューニングを得意とする。 業務上経験が多いのはJava、Javascript。 View posts by .