スパンタグの追加
Datadog の調査レポート: サーバーレスの状態 レポート: サーバーレスの状態

スパンタグの追加

タグをキーと値のペアの形式で追加して、トレースを他の Datadog 製品と関連付けることができます。これにより、特定のスパンに関する詳細が提供されます。タグは、単一スパンにすることも、グローバルにすべてのスパンに追加することもできます。

: トレースメタデータはタグを介して追加されますが、タグはすでに Datadog 全体で特定の意味を持っています。

スパンにタグを追加する

Datadog UI は、タグを使用してスパンレベルのメタデータを設定します。これらのタグの完全なリストは、Datadog および OpenTracing API にあります。

カスタムタグは、グローバルトレーサーからアクティブなスパンを取得し、setTag を使用してタグを設定することにより、自動インスツルメンテーション用に設定できます。

import io.opentracing.Tracer;
import io.opentracing.util.GlobalTracer;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet
class ServletImpl extends AbstractHttpServlet {
  @Override
  void doGet(HttpServletRequest req, HttpServletResponse resp) {
    final Span span = GlobalTracer.get().activeSpan();
    if (span != null) {
      span.setTag("customer.id", req.getParameter("customer_id"));
      span.setTag("<タグキー>", "<タグ値>");
    }
    // サーブレット実装
  }
}

set_tag を呼び出すことにより、タグスパンに直接追加します。たとえば、次のルートハンドラの場合:

from ddtrace import tracer

@app.route('/customer/<int:customer_id>')
def handle_customer(customer_id):
  with tracer.trace('web.request') as span:
    span.set_tag('customer.id', customer_id)
    span.set_tag('<タグキー>', '<タグ値>')

現在のスパンをコンテキストから取得して、タグを設定できます。こうすることで、インスツルメンテーションによってスパンが開始された場合、スパンを取得してカスタムタグを追加できます。: スパンが存在しない場合、None が返されます。

from ddtrace import tracer

@app.route('/customer/<int:customer_id>')
@tracer.wrap()
def handle_customer(customer_id):
  # コンテキスト内のアクティブなスパンを取得し、そこに tracer.wrap() で配置します
  current_span = tracer.current_span()
  if current_span:
    current_span.set_tag('customer.id', customer_id)
    current_span.set_tag('<タグキー>', '<タグ値>')

#set_tag を呼び出して、Datadog::Span オブジェクトにタグを直接追加します。

# Sinatra エンドポイントの例。
# Datadog がリクエストをトレースします。
get '/posts' do
  Datadog.tracer.trace('web.request') do |span|
    span.set_tag('http.url', request.path)
    span.set_tag('<タグキー>', '<タグ値>')
  end
end

コード内の任意のメソッドから現在アクティブなスパンにアクセスします。: メソッドが呼び出され、現在アクティブなスパンがない場合、active_spannil です。

# 例: アクティブなスパンにタグを追加する

current_span = Datadog.tracer.active_span
current_span.set_tag('<タグキー>', '<タグ値>') unless current_span.nil?

SetTag を呼び出して、Span インターフェイスにタグを直接追加します。

package main

