プロファイラーは、Datadog トレースライブラリ内で送信されます。アプリケーションですでに APM を使用してトレースを収集している場合は、ライブラリのインストールをスキップして、プロファイラーの有効化に直接進むことができます。

要件

Datadog Profiler には Go 1.12 以降が必要です。

Code HotspotsEndpoint Profiling については、Go バージョン 1.18+ と dd-trace-go バージョン 1.37.0+ を使用してください。

Continuous Profiler は、AWS Lambda などのサーバーレスプラットフォームには対応していません。

インストール

アプリケーションのプロファイリングを開始するには

  1. すでに Datadog を使用している場合は、Agent をバージョン 7.20.2 以降または 6.20.2 以降にアップグレードしてください。

  2. 以下のコマンドを使用して、dd-trace-go を取得します。

    go get gopkg.in/DataDog/dd-trace-go.v1/profiler
    

    : プロファイラは、バージョン 1.23.0 以降の dd-trace-go ライブラリで利用できます。

  3. アプリケーションの開始時に、プロファイラをインポートします。

    import "gopkg.in/DataDog/dd-trace-go.v1/profiler"
    
  4. 次のスニペットを追加し、プロファイラを起動します。

    err := profiler.Start(
        profiler.WithService("<SERVICE_NAME>"),
        profiler.WithEnv("<ENVIRONMENT>"),
        profiler.WithVersion("<APPLICATION_VERSION>"),
        profiler.WithTags("<KEY1>:<VALUE1>", "<KEY2>:<VALUE2>"),
        profiler.WithProfileTypes(
          profiler.CPUProfile,
          profiler.HeapProfile,
          // The profiles below are disabled by default to keep overhead
          // low, but can be enabled as needed.
    
          // profiler.BlockProfile,
          // profiler.MutexProfile,
          // profiler.GoroutineProfile,
        ),
    )
    if err != nil {
        log.Fatal(err)
    }
    defer profiler.Stop()
    
  5. 1〜2 分後、Datadog APM > Profiler ページでプロファイルを視覚化します。

: デフォルトでは、CPU とヒーププロファイルのみが有効になっています。その他のプロファイルタイプを有効にするには、profiler.WithProfileTypes を使用します。

コンフィギュレーション

以下の関数で、コードにプロファイラーパラメーターを設定できます。

関数タイプ説明
WithService文字列Datadog サービス名 (例: my-web-app)。
WithEnv文字列Datadog 環境名 (例: production)。
WithVersion文字列アプリケーションのバージョン
WithTags文字列のリストアップロードされたプロファイルに適用されるタグのリスト。タグは <KEY>:<VALUE> という形式で指定する必要があります。

または、環境変数を使用してプロファイラーコンフィギュレーションを設定することも可能です。

環境変数タイプ説明
DD_ENV文字列環境名 (例: production)。
DD_SERVICE文字列サービス名 (例: web-backend)。
DD_VERSION文字列サービスのバージョン
DD_TAGS文字列アップロードされたプロファイルに適用するタグ。<key>:<value> のように、コンマ区切り形式のリストである必要があります(例、layer:api,team:intake)。

CPU プロファイルで C 関数呼び出しを表示する

デフォルトでは、Go の CPU プロファイラーには、Go コードの詳細情報のみが表示されます。プログラムが C コードを呼び出した場合、C コードの実行時間はプロファイルに反映されますが、コールスタックには Go 関数の呼び出しだけが表示されます。

CPU プロファイルに C 関数の詳細な呼び出し情報を追加するには、ianlancetaylor/cgosymbolizer のようなライブラリを使用するとよいでしょう。このライブラリを使うには

  1. パッケージをダウンロードします。

    go get github.com/ianlancetaylor/cgosymbolizer@latest
    
  2. プログラムの任意の場所に、以下のインポートを追加します。

    import _ "github.com/ianlancetaylor/cgosymbolizer"
    

: このライブラリは実験的なものと見なされています。C++ の例外を使用するプログラムや、tcmalloc のようなコールスタックを収集するライブラリを使用するプログラムでは、デッドロックの原因となる可能性があります (頻度は低いですが)。

次のステップ

プロファイラーの概要ガイドでは、パフォーマンスの問題があるサンプルサービスを例に、Continuous Profiler を使用して問題を理解し修正する方法を確認します。

その他の参考資料