カスタムメソッドをインスツルメントして、ビジネスロジックを詳細に可視化する

8 分で読了

分析ビュー
: このページでは、カスタムインスツルメンテーションアプリケーションへの OpenTracing の使用について説明します。OpenTracing は非推奨になりました。ここで説明するコンセプトはまだ有効ですが、代わりに OpenTelemetry を使ったカスタムインスツルメンテーションの説明と例に従ってください。

ビジネスロジックを詳細に可視化するために、Datadog APM では、ニーズと実装に基づいてトレースを構成するスパンをカスタマイズできます。これにより、コードベース内のあらゆるメソッド、さらにはメソッド内の特定のコンポーネントをトレースすることができます。これを使用すれば、アプリケーションの重要な領域を最適な粒度で最適化、監視できます。

Datadog は、ウェブサービス、データベース、キャッシュなど、すぐに使用できる多くのフレームワークをインスツルメントするため、独自のビジネスロジックをインスツルメントして、求められる正確な可視性を獲得できます。メソッドのスパンを作成することにより、APM フレームグラフとモニターを使用してタイミングを最適化し、エラーを追跡できます。

コードのインスツルメンテーション

例に従いコードをインスツルメントします

以下の例では、BackupLedger.write メソッド全体をトレースして、実行時間とステータスを測定します。BackupLedger.write は、トランザクション台帳の現在の状態をメモリに保存してから、支払いデータベースを呼び出して新しい顧客請求を送信するアクションです。これは、支払いサービスの charge エンドポイントがヒットしたときに発生します。

分析ビュー

http.request POST /charge/ スパンは、直接の子スパンがないと多くの時間がかかります。これは、このリクエストがその動作に対するより優れた情報を得るために、さらなるインスツルメンテーションを必要とする手がかりです。使用しているプログラミング言語に応じて、関数を異なる方法で装飾する必要があります。

Go の場合、Datadog APM により、特定のコードブロックをインスツルメントすることにより、コードをインスツルメントしてカスタムスパンを生成できます。

この例では、台帳に投稿されたすべてのトランザクションに対して新しいスパンを作成し、特定のトランザクション ID を持つカスタムタグをスパンに追加します。

package ledger

import "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"

// [...]

func (bl *BackupLedger) write(ctx context.Context, transactions []*Transaction) (err error) {
  // `write` 関数をトレースし、存在する場合はエラーをキャプチャします
  span, ctx := tracer.StartSpanFromContext(ctx, "BackupLedger.write")
  defer func() {
    span.Finish(tracer.WithError(err))
  }()

  for _, t := range transactions {
    if err := bl.persistTransaction(ctx, t); err != nil {
      return err
    }
  }
  return nil
}

// persistTransaction は、トレースしたい内部関数です。 
// 以前と同じアプローチを使用できます。
// これは、渡した `ctx` に親/子関係を作成するための、すぐに使用できるスパン参照が含まれるためです。
func (bl *BackupLedger) persistTransaction(ctx context.Context, transaction *Transaction) error {
  id := transaction.ID
  span, _ := tracer.StartSpanFromContext(ctx, "BackupLedger.persist", tracer.Tag("transaction_id", id))
  defer span.Finish()

  if t, ok := bl.transactions[id]; ok {
    return errors.New("duplicate entry")
  }
  bl.transactions[id] = transaction
  return nil
}

Datadog UI を活用して新しいカスタムスパンを表示する

ビジネスロジックをインスツルメントしたら、Datadog APM UI で結果を確認します。

  1. サービスカタログに移動し、カスタムスパンを追加したサービスをクリックして、そのサービスページを開きます。サービスページで、追加した特定のリソースをクリックし、時間フィルターを The past 15 minutes に変更し、スパンサマリーテーブルまでスクロールダウンします。

    スパンサマリーテーブル

スパンサマリーテーブルでは、トレースを構成するスパンに関する集約情報を確認できます。ここで、異常な回数繰り返されるスパンを特定して、ループやデータベースアクセスの非効率性を見つけることができます(n+1 問題など)。

  1. トレースの一覧画面までスクロールダウンし、トレースのいずれかをクリックします。

    分析ビュー

これで、カスタムスパンがコードベースに正常に追加され、フレームグラフと App Analytics で利用できるようになりました。これは、Datadog のツールを最大限に活用するための最初のステップです。次にカスタムタグをスパンに追加すれば、さらに強力にすることができます。

その他の参考資料

PREVIEWING: yiming.luo/fix-lambda-doc
Your Privacy Choices