6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-12-06

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

セットアップ

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

手順の詳細はこのリポジトリのREADME.mdに記載されています。まず、GitHubからデータを取得し、New Relicにデータを送信するので、GitHubとNew Relicに認証するキーがそれぞれ必要となります。New Relicについては、Ingest License KeyNEW_RELIC_LICENSE_KEYという名前でGitHub ActionsのSecretsに設定します。GitHubについては、自動トークン認証を利用する場合はGITHUB_TOKENを参照します(Secretsの追加は不要です)。このとき、自動トークン認証がactionsへの読み取り権限を持っていることを確認してください。もしくは個人用アクセストークンを利用することもできます。

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

実際のデータを確認する

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

image.png

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

image.png

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

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

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

image.png

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

image.png

このnewrelicアクションではNew Relic Change Trackingのために、New Relic Application Deployment Markerを使って変更情報をNew Relicに記録しています。実際の運用では実際にデプロイが成功したときだけ変更情報を記録したい時が多いと思いますので、deployアクションが成功したときだけ実行する方が嬉しいかもしれません。

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

image.png

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

その他

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

New Relic株式会社のX(旧Twitter)Qiita OrganizationOrganizationでは、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。

無料のアカウントで試してみよう!
New Relic フリープランで始めるオブザーバビリティ!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?