import (
    "log"
    "net/http"

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

func handler(w http.ResponseWriter, r *http.Request) {
    // /posts URL でウェブリクエストのスパンを作成します。
    span := tracer.StartSpan("web.request", tracer.ResourceName("/posts"))
    defer span.Finish()

    // タグを設定
    span.SetTag("http.url", r.URL.Path)
    span.SetTag("<タグキー>", "<タグ値>")
}

func main() {
    tracer.Start(tracer.WithServiceName("<サービス名>"))
    defer tracer.Stop()
    http.HandleFunc("/posts", handler)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

Datadog のインテグレーションでは、Context タイプを使用して、現在アクティブなスパンを伝播します。 Context にアタッチされたスパンタグを追加したい場合、SpanFromContext 関数を呼び出します。

package main

import (
    "net/http"

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

func handler(w http.ResponseWriter, r *http.Request) {
    // Go Context にアタッチされたウェブリクエストのスパンを取得します。
    if span, ok := tracer.SpanFromContext(r.Context()); ok {
        // タグを設定
        span.SetTag("http.url", r.URL.Path)
    }
}

setTag または addTags を呼び出して、スパンオブジェクトにタグを直接追加します。

// Express エンドポイントの例。
// Datadog がリクエストをトレースします。
app.get('/posts', (req, res) => {
  const span = tracer.startSpan('web.request')

  span.setTag('http.url', req.url)
  span.addTags({'http.method': req.method})
  span.addTags({'<タグキー>': '<タグ値>'})
})

コード内の任意のメソッドから現在アクティブなスパンにアクセスします。: メソッドが呼び出され、現在アクティブなスパンがない場合、tracer.scope().active()null を返します。

// 例: アクティブなスパンにタグを追加する

const span = tracer.scope().active()

span.setTag('<タグキー>', '<タグ値>')

Span.SetTag() を呼び出して、Datadog.Trace.Span オブジェクトにタグを直接追加します。例:

using Datadog.Trace;

// グローバルトレーサーを介してアクティブなスコープにアクセスします(null を返すことができます)
var scope = Tracer.Instance.ActiveScope;

// スパンにタグを追加します
scope.Span.SetTag("<タグキー>", "<タグ値>");

: アクティブスパンがない場合、Datadog.Trace.Tracer.Instance.ActiveScopenull を返します。

Span::setTag() を呼び出して、DDTrace\Span オブジェクトにタグを直接追加します。例:

<?php
  // 現在アクティブなスパンを取得します(null も可能)
  $span = \DDTrace\GlobalTracer::get()->getActiveSpan();
  if (null !== $span) {
    // スパンにタグを追加します
    $span->setTag('<タグキー>', '<タグ値>');
  }
?>

: アクティブスパンがない場合、Tracer::getActiveSpan()null を返します。

すべてのスパンにグローバルにタグを追加する

システムプロパティ Ddd.trace.global.tags でトレーサーを構成して、すべてのスパンタグを追加します。

java -javaagent:<DD-JAVA-エージェントパス>.jar \
     -Ddd.trace.global.tags=env:dev,<タグキー>:<タグ値> \
     -jar <アプリケーションパス>.jar

tracer.set_tags メソッドでトレーサーを構成して、すべての[スパン]スパンにタグを追加します。

from ddtrace import tracer

tracer.set_tags({ 'env': 'dev' })

tags オプションでトレーサーを構成して、すべてのスパンタグを追加します。

Datadog.configure do |c|
  c.tracer tags: { 'env' => 'dev' }
end

詳細については、API に関するドキュメントを参照してください。

tags オプションでトレーサーを構成して、すべてのスパンタグを追加します。

package main

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

func main() {
    tracer.Start(
        tracer.WithGlobalTag("datacenter", "us-1"),
        tracer.WithGlobalTag("env", "dev"),
    )
    defer tracer.Stop()
}

tags パラメーターでトレーサーを構成して、すべてのスパンタグを追加します。

const tracer = require('dd-trace').init({
  tags: {
    env: 'dev',
    '<タグキー>': '<タグ値>'
  }
})

トレーサーを構成して、生成されたすべてのスパンタグを追加します。.NET 構成セクションに示すように、構成を設定するにはいくつかの方法があります。

この例では、環境変数を設定します。

DD_TRACE_GLOBAL_TAGS=key1:value1,key2:value2

環境変数 DD_TRACE_GLOBAL_TAGS を使用して、生成されたすべてのスパンタグを追加します。環境変数の設定方法の詳細については、PHP 構成セクションを参照してください。

DD_TRACE_GLOBAL_TAGS=key1:value1,key2:value2

Span::SetTag を呼び出して、スパンタグを直接追加します。例:

auto tracer = ...
auto span = tracer->StartSpan("オペレーション名");
span->SetTag("キーは文字列でなければなりません", "値は変数タイプです");
span->SetTag("キーは文字列でなければなりません", 1234);

値は変数タイプであり、複雑なオブジェクトにすることができます。値は JSON としてシリアル化されますが、文字列値はそのままシリアル化されます(余分な引用符はありません)。

その他の参考資料