BASEプロダクトチームブログ

ネットショップ作成サービス「BASE ( https://thebase.in )」、ショッピングアプリ「BASE ( https://thebase.in/sp )」のプロダクトチームによるブログです。

New Relic One のCircleCI Integrationでデプロイ頻度やジョブの状態を計測する

こんにちは。BASE株式会社 BASE BANKチームの前川、清水(@budougumi0617)です。
3月上旬にNew RelicからCircleCI integrationが公開されました。
BASE BANKチームで使用してみたので、設定方法などをまとめてお送りいたします。

TL;DR

  • 3月上旬にNew RelicのCircleCI Integrationが公開され、New Relic上でjobやワークフローの実行時間、ジョブヘルス、実行数などが取得できるようになった
  • New Relic OneとCircleCIを連携し、ダッシュボードを作成する方法をご紹介する
  • jobの状況だけでなく、workflowの状況もダッシュボードに表示する方法をご紹介する

背景

2022年3月にNew Relic Instant Observability(New Relic I/O)の新たな連携先パートナーとしてCircleCI, Netlify, Jiraなどが発表されました。
docs.newrelic.com

BASE BANKチームでは、自分たちの開発組織としてのパフォーマンスがどれくらいなのかを判断するために、ソフトウェア開発チームのパフォーマンスを示す 4 つの指標のうち手始めにデプロイ頻度を計測しています。 devblog.thebase.in

これまではDeployment Markerを用いてNew Relic One上でデプロイ頻度を計測していましたが、この度CircleCI Integrationが登場したので、これを使ってデプロイ頻度などの情報をダッシュボードに表示してみました。

CircleCI Integration

このIntegrationではCircleCI Webhookから取得できる情報をNew Relic Oneに連携することができます。 newrelic.com circleci.com

CI上で実行するジョブやワークフロー、パイプラインのIDや名前、ステータス、実行開始時間、終了時間だけでなく、CircleCIと連携しているVCS(gitなど)のコミット時間や内容、authorなども取得することができます。
そのため、例えば

  • 単位時間あたりのトータル実行ジョブ数、ワークフロー数
  • ジョブヘルス
  • 直近失敗したジョブ
  • プロジェクトあたりのジョブ実行数
  • コミットからリリースまでの所要時間

など、取得できるパラメータの使い方によって様々なデータを計測、表示することができます。

設定

ダッシュボードを作成する

サンプルのダッシュボードはNew Relic I/OのCircleCIページの「Install quickstart」から簡単に作成できます。

New Relic上の Install quickstart ボタン

Quick Installを完了すると、2022/04/06時点では次のようなダッシュボードが作成されます。

New Relic上に作成されたCircleCIのダッシュボード

このクイックインストールではダッシュボードは作成されますがデータ連携の設定は行われません。
作成されたダッシュボードにCircleCIからCI/CDのデータを送信するにはCircleCI上での設定が必要になります。

CircleCIからNew Relicへデータを送信する

Quick Installの手順には記載されていません1が、CircleCI上からNew Relicに送信するにはAPIキーを利用して後述のNew RelicのエンドポイントのURLをCircleCIのWebhookに登録する必要になります。

New RelicのAPI Keyを取得する

今回の連携で利用するNew RelicのAPIはLog APIですので、API Keyはライセンスキーになります。 docs.newrelic.com

ライセンスキーは次のドキュメントに記載されている手順で確認できます。ライセンスキーによって連携するアカウントが区別されるので、アカウントを間違えないようにしてください。 docs.newrelic.com

ライセンスキーが表示されない場合は権限不足なので組織のNew Relic管理者に問い合わせてください。

CircleCI上でWebhookを登録する

CircleCIからNew Relicにワークフローの実行結果を表示するには、New Relic上でデータを表示したいプロジェクトごとにNew RelicのWebhookを登録する必要があります。 circleci.com

まず、New Relicでパイプライン情報を確認したいプロジェクトの「Project Settings」を開きます。 GitHubリポジトリと連携したCircleCIプロジェクトの場合、「Project Settings」は以下のURLです.

https://app.circleci.com/settings/project/github/${ORG_NAME}/${REPO_NAME}

「Project Settings」の中にある「Webhooks」をクリックすると「Add Webhook」ボタンがあるのでそれをクリックします。

CircleCIのWebhook設定画面

新しいWebhookを追加する画面になるので確認したAPI Keyを使って次のように設定します。

設定名 内容
Webhook name 任意の判別しやすい名前
Receiver URL https://log-api.newrelic.com/log/v1?Api-Key=${NEW_RELIC_API_KEY}
Secret token 空欄のまま
Certificate verification チェックを入れる
Workflow Completed チェックを入れる
Job Completed チェックを入れる

これでCircleCIが実行されるたびにダッシュボードに情報が流れるようになりました。
複数のプロジェクトのパイプラインの実行結果をNew Relicで利用したい場合はこの操作をプロジェクトごとに繰り返します。

より価値のある情報を表示する

NewRelic上でCircleCIのワークフローの実行情報を取得できるようになりました。
しかし、クイックインストールで作成したダッシュボードのサンプルグラフは我々の運用方法ではあまり意味のないものでした。
なぜかというと、複数プロジェクトのワークフローの実行結果を一つのグラフにすると、ジョブの数ではデプロイの実体がわからなくなるためです。我々のプロジェクトはプロジェクトごとにデプロイパイプラインが異なり、デプロイするまでに実行されるジョブの数が異なります。あるプロジェクトAは1回のデプロイでジョブを10個実行し、あるプロジェクトBが1回のデプロイでジョブを5個しか実行しない場合、ジョブの実行総数を可視化しても意味のある情報にはなりません。
ジョブの実行総数が100だった場合、すべてプロジェクトA起因ならば10回デプロイしたことが想定されますが、すべてプロジェクトB起因だった場合は20回デプロイしていたことになります。

そこで、ワークフロー単位のグラフを改めてつくることにしました。

CircleCI からどんな情報が取得できるのか?

CircleCi からは現在以下の 2 種類のイベントを取得できます。

  • workflow-completed
  • job-completed

Webhook - CircleCI

New Relic 上では type というパラメータで表されており、以下のクエリで 2 種類のイベントが取得できていることを確認できます。

FROM Log SELECT uniques(type) since 30 days ago

NRQLリファレンス | New Relic Documentation

それぞれのイベントで取得できる情報を、 New Relic 上ではそれぞれ以下のクエリで確認することができます。

FROM Log SELECT keyset() WHERE type = 'workflow-completed' since 30 days ago
FROM Log SELECT keyset() WHERE type = 'job-completed' since 30 days ago

NRQLリファレンス | New Relic Documentation

情報の一部を確認すると、workflow-completed イベントではワークフローに関係する情報を取得でき、job-completed  イベントではジョブに関係する情報と関連するワークフローの情報の一部が取得できていることがわかります。
また、ワークフローのステータスに関しては workflow-completed でのみ取得できるということが確認できます。

ワークフロー単位での情報の表示について

ワークフローに関する情報は workflow-completed と job-completed 両方のイベントに含まれています。
また、New Relic 上の実際のデータを確認すると、workflow-completed イベントに関しては殆どが workflow.id でユニークでしたが一部重複がありました。
よって今回ワークフロー単位での情報の表示については、以下の方針に基づいて可視化を行いました。

  • uniqueCount 関数を利用してワークフローに関する属性のユニーク値の数を集計する
  • workflow-completed イベントの情報を集計する

NRQLリファレンス | New Relic Documentation

まずはワークフローの数を表示してみましょう。

FROM Log SELECT uniqueCount(workflow.id) WHERE type = 'workflow-completed' since 30 days ago

ワークフロー数

同様に、日毎のワークフロー数の推移をプロジェクト別に可視化するクエリは以下のようになります。

FROM Log SELECT uniqueCount(workflow.id) WHERE type = 'workflow-completed' FACET project.name TIMESERIES 1 days since 30 days ago

日毎のワークフロー数

次に、ワークフローのステータスについて可視化してみましょう。
workflow-completed イベントについて、 workflow.status の値でグループ化しカウントして表示するクエリは以下のようになります。

FROM Log SELECT uniqueCount(workflow.id) WHERE type = 'workflow-completed' FACET workflow.status since 30 days ago

ワークフローステータスの集計

最後に、今週のデプロイ総数を先週と比較してみましょう。
今回は成功ステータスである特定のワークフロー名のワークフローの数をカウントすることでデプロイの数を集計してみます。

FROM Log SELECT uniqueCount(workflow.id) WHERE workflow.name = 'test-build-deploy' AND workflow.status = 'success' SINCE this week COMPARE WITH 1 week ago

今週のデプロイ数と先週との比較

同様に、日毎のデプロイ数の推移をプロジェクト別に可視化するクエリは以下のようになります。

FROM Log SELECT uniqueCount(workflow.id) WHERE workflow.name = 'test-build-deploy' AND workflow.status = 'success' TIMESERIES 1 day FACET project.name SINCE 30 days ago

プロジェクトごとのデプロイ数の推移

おわりに

今回、新しく登場したNew Relic OneのCircleCI Integrationの導入方法についてご紹介しました。
設定さえすれば最低限の情報はすぐに出力できるようになるため、読者の皆様が所属する開発組織のパフォーマンス計測の一助となれば幸いです。

New Relicを活用したサービス品質の向上や、開発組織のパフォーマンス改善に興味のある方はぜひカジュアルにお話しましょう!

open.talentio.com


  1. どこかに書いてあるのかもしれませんが、我々の調査ではドキュメントが見つからずテクニカルサポートに問い合わせました。