github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/runtime/trace/trace.go (about)

     1  // Copyright 2015 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // traceパッケージには、Go実行トレーサーのためのトレースを生成するプログラムの機能が含まれています。
     6  //
     7  // # Tracing runtime activities
     8  //
     9  // 実行トレースは、ゴルーチンの作成/ブロック/アンブロック、システムコールの入力/出力/ブロック、
    10  // GC関連のイベント、ヒープサイズの変更、プロセッサの開始/停止など、幅広い実行イベントをキャプチャします。
    11  // CPUプロファイリングがアクティブな場合、実行トレーサーはこれらのサンプルも含めるように努力します。
    12  // ほとんどのイベントに対して、正確なナノ秒精度のタイムスタンプとスタックトレースがキャプチャされます。
    13  // 生成されたトレースは `go tool trace` を使用して解釈することができます。
    14  //
    15  // 標準のテストパッケージで構築されたテストとベンチマークのトレースのサポートは、
    16  // `go test`に組み込まれています。例えば、以下のコマンドは現在のディレクトリでテストを実行し、
    17  // トレースファイル(trace.out)を書き出します。
    18  //
    19  //	go test -trace=trace.out
    20  //
    21  // このruntime/traceパッケージは、同等のトレーシングサポートをスタンドアロンのプログラムに追加するためのAPIを提供します。
    22  // このAPIを使用してトレーシングを有効にする方法を示す例を参照してください。
    23  //
    24  // また、トレースデータには標準的なHTTPインターフェースもあります。以下の行を追加すると、
    25  // /debug/pprof/trace URLの下にハンドラがインストールされ、ライブトレースをダウンロードできます:
    26  //
    27  //	import _ "net/http/pprof"
    28  //
    29  // このインポートによってインストールされたすべてのデバッグエンドポイントについての詳細は、
    30  // [net/http/pprof] パッケージを参照してください。
    31  //
    32  // # User annotation
    33  //
    34  // traceパッケージは、実行中の興味深いイベントをログに記録するために使用できる
    35  // ユーザー注釈APIを提供します。
    36  //
    37  // ユーザー注釈には3つのタイプがあります:ログメッセージ、領域、タスク。
    38  //
    39  // [Log] は、メッセージのカテゴリや [Log] を呼び出したゴルーチンなどの追加情報とともに、
    40  // 実行トレースにタイムスタンプ付きのメッセージを発行します。実行トレーサーは、
    41  // ログカテゴリと [Log] で提供されるメッセージを使用してゴルーチンをフィルタリング
    42  // およびグループ化するUIを提供します。
    43  //
    44  // リージョンは、ゴルーチンの実行中の時間間隔をログに記録するためのものです。
    45  // 定義上、リージョンは同じゴルーチンで開始し終了します。
    46  // リージョンは、サブインターバルを表すためにネストすることができます。
    47  // 例えば、次のコードは、カプチーノ作成操作の連続したステップの期間をトレースするために、
    48  // 実行トレースに4つのリージョンを記録します。
    49  //
    50  //	trace.WithRegion(ctx, "makeCappuccino", func() {
    51  //
    52  //	   // orderIDは、多くのカプチーノ注文領域レコードの中から特定の注文を識別するために使用します。
    53  //	   trace.Log(ctx, "orderID", orderID)
    54  //
    55  //	   trace.WithRegion(ctx, "steamMilk", steamMilk)
    56  //	   trace.WithRegion(ctx, "extractCoffee", extractCoffee)
    57  //	   trace.WithRegion(ctx, "mixMilkCoffee", mixMilkCoffee)
    58  //	})
    59  //
    60  // タスクは、RPCリクエスト、HTTPリクエスト、または複数のゴルーチンが協力して行う必要がある
    61  // 興味深いローカル操作など、論理的な操作のトレースを支援する高レベルのコンポーネントです。
    62  // タスクは複数のゴルーチンを含む可能性があるため、[context.Context] オブジェクトを介して追跡されます。
    63  // [NewTask] は新しいタスクを作成し、それを返された [context.Context] オブジェクトに埋め込みます。
    64  // ログメッセージとリージョンは、[Log] と [WithRegion] に渡されたContextにあるタスク(存在する場合)に添付されます。
    65  //
    66  // 例えば、ミルクを泡立て、コーヒーを抽出し、ミルクとコーヒーを別々のゴルーチンで混ぜることにしました。
    67  // タスクを使用すると、トレースツールは特定のカプチーノ注文に関与するゴルーチンを識別できます。
    68  //
    69  //	ctx, task := trace.NewTask(ctx, "makeCappuccino")
    70  //	trace.Log(ctx, "orderID", orderID)
    71  //
    72  //	milk := make(chan bool)
    73  //	espresso := make(chan bool)
    74  //
    75  //	go func() {
    76  //	        trace.WithRegion(ctx, "steamMilk", steamMilk)
    77  //	        milk <- true
    78  //	}()
    79  //	go func() {
    80  //	        trace.WithRegion(ctx, "extractCoffee", extractCoffee)
    81  //	        espresso <- true
    82  //	}()
    83  //	go func() {
    84  //	        defer task.End() // アセンブルが完了したら、注文は完了します。
    85  //	        <-espresso
    86  //	        <-milk
    87  //	        trace.WithRegion(ctx, "mixMilkCoffee", mixMilkCoffee)
    88  //	}()
    89  //
    90  // トレースツールは、タスクの作成とタスクの終了の間の時間を測定することでタスクの遅延を計算し、
    91  // トレース内で見つかった各タスクタイプの遅延分布を提供します。
    92  package trace
    93  
    94  import (
    95  	"github.com/shogo82148/std/io"
    96  )
    97  
    98  // Start は現在のプログラムのトレースを有効にします。
    99  // トレース中は、トレースはバッファリングされ、w に書き込まれます。
   100  // トレースが既に有効になっている場合、Start はエラーを返します。
   101  func Start(w io.Writer) error
   102  
   103  // Stopは現在のトレースを停止します(存在する場合)。
   104  // トレースのすべての書き込みが完了するまで、Stopは戻りません。
   105  func Stop()