Github Actions のトレースを OpenTelemetry 形式で出力して転送する

みなさん OpenTelemetry は使っていますか? もしくはアプリケーションの計測などを何が知らのツールで実現されているでしょうか?

CI/CD のパフォーマンスも継続的に計測したいと思ったことはないでしょうか? 今回はそんなことが簡単にできそうなツールを見つけたので今回はその紹介をしようと思います。

otel-export-trace-action

今回利用するのは otel-export-trace-action を利用しました。

github.com

Github Actions のトレースデータを OTLP を経由してトレースデータを送信してくれる action になっています。 似たようなものとして github_actions_otel_trace というツールがあり同様に OpenTelemetry を利用しているので出力される情報としては似ているように見えました。機会があればこちらも触ってみたいと思います。

実装方法

実装方法については READMEで紹介されていてそのまま実装することよって計測可能です。 以下はサンプルですが jobs の最後で action を呼び出すことで処理を実行しています。

name: OpenTelemetry Export Trace

on:
  push:
    branch: [main]

jobs:
  build:
    # Run build steps
  otel-export-trace:
    if: always()
    name: OpenTelemetry Export Trace
    runs-on: ubuntu-latest
    needs: [build] # must run when all jobs are complete
    steps:
      - name: Export Workflow Trace
        uses: inception-health/otel-export-trace-action@latest
        with:
          otlpEndpoint: grpc://api.honeycomb.io:443/
          otlpHeaders: ${{ secrets.OTLP_HEADERS }}
          githubToken: ${{ secrets.GITHUB_TOKEN }}

README の example では honeycomb へ転送してますが今回は New Relic へ転送を試みてどのように出力されるか試してみたいと思います。

New Relic への Opentelemetry 転送

New Relic への OpenTelemetry への転送方法については公式ドキュメントに記載があります。 New Relic 側で OTLP endpoint が提供されているのでそこに対してデータを転送するようにする必要があります。

US リージョンを利用するので https://otlp.nr-data.net を選択します。

docs.newrelic.com

yaml を修正します

  otel-export-trace:
    if: always()
    name: OpenTelemetry Export Trace
    runs-on: ubuntu-latest
    needs: [build] # must run when all jobs are complete
    steps:
      - name: Export Workflow Trace
        uses: inception-health/otel-export-trace-action@latest
        with:
          otlpEndpoint: ${{ secrets.OTLP_ENDPOINT }} // New Relic のエンドポイント 例) https://otlp.nr-data.net:4317
          otlpHeaders: ${{ secrets.OTLP_HEADERS }} // api-key=<New Relic のライセンスキー>
   // 取得方法  https://docs.newrelic.com/jp/docs/apis/intro-apis/new-relic-api-keys/
          githubToken: ${{ secrets.GITHUB_TOKEN }}
          runId: ${{ github.event.workflow_run.id }}

最低限これがそろっていれば利用可能です必要にあわせて attribute の付与などを行ってください。

GitHub - inception-health/otel-export-trace-action

secret への登録は GIthubリポジトリ側の設定で可能になっています。

docs.github.com

New Relic のライセンスキーの取得方法は以下ドキュメントをご参照ください。

docs.newrelic.com

これで実際に job を動かしてみて New Relic へ転送されれば成功です。 私の画面に出力された情報をお見せします。

実際に Trace 情報が出力されたので job で遅い箇所などの可視化が簡単になりそうです。 このような形でアプリケーションのだけでなく当たり前のように CI/CD も使われ始めているのでその一環として Github Actions の可視化をしてみました。

今回はトレースだけになりますので他の Metrics なども送信できそうでしたら紹介したいと思います。