カスタム・トレースのベスト・プラクティス
Instana AutoTrace™ を拡張する場合、または手動で計測されたスパンを取り込む場合は、以下のベストプラクティスに従うことをお勧めします。
詳細については、 Instana および AutoTrace をご覧ください。
適切な注釈の付いたスパンを使用する
アプリケーションとインフラストラクチャーを最大限モニターし、そこから学習し、アラートを活用するために、Instana はすべての着信データに対して高度な処理と分析を実行します。 これには、すべてのソースからのすべての着信スパンが含まれます。
Instana の自動分析と自動処理のメリットを最大限に活用するには、適切なタグをスパンに追加します。それによって、Instana が着信スパンを最適な方法で分析して対処できるようになります。
たとえば、次の Python OpenTracing のコードでは、提供される情報が少なくなっています。
import opentracing
with opentracing.tracer.start_active_span('vanilla') as pscope:
# ...
# do something that takes 50ms
# ...
pscope.span.log_kv({"foo": "bar"})
このコードからわかるのは、 vanilla という名前のスパンが 50 ミリ秒の時間を要したことのみです。 スパンのタイプは不明です。HTTP、RPC、メッセージング・スパンのいずれでもあった可能性があります。 所要時間内に何が起きたのか、インフラストラクチャー内の他のコンポーネントと通信したかどうかなどもわかりません。
適切なコンテキストの OpenTracing タグを指定すると、Instana はこのスパンから処理すべき情報を分析して抽出します。
import opentracing
import opentracing.ext.tags as ext
with opentracing.tracer.start_active_span('webserver') as pscope:
pscope.span.set_tag(ext.SPAN_KIND, "entry")
pscope.span.set_tag(ext.PEER_HOSTNAME, "localhost")
pscope.span.set_tag(ext.HTTP_URL, "/python/simple/two")
pscope.span.set_tag(ext.HTTP_METHOD, "POST")
pscope.span.log_kv({"foo": "bar"})
# ...
# work that took 50ms
# ...
pscope.span.set_tag(ext.HTTP_STATUS_CODE, 204)
このように適切な注釈が付けられたスパンは、スパンのコンテキストで何が発生したのかを Instana に詳しく知らせます。 提供されているタグから、これが /python/simple/two への着信 Web サーバー要求であり、結果の HTTP 状況コードが 204 であることがわかります。
前述のスニペットのように適切に注釈が付けられたスパンがあれば、 Instana はサービスを抽出し、接続状況やその健全性を監視することができ、ダッシュボードでの体験をより充実したものにしてくれます。
この例の詳細については、サポートされているすべての OpenTracing タグの正式な一覧を定義している OpenTracing 仕様を参照してください。 Instana でサポートされるタグの総合リスト (OpenTracing タグのスーパーセット) は、このページの最後にあります。
「組み込み」スパンへの注釈付け
場合によっては、 Instana が提供するライブラリによって提供される既存のspanに、さらにメタデータを追加することが有効な場合もあります。 このデータを表示するには、トレースの sdk.custom.tags オブジェクト内に配置する必要があります。
ライブラリーごとに、この処理は異なります。 このオブジェクトの追加方法を理解するには、ご使用の言語の SDK の資料を参照してください。
Entry (エントリー) スパンを使用した新規トレースの開始
分散トレースには、主に次の 3 つのタイプのスパンがあります。
- Entry: 要求の受信、新規タスクの開始、またはメッセージのコンシュームに注釈を付けます。
- 中間: 通話を発信または受信しない内部作業 (例えば、ビュー・レンダリング) に注釈を付けます。
- 終了: リモート・サービスへの呼び出しを行ったり、キューにメッセージをパブリッシュしたりする作業に注釈を付けます。
span.kind タグは、報告対象のスパンのタイプにマークを付けます。 詳細については、このページ末尾の表、または『 OpenTracingspan.kind 』仕様書をご参照ください。
新規トレースを開始する場合は、Entry スパンを使用して開始します。 span.kind タグを指定しない場合、スパンは Entry タイプのスパンとみなされます。 このタグを適切な値に設定することで、Instana では、処理、バックエンド呼び出しの抽出の可視化、およびマッピングが向上します。
以下の Go の例を参照してください。
// Start a new entry span and set 'kind' to Consumer (entry)
entrySpan := ot.StartSpan("RPCJobRunner")
entrySpan.SetTag(string(ext.SpanKind), string(ext.SpanKindConsumerEnum))
// Now the RPC exit span
spanName := fmt.Sprintf("%s %s", request.Service, request.Method)
clientSpan := ot.StartSpan(spanName, ot.ChildOf(entrySpan.Context()))
clientSpan.SetTag(string(ext.SpanKind), string(ext.SpanKindRPCClientEnum))
clientSpan.SetTag("rpc.call", request.Method)
// Make the RPC call
clientSpan.Finish()
entrySpan.Finish()
エラーのあるスパンのマーク付け
例外などのエラーを含む作業を表すスパンには、error タグおよび message タグを含める必要があります。 これらのタグの定義については、以下の表の定義を参照してください。
マイクロサービス間でのコンテキストの引き渡し
ホスト、キュー、サービスなどの境界を越えてコンテキストを渡すために、分散トレースにはメソッドが含まれています。 これは通常、HTTP ヘッダーやメッセージ・キュー・ヘッダーなどのキャリアで行われます。
詳しくは、 HTTP Headersに関する資料を参照してください。
サービス名の設定
これはオプションです。 サービス名は、モニター対象のアプリケーション・プロセスに適用される名前です。 多くの言語では、使用中のフレームワークまたはプロセス・コマンド・ラインから、最適なサービス名を自動的に検出できます。
これをオーバーライドする場合は、トレーサーごとにサービス名を設定できます。 以下の Go 言語の例を参照してください。
serviceName := "default"
if *isServer {
serviceName = "rpc-client"
} else {
serviceName = "rpc-server"
}
opts := instana.Options{Service: serviceName})
opentracing.InitGlobalTracer(instana.NewTracerWithOptions(&opts)
Instana OpenTracing Tracer もすべて、環境変数を介してこの構成をサポートします。 プロセスに環境変数 INSTANA_SERVICE_NAME を設定すると、その値がプロセスのサービス名として使用されます。 これにより、コード・レベルのサービス名の構成のすべてがオーバーライドされます。
Instana のサービス抽出手法およびルールに関するドキュメントも参照してください。
エンドポイントと呼び出し名の設定
これはオプションです。 多くの言語では、サービス・タイプに基づいてエンドポイント名と呼び出し名が自動的に検出されます。
これをオーバーライドする場合は、トレーサーごとにエンドポイント名と呼び出し名を設定できます。 以下の Java 言語の例を参照してください。
SpanSupport.annotate(Span.Type.ENTRY, "my-custom-span", "endpoint", "endpoint-name");
SpanSupport.annotate(Span.Type.ENTRY, "my-custom-span", "call.name", "call-name");
Instana のエンドポイント抽出技術およびルール全般に関する詳細については、 エンドポイントに関するドキュメントをご覧ください。
スパン期間の上書き
トレース SDK は、スパンの開始から終了までのスパン期間を自動的に計算します。
通常は測定対象を表しますが、対象が合致していない場合は duration タグを使用して上書きできます。
予期されている形式はミリ秒です。
// Overwrite the span duration with 15 milliseconds.
SpanSupport.annotate(Span.Type.ENTRY, "my-custom-span", "duration", "15");
パス・テンプレート: HTTP エンドポイントのビジュアル・グループ化
Instana は、パス・テンプレートを使用したエンドポイントの自動グループ化をサポートします。 これは、多くのフレームワークの Instana トレースですぐに使用できます。 OpenTracing, を使用する場合は、以下に説明する通り、追加の手順が必要となります。
各種のフレームワークに、通常、以下のような REST パス・パターンがあります。
/api/query/1956-01-31/Guido-van-Rossum
/api/query/1976-04-18/Andrew-Ng
/api/query/1912-06-23/Alan-Turing
これらの類似したエンドポイントは、HTTP スパンの http.path_tpl キーを値 /api/query/{birthdate}/{name}で報告することによってグループ化できます。Instana はこのテンプレートを使用して、指定されたパターンに一致するエンドポイントを自動的にグループ化します。 Instana ダッシュボードでは、HTTP エンドポイントは単一のエンドポイントとしてグループ化されます。
/api/query/{birthdate}/{name}
以下の Go の例を参照してください。
span := ot.GlobalTracer().StartSpan("myTemplatedSpan", ext.RPCServerOption(incomingContext))
span.SetTag("http.path_tpl", "/api/query/{birthdate}/{name}")
span.SetTag(string(ext.SpanKind), string(ext.SpanKindRPCServerEnum))
span.SetTag(string(ext.HTTPUrl), req.URL.Path)
span.SetTag(string(ext.HTTPMethod), req.Method)
span.SetTag(string(ext.HTTPStatusCode), 200)
この機能は Instana 固有のものであり、OpenTracing に準拠していないことため、注意が必要です。
処理済みのタグ
このセクションでは、スパンの識別および処理をする際に Instana が検索する特定のタグをリストします。 あるスパンに対して以下のようなタグのサブセットが検出された場合、 Instana は、受信したスパンの処理、分析、可視化、およびアラート通知をより適切に行うことができます。
以下にリストするタグは、標準の OpenTracing タグの スーパーセット であることに注意してください。 各タグには、OpenTracing に準拠しているかどうかを示すマークが付けられます。準拠していない場合は、 ✓ または x のいずれかになります。
以下のタグの説明の一部は、 『 OpenTracing 』のセマンティック規約文書から直接引用したものです。
種別
分散トレースの世界では、スパンに次の 3 つの主要カテゴリーがあります。
- エントリー・スパン: 要求 (HTTP サーバーや RPC サーバーなど) を受信したり、キューからメッセージを使用したり、ジョブを実行したりするスパン
- 出口スパン: クライアント要求 (例えば、HTTP、RPC、またはデータベース) を行うスパン、キューにメッセージをプッシュするスパン、またはクライアント・データベース呼び出しを行うスパン
- 中間スパン: ビューのレンダリングやアクション/コントローラーの処理など、アプリケーションで行われる作業を表すスパン
スパンの span.kind タグは、報告されているスパンのタイプを識別します。 このタグを報告することにより、Instana はスパン間の通信を抽出、処理、およびマップすることができます。 Instana では、このコミュニケーションを「呼び出し」と呼びます。
このような情報があれば、Instana はスパンをモニターするだけでなく、スパン間の呼び出しもモニターして、システム間の接続性をより詳細に把握できます。 これにより、Instana は、スパンが報告されているときに、これらの呼び出しの正常性をモニターし、それに関するアラートを出すことができます。
| タグ | タイプ | OpenTracing 準拠 | 説明 |
|---|---|---|---|
span.kind |
ストリング | ✓ | RPC 要求または HTTP 要求内の適切な役割の場合は client または server。メッセージング・シナリオ内の適切な役割の場合は producer または consumer です。 受け入れられるその他の値は entry、exit、または intermediate ですが、これらは OpenTracing に準拠していません。 |
HTTP
HTTP スパンは、HTTP クライアント呼び出しまたは HTTP サーバー要求処理を表します。
| タグ | タイプ | OpenTracing 準拠 | 説明 |
|---|---|---|---|
http.url |
ストリング | ✓ | この HTTP クライアント要求またはサーバー処理で使用される完全修飾 HTTP URL。 |
http.method |
ストリング | ✓ | この HTTP クライアント要求またはサーバー処理で使用される HTTP メソッド。 例えば、「GET」、「POST」、「PUT」などです。 |
http.status_code |
整数 | ✓ | この HTTP 要求の HTTP 状況コード。 |
http.status |
整数 | x | http.status_code の代替。 どちらもサポートされていますが、送信できるのは 1 つだけです。 |
http.path |
ストリング | x | 要求の HTTP パス。 |
http.host |
ストリング | x | クライアント要求または着信 HTTP 要求を処理するホストの場合は、リモート・ホスト。 |
http.params |
ストリング | x | HTTP 要求の照会パラメーター。 |
http.error |
ストリング | x | エラーの場合、このスパンに関連付けられるエラー・メッセージ。 たとえば、「Internal Server Error」など。 |
http.header |
ストリング | x | このスパンに関連するカスタム・ヘッダー (「X-My-Custom-Header=afd812cab」など) を報告するために使用されます。 |
http.path_tpl |
ストリング | x | エンドポイントを視覚的にグループ化できます。 詳しくは、 パス・テンプレート の資料を参照してください。 |
http.route_id |
ストリング | x | ご使用の経路の固有 ID (blog.show など)。明確なエンドポイントを ID によって参照するフレームワークで役立ちます。 |
注:
- これらのタグとともに常に適切な
span.kindを送信する必要があります。 http.host、http.path、およびhttp.paramsは、http.urlの代わりにのみ送信してください。 これらのタグをhttp.urlと混用する送信はサポートされていません。結果は未定義です。
RPC
RPC スパンは、RPC 呼び出しまたは RPC サーバー呼び出しの処理で行われる作業を表します。
| タグ | タイプ | OpenTracing 準拠 | 説明 |
|---|---|---|---|
rpc.call |
ストリング | ✓ | 呼び出し対象またはサービス対象の RPC 呼び出し (span.kind の値により決まる) |
rpc.host |
ストリング | ✓ | クライアント呼び出しの場合は RPC リモート・ホスト、RPC サーバーの場合は要求を処理する RPC ホスト |
rpc.params |
ストリング | x | RPC 呼び出しのパラメーター |
rpc.port |
ストリング | x | RPC 呼び出しのポート |
rpc.flavor |
ストリング | x | XMLRPCやGRPCIOなど、使用されている RPC ライブラリの機能 |
rpc.error |
ストリング | x | RPC 呼び出しに関連付けられたエラー・メッセージ |
GraphQL
| タグ | タイプ | OpenTracing 準拠 | 説明 |
|---|---|---|---|
graphql.operationType |
ストリング | x | QueryまたはMutation |
graphql.operationName |
ストリング | x | 照会名またはミューテーション名 |
graphql.fields |
JSON /オブジェクトまたは文字列化された JSON (詳細は後述) | x | 照会またはミューテーションの一部として使用されるフィールド |
graphql.arguments |
JSON /オブジェクトまたは文字列化された JSON (詳細は後述) | x | 照会の一部として使用される引数 |
graphql.fields および graphql.argumentsについては、トレーサーがサポートする内容に応じて適切なデータ型 (JSON またはストリング) を選択する必要があります。
例:
// NodeJS SDK => JSON
span.annotate('sdk.custom.tags.graphql.fields', {
Account: [ 'id', 'name' ],
User: [ 'id', 'name' ]
})
span.annotate('sdk.custom.tags.graphql.arguments', {
User: [ 'where', 'orderBy' ]
})
// Java SDK => String
SpanSupport.annotate("graphql.fields", "{ \"Account\": [\"id\", \"name\"], \"User\": [\"id\", \"name\"] }");
SpanSupport.annotate("graphql.arguments", "{ \"User\": ["\where\", \"orderBy\"] }");
データベース
| タグ | タイプ | OpenTracing 準拠 | 説明 |
|---|---|---|---|
db.instance |
ストリング | ✓ | データベース・インスタンス名。 Java の例を挙げると、jdbc.url="jdbc:mysql://127.0.0.1:3306/customers" の場合、インスタンス名は「customers」です。 |
db.type |
ストリング | ✓ | SQL データベースの場合は「sql」。 その他の場合は、小文字のデータベース・カテゴリー (「cassandra」、「hbase」、「redis」など)。 |
db.statement |
ストリング | ✓ | 指定されたデータベース・タイプのデータベース・ステートメント。 例えば、db.type が「SQL」の場合は SELECT * FROM user_table、db.type が「redis」の場合はSET mykey 'WuValue' です。 |
db.user |
ストリング | ✓ | データベースにアクセスするためのユーザー名。 例えば、「readonly_user」や「reporting_user」などです。 |
db.connection_string |
ストリング | 接続ストリング (例: jdbc:mysql://127.0.0.1:3306/customers ) |
メッセージング
| タグ | タイプ | OpenTracing 準拠 | 説明 |
|---|---|---|---|
message_bus.destination |
ストリング | ✓ | メッセージ交換が可能なアドレス。 トピックまたはキューなどにすることができます。 |
バッチ
| タグ | タイプ | OpenTracing 準拠 | 説明 |
|---|---|---|---|
batch.job |
ストリング | x | 実行対象のジョブの名前。 |
ピア
| タグ | タイプ | OpenTracing 準拠 | 説明 |
|---|---|---|---|
peer.hostname |
ストリング | ✓ | 発信呼び出しを行うエグジット・スパンのリモート・ホスト。 |
peer.address |
ストリング | ✓ | 発信呼び出しを行うエグジット・スパンのリモート・アドレス。 |
peer.service |
ストリング | ✓ | 発信呼び出しを行うエグジット・スパンのリモート側のサービス名。 これはオプションであり、リモート側がまだインスツルメントされていない場合に使用できます。 |
エラー
| タグ | タイプ | OpenTracing 準拠 | 説明 |
|---|---|---|---|
error |
ブール | ✓ | このスパンが表す時間内にエラーが検出されたかどうかを示します。 |
message |
ストリング | x | エラーに関連付けられているメッセージ。 |