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

8 分で読了

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

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

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

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

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

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

分析ビュー

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

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

デコレータを使用してメソッドをインスツルメントする

この例では、BackupLedger.write メソッドにスパンを追加し、トランザクション台帳に新しい行を追加します。投稿されたすべてのトランザクションを単一のユニットとして追跡するために、1 つのスパンが追加されます。

import datadog.trace.api.Trace

public class BackupLedger {

  // @Trace アノテーションを使用してカスタムメソッドをトレースします
  @Trace
  public void write(List<Transaction> transactions) {
    for (Transaction transaction : transactions) {
      ledger.put(transaction.getId(), transaction);
    }

    // [...]
  }
}

特定のコードブロックをインスツルメントする

この例では、上記で作成した BackupLedger.write スパンに子スパンを追加します。このメソッドは、台帳内のすべてのトランザクションの子スパンと、特定のトランザクション ID を持つカスタムタグを追加します。

import datadog.trace.api.Trace;
import io.opentracing.Scope;
import io.opentracing.Tracer;
import io.opentracing.util.GlobalTracer;

public class BackupLedger {

  // `@Trace` アノテーションを使用してカスタムメソッドをトレースします
  @Trace
  public void write(List<Transaction> transactions) {
    for (Transaction transaction : transactions) {
      // `GlobalTracer` を使用してインラインコードのブロックをトレースします
      Tracer tracer = GlobalTracer.get();
     // 注: 以下の try with resource ブロックのスコープは、
     // コードブロックの最後で自動的に閉じられます。
     // resource 文で try を使用しない場合は、scope.close() 
     // を呼び出す必要があります。
      try (Scope scope = tracer.buildSpan("BackupLedger.persist").startActive(true)) {
        // スパンにカスタムメタデータを追加します
        scope.span().setTag("transaction.id", transaction.getId());
        ledger.put(transaction.getId(), transaction);
      }
    }

    // [...]
  }
}

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

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

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

    スパンサマリーテーブル

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

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

    分析ビュー

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

その他の参考資料

PREVIEWING: brett.blue/reorg-otel