サービスのプライマリオペレーション

APM サービス

APM サービスは、エラー、スループット、レイテンシーのトレースメトリクスを計算します。メトリクスは 1 つのスパン名に一致する複数のリソースを基に計算され、プライマリオペレーションとみなされます。サービスメトリクスは、製品全体で、デフォルトのサービス詳細画面としてサービスリストとサービスマップで使用されています。

: トレースメトリクスは、trace.* ネームスペースに基づき照会できます。

プライマリオペレーション

定義

サービスのプライマリオペレーション名により、サービスが UI でどのように表示されるかが決まります。Datadog のバックエンドは、リクエストスループットに基づいて、サービスのエントリーポイントとみなされるオペレーション名を自動的に選択します。

たとえば、web-store サービスは、リソースとしてインスツルメントされた複数のエンドポイントを持つことができます。これらのリソースでは、サービスのエントリーポイントが一致しているため、同じプライマリオペレーションを共有できます。例を挙げると、リソース /user/home/user/new は共に、同じプライマリオペレーション web.request を持ちます。他の言語では、サービスのプライマリオペレーションは以下のような形式をとります。

サービスの種類プライマリオペレーション
webservlet.requestflask.requestweb.request
dbpostgres.querydb.query
カスタムインスツルメンテーションtrace.annotationmethod.call

コンフィギュレーション

1 つのサービスに複数のプライマリオペレーションが定義されている場合は、最も高いリクエストスループットによってオペレーションが自動的に選択され、サービスのエントリーポイントとなります。管理者ユーザーはこれを手動で設定できます。

  1. APM 設定ページに移動します。
  2. Primary Operation Name タブを選択します。
  3. 手動設定を行うサービスの編集アイコンをクリックします。
  4. Set Manually タブをクリックします。
  5. サービスのエントリーポイントとして設定するオペレーションを選択します。
  6. 保存をクリックします。
APM の保存

追加スパン名の統計を表示する

すべてのトレースがインスツルメンテーション以外でも Datadog に正しく送信されているか確認するには、追加スパン名によりリソースを表示できます。追加スパン名はセカンダリオペレーションとしてドロップダウンメニューで表示されます。ただし、追加スパン名はサービスレベルの統計の計算には使用されません。

手動インスツルメンテーション

カスタムスパンを作成する際は、リソースが確実に同じプライマリオペレーション (例: web.request) で分類されるよう、スパン名を静的に設定します。スパン名が動的に設定されている場合は、リソースとして設定します (たとえば /user/profile)。

詳細は、プログラミング言語のカスタムインスツルメンテーションをご参照ください。

OpenTracing

Datadog を使用している場合、OpenTracing オペレーション名はリソース、OpenTracing “component” タグは Datadog のスパン名となります。たとえば、リソースが “/user/profile”、スパン名が “http.request” のスパンを OpenTracing 用語で定義するには、次のようになります。

Span span = tracer.buildSpan("http.request").start();

try (Scope scope = tracer.activateSpan(span)) {
    span.setTag("service.name", "service_name");
    span.setTag("resource.name", "/user/profile");
    // トレースされるコード
} finally {
    span.finish();
}

詳細は、Java および OpenTracing のセットアップをご参照ください。

from ddtrace.opentracer.tags import Tags
import opentracing
span = opentracing.tracer.start_span('http.request')
span.set_tag(Tags.RESOURCE_NAME, '/user/profile')
span.set_tag(Tags.SPAN_TYPE, 'web')

# ...
span.finish()

詳細は、Python および OpenTracing のセットアップをご参照ください。

OpenTracing.start_active_span('http.request') do |scope|
  scope.span.datadog_span.resource = '/user/profile'
  # トレースされるコード
end

詳細は、Ruby および OpenTracing のセットアップをご参照ください。

opentracing.StartSpan("http.request", opentracer.ResourceName("/user/profile"))

詳細は、Go および OpenTracing のセットアップをご参照ください。

const span = tracer.startSpan('http.request');
span.setTag('resource.name',  '/user/profile')
span.setTag('span.type', 'web')
// トレースされるコード
span.finish();

詳細は、Nodejs および OpenTracing のセットアップをご参照ください。

using OpenTracing;
using OpenTracing.Util;

using (var scope = GlobalTracer.Instance.BuildSpan("http.request").StartActive(finishSpanOnDispose: true))
{
    scope.Span.SetTag("resource.name", "/user/profile");
    // トレースされるコード
}

詳細は、.NET および OpenTracing のセットアップをご参照ください。

// Composer のオートローダーのインポート後、index.php の初めに一度。
// OpenTracing 1.0-beta6 以下の場合
$otTracer = new \DDTrace\OpenTracer\Tracer(\DDTrace\GlobalTracer::get());
// OpenTracing >= 1.0 以降の場合
$otTracer = new \DDTrace\OpenTracer1\Tracer(\DDTrace\GlobalTracer::get());
// グローバルのトレーサーラッパーを登録
 \OpenTracing\GlobalTracer::set($otTracer);

// アプリケーションコードの任意の場所
$otTracer = \OpenTracing\GlobalTracer::get();
$scope = $otTracer->startActiveSpan('http.request');
$span = $scope->getSpan();
$span->setTag('service.name', 'service_name');
$span->setTag('resource.name', '/user/profile');
$span->setTag('span.type', 'web');
// ...OpenTracing を予期されるとおりに使用
$scope->close();

詳細は、PHP および OpenTracing のセットアップをご参照ください。

// 現在のリクエストにルートスパンを作成。
auto root_span = tracer->StartSpan("web.request");
// ルートスパンにリソース名を設定。
root_span->SetTag(datadog::tags::resource_name, "/user/profile");

詳細は、CPP および カスタムインスツルメンテーションのセットアップをご参照ください。

その他の参考資料