- 重要な情報
- はじめに
- 用語集
- ガイド
- エージェント
- インテグレーション
- OpenTelemetry
- 開発者
- API
- CoScreen
- アプリ内
- Service Management
- インフラストラクチャー
- アプリケーションパフォーマンス
- 継続的インテグレーション
- ログ管理
- セキュリティ
- UX モニタリング
- 管理
このページでは、Datadog APM を使用して可観測性を追加およびカスタマイズする一般的な使用例について説明します。
ddtrace
ライブラリの機能性を拡張したり、アプリケーションのインスツルメントをより精確に制御するのに役立つ方法がライブラリにあります。カスタムスパンタグをスパンに追加して、Datadog 内の可観測性をカスタマイズします。スパンタグは受信トレースに適用されるため、観測された動作を、マーチャントの階層、チェックアウト金額、ユーザー ID などのコードレベルの情報と関連付けることができます。
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("<TAG_KEY>", "<TAG_VALUE>")
}
func main() {
tracer.Start(tracer.WithService("<SERVICE_NAME>"))
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)
}
}
WithGlobalTag
オプションでトレーサーを構成して、すべてのスパンにタグを追加します。
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()
}
スパンのいずれかでエラーを設定する場合は、以下の tracer.WithError
を使用します。
err := someOperation()
span.Finish(tracer.WithError(err))
対応するライブラリインスツルメンテーションを使用しない場合( ライブラリの互換性参照)、手動でコードをインスツルメントする必要があります。
手動インスツルメンテーションの活用には、Datadog の godoc ページを参考に、tracer
パッケージを使用してください。
スパンの作成に使用できる関数は 2 つあります。API の詳細は、StartSpan
はこちら、 StartSpanFromContext
はこちらをご覧ください。
//parentSpan の子であるリソース名を持つスパンを作成します。
span := tracer.StartSpan("mainOp", tracer.ResourceName("/user"), tracer.ChildOf(parentSpan))
// Context ctx にスパンがある場合、その子となるスパンを作成します。
// 新しいスパン、および新しいスパンを含む新しいコンテキストを返します。
span, ctx := tracer.StartSpanFromContext(ctx, "mainOp", tracer.ResourceName("/user"))
func main() {
span, ctx := tracer.StartSpanFromContext(context.Background(), "mainOp")
defer span.Finish()
go func() {
asyncSpan := tracer.StartSpanFromContext(ctx, "asyncOp")
defer asyncSpan.Finish()
performOp()
}()
}
トレースコンテキストを手動で伝播して、分散トレースを作成します。
package main
import (
"net/http"
"gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
)
func handler(w http.ResponseWriter, r *http.Request) {
span, ctx := tracer.StartSpanFromContext(r.Context(), "post.process")
defer span.Finish()
req, err := http.NewRequest("GET", "http://example.com", nil)
req = req.WithContext(ctx)
// リクエストヘッダへスパンコンテキストを挿入します。
err = tracer.Inject(span.Context(), tracer.HTTPHeadersCarrier(req.Header))
if err != nil {
// 挿入エラーの処理またはログ
}
http.DefaultClient.Do(req)
}
次に、サーバー側で抽出されたコンテキスト
からスパンを開始し、トレースを続けます。
package main
import (
"net/http"
"gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
)
func handler(w http.ResponseWriter, r *http.Request) {
// スパンコンテキストを抽出し、このサービスでトレースを続行
sctx, err := tracer.Extract(tracer.HTTPHeadersCarrier(r.Header))
if err != nil {
// 挿入エラーの処理またはログ
}
span := tracer.StartSpan("post.filter", tracer.ChildOf(sctx))
defer span.Finish()
}
トレーシングクライアントと Datadog Agent の両方でコンフィギュレーションを追加することで、B3 ヘッダーを使用したコンテキスト伝播や、ヘルスチェックなどの計算されたメトリクスでこれらのトレースが不要な場合に、特定のリソースがトレースを Datadog に送信しないよう除外することができます。
分散型トレーシングのコンテキストの伝搬は、ヘッダーの挿入と抽出で構成できます。詳しくはトレースコンテキストの伝播をお読みください。
トレースはそれぞれのリソース名に基づいて除外可能で、これによりヘルスチェックなどの外形監視トラフィックが Datadog にレポートされるトレースから削除されます。この設定およびその他のセキュリティ/微調整に関するコンフィギュレーションについてはセキュリティページを参照してください。
お役に立つドキュメント、リンクや記事: