記事検索

検索ワードを入力してください。
Sky Tech Blog
Docker Buildxと​OpenTelemetryで​Dockerビルドの​トレースを​取得する

Docker Buildxと​OpenTelemetryで​Dockerビルドの​トレースを​取得する

ここでは、Docker BuildxとBuildKitを使用してコンテナビルドを拡張し、OpenTelemetryをサポートすることでビルド処理のトレースを可視化し、改善やエラー調査を容易にする方法について説明しています。

Docker Buildxと​BuildKitに​ついて

Docker BuildxはBuildKitというコンテナのビルドツールを使用してdocker buildコマンドを拡張するものであり、BuildKitで提供される機能を使ってビルドすることが可能になります。

キャッシュやマルチアーキテクチャビルドなど様々な機能がありますが、今回ご紹介するのは OpenTelemetryのサポートについてです。

OpenTelemetryサポート

OpenTelemetryはログ・トレース・メトリクスといったテレメトリーデータを扱うための標準仕様、あるいはそれを扱うためのツール群であり、BuildKitにはOpenTelemetry形式でトレースデータを生成する機能が備わっています。

この機能により、コンテナイメージのビルド処理のトレースが取得できるようになります。
トレースを取得できると、コンテナイメージビルドのどこでどれだけ時間がかかっているかが可視化でき、ビルド処理の改善やエラーの原因調査がしやすくなるというメリットがあります。

試してみる

今回の登場人物は「docker buildx」「opentelemetry collector」「grafana tempo」「grafana」の4つです。
詳細に書くと長くなるため、それぞれの構築手順は割愛します。

データの流れを図にするとこのようになります。
buildxで生成されるトレースデータをopentelemetry collectorを通じてgrafana tempoまで送信し、結果をGrafanaで閲覧することができるという構成です。

buildxの​設定

buildxについては実行時にデータの転送先などを環境変数で設定するだけです。

OTEL_SERVICE_NAME=buildx
# デフォルトだとgRPCで送信
OTEL_EXPORTER_OTLP_ENDPOINT=http://to-opentelemetry-collector:4317

opentelemetry collectorの​設定

collectorの起動時に使用する設定ファイルにて、以下のように設定します。

receivers:
  otlp:

exporters:
  otlp:
    endpoint: http://to-grafana-tempo-address:4317
    tls:
      insecure: true

processors:
  batch: {}
  attributes/remove_span_attr_command:
    actions:
      - action: extract
        key: command
        pattern: "build -t[^/]+/(?<repository>[^:]+):"
      - action: delete
        key: command

pipelines:
  traces:
    receivers:
      - otlp
    processors:
      - batch
      - attributes/remove_span_attr_command
    exporters:
      - otlp

otlp形式で飛んでくるトレースデータを受け取り、grafana tempoに送信するというシンプルなパイプラインですね。

そのままだと「docker buildx build....」という実行コマンドが「command」というスパン属性に付与されてビルドコマンドで渡す情報が丸見えになるため、
attributes/remove_span_attr_command
というプロセッサーで取り除きつつ、Grafanaから検索しやすくするためにイメージ名の一部を属性として付与する加工を行っています。

サンプル

収集したトレースをGrafanaで閲覧したものがこちらの画像です(グラフの部分だけ抜き出しています)。

ビルド処理の全体に対し、比較的大きな割合を占めるものが2つあることがわかります。

1つ目はパッケージのインストール処理で、キャッシュで効率化を図ったり不要なパッケージを削除したりするなどの対策が考えられます。
2つ目はイメージのレジストリへの送信処理で、イメージのサイズを削減することで改善が見られるかもしれません。

このように、どこでどれだけ時間がかかっているかを可視化することで、次の改善の一手を考える助けになります。

最後に

オブザーバビリティというとシステムやアプリケーションに焦点が当たるイメージが強いですが、速い開発と速いリリースサイクルを実現するには、CI/CDパイプラインのようなソフトウェアを提供する基盤側にも求められる要素です。

ビルドをトレースできることによりオブザーバビリティの向上に繋がりますが、CI/CDパイプライン全体で見るとコンテナイメージのビルドは一部分に過ぎないため、今後も継続して取り組んでいきたいと思います。


\シェアをお願いします!/
  • X
  • Facebook
  • LINE
キャリア採用募集中!

入社後にスキルアップを目指す若手の方も、ご自身の経験を幅広いフィールドで生かしたいベテランの方も、お一人おひとりの経験に応じたキャリア採用を行っています。

Sky株式会社のソフトウェア開発や製品、採用に関するお問い合わせについては、下記のリンクをご確認ください。
お問い合わせ
ホーム