New RelicでGitHub Actionsのテレメトリデータを可視化する

先日のGitHub University Recap Tokyo 2024でも紹介した機能です。GitHub ActionsのWorkflowの実行に関するテレメトリーデータをNew Relicに取り込み、可視化することができます。

### セットアップ

テレメトリーデータは、以下のリポジトリで公開されているGitHub Actionsを使ったWorkflowを定義し、計測対象のWorkflowが実行された後に起動することで送信されます。

https://github.com/newrelic-experimental/gha-new-relic-exporter

手順の詳細はこのリポジトリのREADME.mdに記載されています。まず、GitHubからデータを取得し、New Relicにデータを送信するので、GitHubとNew Relicに認証するキーがそれぞれ必要となります。New Relicについては、[Ingest License Key](https://docs.newrelic.com/jp/docs/apis/intro-apis/new-relic-api-keys/#license-key)を`NEW_RELIC_LICENSE_KEY`という名前でGitHub ActionsのSecretsに設定します。GitHubについては、[自動トークン認証](https://docs.github.com/ja/actions/security-for-github-actions/security-guides/automatic-token-authentication)を利用する場合は`GITHUB_TOKEN`を参照します(Secretsの追加は不要です)。このとき、自動トークン認証がactionsへの読み取り権限を持っていることを確認してください。もしくは[個人用アクセストークン](https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens)を利用することもできます。

workflowは新規に作成し、サンプルの定義を記載します。ほぼそのまま利用できるはずです。サンプルの定義であれば、他のworkflowが実行されるとトリガーされそのテレメトリーデータを送信します。何かしら別のworkflowを実行し、このworkflowが正常に実行されるのを確認したら、実際のデータを見てみます。

### 実際のデータを確認する

計測されたデータは、OpenTelemetryで計測されたServiceのエンティティとして表示されます。New Relic UIでAll EntitiesのServices - APMもしくはAPM & Servicesの画面で、リポジトリ名を名前にもったエンティティとして表示されているはずです。下の画像だと、newrelickk/NewRelicKKLab.GHU-DemoApp に該当します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405931/bfc18961-8531-0a03-d8b4-77c34e8d2d1d.png)

APMというエンティティにはなっていますが、実際には分散トレースのデータのみ記録されているので、Distributed tracingの画面を確認します。1つのWorkflowを1つのTraceとして記録するので、Trace groupsには計測したworkflowごとに表示されているはずです。下の画像では、1つのWofklowのみを計測しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405931/f3df7db6-2f48-1763-6be7-2a441ddec89f.png)

なお実行しているWorkflowは次の定義となっています。

```yaml
name: Build and deploy ASP.Net Core app to Azure Web App - ghu-demo-webapp

on:
  push:
    branches:
      - master
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Set up .NET Core
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: '8.x'

      - name: Build with dotnet
        run: dotnet build --configuration Release

      - name: dotnet publish
        run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/myapp

      - name: Upload artifact for deployment job
        uses: actions/upload-artifact@v4
        with:
          name: .net-app
          path: ${{env.DOTNET_ROOT}}/myapp

  deploy:
    runs-on: ubuntu-latest
    needs: build
    environment:
      name: 'Production'
      url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}
    permissions:
      id-token: write #This is required for requesting the JWT

    steps:
      - name: Download artifact from build job
        uses: actions/download-artifact@v4
        with:
          name: .net-app
      
      - name: Login to Azure
        uses: azure/login@v2
        with:
          client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID_ID }}
          tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID_ID }}
          subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID_ID }}

      - name: Deploy to Azure Web App
        id: deploy-to-webapp
        uses: azure/webapps-deploy@v3
        with:
          app-name: 'ghu-demo-webapp'
          slot-name: 'Production'
          package: .

      - name: Update Env Vars
        id: update-envvar
        uses: Azure/cli@v2.1.0
        with:
          inlineScript: "az webapp config appsettings set -g ghu-demo -n ghu-demo-webapp --settings NEW_RELIC_METADATA_COMMIT=${{ github.sha }}"

  newrelic:
    runs-on: ubuntu-latest
    name: New Relic
    steps:
      # This step builds a var with the release tag value to use later
      - name: Set Release Version from Tag
        run: echo "RELEASE_VERSION=${{ github.ref_name }}" >> $GITHUB_ENV
      # This step creates a new Change Tracking Marker
      - name: New Relic Application Deployment Marker
        uses: newrelic/deployment-marker-action@v2.3.0
        with:
          apiKey: ${{ secrets.NEW_RELIC_API_KEY }}
          guid: ${{ secrets.NEW_RELIC_DEPLOYMENT_ENTITY_GUID }}
          version: "${{ env.RELEASE_VERSION }}"
          changelog: "https://github.com/${{ github.repository }}/blob/master/CHANGELOG.md"
          commit: "${{ github.sha }}"
          description: "Automated Release via Github Actions"
          deploymenttype: "BASIC"
          groupId: "Workshop App Release: ${{ github.ref_name }}"
          user: "${{ github.actor }}"
      # When chaining steps together, the deployment id is placeed into the github environment 
      - name: View output
        run: echo "${{ env.deploymentId }}"
```

Trace groupsを開くと、workflowの1回の実行結果が1つのtraceとして記録された様子がわかります。下の画像では2回実行されています。Trace durationが1回のworkflowの実行時間です。記録された2回で32秒と1分52秒と大きく差がありますが、これはDeploy Gateによるチェック条件が満たされずデプロイのアクションが実行されなかったためです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405931/f084d38f-0d19-0311-65cf-43de5e217a93.png)

さらにいずれかのTraceを開くと、そのworkflowの中で実行されたアクションおよびその中のstepsがSpanとして記録された分散トレースを確認できます。下の画像では一番時間がかかっているのはdeployというアクションで、その中でどんな処理が行われ、どのくらい時間がかかっているかがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405931/72a74556-56ab-2f35-3565-c3b701f97bb0.png)

このworkflowは3つのアクションがあり、その中のdeployアクションはbuildアクションの完了が必要です。そのためnewrelicアクションはdeployアクションの完了を待たずに実行することができ、実際並行に処理されていることがこのトレースからもわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405931/e1a9517e-0792-54ea-a79f-8556926dd3f1.png)

:::note info
このnewrelicアクションではNew Relic Change Trackingのために、[New Relic Application Deployment Marker](https://github.com/marketplace/actions/new-relic-application-deployment-marker)を使って変更情報をNew Relicに記録しています。実際の運用では実際にデプロイが成功したときだけ変更情報を記録したい時が多いと思いますので、deployアクションが成功したときだけ実行する方が嬉しいかもしれません。
:::

また、Logsタブではこのworkflowが実行中に出力されたログを確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405931/465dc9da-2466-de7a-feed-5b2ccf0188db.png)

こちらの機能を使うとGitHub Actionsのパフォーマンスを可視化できるのでぜひお試しください。

# その他
New Relicでは、**新しい機能やその活用方法**について、QiitaやXで発信しています！
**無料でアカウント作成**も可能なのでぜひお試しください！

:::note info
New Relic株式会社の[X(旧Twitter)](https://x.com/NewRelicJapan) や [Qiita OrganizationOrganization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::

:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::