> Source: https://www.ymotongpoo.com/works/otel-specs-ja/semconv/dotnet/dotnet-network-traces/


# .NETが発行するネットワークスパンに関するセマンティック規約

**ステータス**: [Mixed][DocumentStatus]

この記事では、.NETが発行するHTTPクライアント、DNS、TLSのスパンに関するセマンティック規約を定義します。

.NETの`HttpClient`は、[HTTPセマンティック規約](/works/otel-specs-ja/semconv/http/http-spans/#httpクライアントスパン)に従って、HTTPクライアントリクエストスパンを報告します。

安定版のHTTPクライアントリクエストスパンに加えて、HTTPクライアントハンドラーは、HTTP接続の確立とそのステージを記述する実験的なスパンを報告します。

接続の寿命は通常分単位で計測されるため、アプリケーションに負荷がかかっていても接続プールに過負荷がかかっていない場合、接続関連のスパンの発生率はHTTPクライアントリクエストスパンの発生率よりもかなり低くなることが予想されます。

アプリケーションは、本番環境で*HTTPクライアントリクエスト*スパンをデフォルトで有効にすることが推奨されます。

接続レベルのスパンは実験的であり、将来的にその意味が破壊的に変更される可能性があります。
本番環境で接続レベルの計装を使用する場合は、適切な検証を行った上で実施すべきです。

接続関連のスパンは、特定のプラットフォームではサポートされていない場合や、特定のアプリケーションで使用されない場合がある[HttpClientHandler](https://learn.microsoft.com/dotnet/api/system.net.http.httpclienthandler)と[SocketsHttpHandler](https://learn.microsoft.com/dotnet/api/system.net.http.socketshttphandler)によってのみ報告されます。

## HTTPクライアントリクエスト

**ステータス**: [Stable][DocumentStatus]

.NETの`HttpClient`は、次の固有の詳細を伴って、[HTTPクライアントセマンティック規約](/works/otel-specs-ja/semconv/http/http-spans/#httpクライアントスパン)に従ってクライアントリクエストスパンを報告します。

- `network.protocol.name`属性、`network.peer.port`属性、`http.request.resend_count`属性は報告されません。
- `url.full`はデフォルトでリダクトされます。クエリパラメータの値は`*`に置き換えられます。このリダクトは、`AppContext`スイッチ`System.Net.Http.DisableQueryRedaction`を`true`に設定することで無効にできます。
- `error.type`属性が報告される場合、それには[HTTP Request errors](https://learn.microsoft.com/dotnet/api/system.net.http.httprequesterror)のいずれかをsnake_caseにしたもの、完全な例外型名、または受信したステータスコードの文字列表現が含まれます。
- すべての属性は、`Activity`が開始された後に報告され、作成時に提供される属性はありません。
- リダイレクトが発生した場合、リダイレクトされた各リクエストは別々のスパンとして報告されます。
- `SocketsHttpHandler`は、接続に失敗した際にリクエストを再試行することがあります。このような再試行は、別々のスパンとして報告されません。

対応する`Activity.OperationName`は`System.Net.Http.HttpRequestOut`、`ActivitySource`名は`System.Net.Http`です。
HTTPセマンティクスを持つスパンは.NET 9で追加されました。

## HTTPクライアントリクエストの接続待機

<!-- semconv span.dotnet.http.request.wait_for_connection.internal -->
<!-- NOTE: THIS TEXT IS AUTOGENERATED. DO NOT EDIT BY HAND. -->
<!-- see templates/registry/markdown/snippet.md.j2 -->
<!-- prettier-ignore-start -->

**Status:** ![Development](https://img.shields.io/badge/-development-blue)

このスパンは、HTTPリクエストが接続プールから接続を取得するまでの時間を記述します。

このスパンは、リクエストが開始された時点で接続がすぐに利用可能でなかった場合にのみ報告されます。
これは*HTTPクライアントリクエスト*スパンの子として報告されます。

このスパンは、接続が取得された時点で終了します。これは、既存の接続が利用可能になった時点、または新しい接続が確立された時点で発生する可能性があるため、*接続待機*スパンの持続時間は、[*HTTP接続のセットアップ*](/works/otel-specs-ja/semconv/dotnet/dotnet-network-traces/#http接続のセットアップ)スパンの持続時間とは異なります。

プールから接続を取得するまでの時間は、[`http.client.request.time_in_queue`メトリクス](/works/otel-specs-ja/semconv/dotnet/dotnet-http-metrics/#メトリクス-httpclientrequesttime_in_queue)によっても報告されます。

対応する`Activity.OperationName`は`Experimental.System.Net.Http.Connections.WaitForConnection`、`ActivitySource`名は`Experimental.System.Net.Http`です。
.NET 9で追加されました。

**スパン名**は`HTTP wait_for_connection {server.address}:{server.port}`であるべきです（SHOULD）。

**スパン種別**は`INTERNAL`であるべきです（SHOULD）。

**スパンステータス**は[エラーの記録](/works/otel-specs-ja/semconv/general/recording-errors/)文書に従うべきです（SHOULD）。

**Attributes:**

| Key | Stability | [Requirement Level](/works/otel-specs-ja/semconv/general/attribute-requirement-level/) | Value Type | Description | Example Values |
| --- | --- | --- | --- | --- | --- |
| [`error.type`](https://opentelemetry.io/docs/specs/semconv/registry/attributes/error/) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` if and only if an error has occurred. | string | [HTTP Request errors](https://learn.microsoft.com/dotnet/api/system.net.http.httprequesterror)のいずれかをsnake_caseにしたもの、または完全な例外型。 | `version_negotiation_error`; `System.OperationCanceledException` |

---

`error.type`には、次のよく知られた値の一覧があります。これらのいずれかが該当する場合は、対応する値を使用しなければなりません（MUST）。そうでない場合は、独自の値を使用してもかまいません（MAY）。

| Value | Description | Stability |
| --- | --- | --- |
| `_OTHER` | 計装が独自の値を定義していない場合に使用するフォールバック用のエラー値。 | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |

<!-- prettier-ignore-end -->
<!-- END AUTOGENERATED TEXT -->
<!-- endsemconv -->

## HTTP接続のセットアップ

<!-- semconv span.dotnet.http.connection_setup.internal -->
<!-- NOTE: THIS TEXT IS AUTOGENERATED. DO NOT EDIT BY HAND. -->
<!-- see templates/registry/markdown/snippet.md.j2 -->
<!-- prettier-ignore-start -->

**Status:** ![Development](https://img.shields.io/badge/-development-blue)

このスパンは、HTTP接続の確立を記述します。これには、DNSの解決、ソケット接続の確立、TLSハンドシェイクの実行にかかる時間が含まれます。

[*HTTPクライアントリクエスト*](/works/otel-specs-ja/semconv/dotnet/dotnet-network-traces/#httpクライアントリクエスト)スパンと[*HTTP接続のセットアップ*](/works/otel-specs-ja/semconv/dotnet/dotnet-network-traces/#http接続のセットアップ)スパンの間に、親子関係はありません。
後者は常にルートスパンとなり、別のトレースを定義します。

しかし、[*HTTP接続のセットアップ*](/works/otel-specs-ja/semconv/dotnet/dotnet-network-traces/#http接続のセットアップ)スパンが表す接続の試行がHTTP接続の確立に成功し、その接続がそれを処理するリクエストによって取得された場合、計装は[*HTTPクライアントリクエスト*](/works/otel-specs-ja/semconv/dotnet/dotnet-network-traces/#httpクライアントリクエスト)スパンに、そのHTTP接続セットアップスパンを指すリンクを追加します。
つまり、各リクエストは、そのリクエストを処理した接続にリンクされます。

対応する`Activity.OperationName`は`Experimental.System.Net.Http.Connections.ConnectionSetup`、`ActivitySource`名は`Experimental.System.Net.Http.Connections`です。
.NET 9で追加されました。

**スパン名**は`HTTP connection_setup {server.address}:{server.port}`であるべきです（SHOULD）。

**スパン種別**は`INTERNAL`であるべきです（SHOULD）。

**スパンステータス**は[エラーの記録](/works/otel-specs-ja/semconv/general/recording-errors/)文書に従うべきです（SHOULD）。

**Attributes:**

| Key | Stability | [Requirement Level](/works/otel-specs-ja/semconv/general/attribute-requirement-level/) | Value Type | Description | Example Values |
| --- | --- | --- | --- | --- | --- |
| [`error.type`](https://opentelemetry.io/docs/specs/semconv/registry/attributes/error/) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` if and only if an error has occurred. | string | [HTTP Request errors](https://learn.microsoft.com/dotnet/api/system.net.http.httprequesterror)のいずれかをsnake_caseにしたもの、または完全な例外型。 | `name_resolution_error`; `System.OperationCanceledException` |
| [`network.peer.address`](https://opentelemetry.io/docs/specs/semconv/registry/attributes/network/) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | ソケット接続のピアIPアドレス。[1] | `10.1.2.80`; `/tmp/my.sock` |
| [`server.address`](https://opentelemetry.io/docs/specs/semconv/registry/attributes/server/) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | 逆引きDNSルックアップなしで利用可能な場合のサーバーのドメイン名。そうでない場合はIPアドレスまたはUNIXドメインソケット名。[2] | `example.com`; `10.1.2.80`; `/tmp/my.sock` |
| [`server.port`](https://opentelemetry.io/docs/specs/semconv/registry/attributes/server/) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | int | サーバーのポート番号。[3] | `80`; `8080`; `443` |
| [`url.scheme`](https://opentelemetry.io/docs/specs/semconv/registry/attributes/url/) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | 使用されているプロトコルを識別する[URIスキーム](https://www.rfc-editor.org/rfc/rfc3986#section-3.1)の構成要素。 | `https`; `ftp`; `telnet` |

**[1] `network.peer.address`:** `network.peer.address`属性は、接続が正常に確立された場合、かつIPソケットの場合にのみ利用可能です。

**[2] `server.address`:** クライアント側から観測し、かつ中間サーバーを介して通信している場合、`server.address`は、（利用可能であれば）プロキシなどの中間サーバーの背後にあるサーバーのアドレスを表すべきです（SHOULD）。

**[3] `server.port`:** クライアント側から観測し、かつ中間サーバーを介して通信している場合、`server.port`は、（利用可能であれば）プロキシなどの中間サーバーの背後にあるサーバーのポートを表すべきです（SHOULD）。

---

`error.type`には、次のよく知られた値の一覧があります。これらのいずれかが該当する場合は、対応する値を使用しなければなりません（MUST）。そうでない場合は、独自の値を使用してもかまいません（MAY）。

| Value | Description | Stability |
| --- | --- | --- |
| `_OTHER` | 計装が独自の値を定義していない場合に使用するフォールバック用のエラー値。 | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |

<!-- prettier-ignore-end -->
<!-- END AUTOGENERATED TEXT -->
<!-- endsemconv -->

## DNSルックアップ

<!-- semconv span.dotnet.dns.lookup.internal -->
<!-- NOTE: THIS TEXT IS AUTOGENERATED. DO NOT EDIT BY HAND. -->
<!-- see templates/registry/markdown/snippet.md.j2 -->
<!-- prettier-ignore-start -->

**Status:** ![Development](https://img.shields.io/badge/-development-blue)

このスパンは、[System.Net.Dns](https://learn.microsoft.com/dotnet/api/system.net.dns)クラスのいずれかのメソッドで実行される、DNSルックアップまたは逆引きルックアップを記述します。

DNSスパンは、物理的なDNS呼び出しではなく論理的な操作を追跡し、実際の挙動はリゾルバーの実装に依存します。この実装は、今後の.NETのバージョンで変更される可能性があります。
.NET 9はOSのDNSリゾルバーを使用しており、1回のAPI呼び出しに対して0回以上の物理的なルックアップを行う場合があります。

*DNSルックアップ*スパンが*HTTP接続のセットアップ*スパンおよび*ソケット接続*スパンとともに報告される場合、*DNSルックアップ*スパンは*HTTP接続のセットアップ*の子となり、*ソケット接続*の兄弟となります。

DNSルックアップの持続時間は、[`dns.lookup.duration`メトリクス](/works/otel-specs-ja/semconv/dotnet/dotnet-dns-metrics/#メトリクス-dnslookupduration)によっても報告されます。

対応する`Activity.OperationName`は`Experimental.System.Net.NameResolution.DnsLookup`、`ActivitySource`名は`Experimental.System.Net.NameResolution`です。
.NET 9で追加されました。

**スパン名**は、DNSルックアップ（ホスト名からIPアドレス）の場合は`DNS lookup {dns.question.name}`、逆引きルックアップ（IPアドレスからホスト名）の場合は`DNS reverse lookup {dns.question.name}`であるべきです（SHOULD）。

**スパン種別**は`INTERNAL`であるべきです（SHOULD）。

**スパンステータス**は[エラーの記録](/works/otel-specs-ja/semconv/general/recording-errors/)文書に従うべきです（SHOULD）。

**Attributes:**

| Key | Stability | [Requirement Level](/works/otel-specs-ja/semconv/general/attribute-requirement-level/) | Value Type | Description | Example Values |
| --- | --- | --- | --- | --- | --- |
| [`error.type`](https://opentelemetry.io/docs/specs/semconv/registry/attributes/error/) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` if and only if an error has occurred. | string | [System.Net.Dns](https://learn.microsoft.com/dotnet/api/system.net.dns)が返すエラーコードまたは例外名。[1] | `host_not_found`; `try_again` |
| [`dns.answers`](https://opentelemetry.io/docs/specs/semconv/registry/attributes/dns/) | ![Development](https://img.shields.io/badge/-development-blue) | `Recommended` if DNS lookup was successful. | string[] | （DNSルックアップの場合）解決されたIPアドレスの一覧、または（逆引きルックアップの場合）ドメイン名を含む単一の要素。 | `["10.0.0.1", "2001:0db8:85a3:0000:0000:8a2e:0370:7334"]` |
| [`dns.question.name`](https://opentelemetry.io/docs/specs/semconv/registry/attributes/dns/) | ![Development](https://img.shields.io/badge/-development-blue) | `Recommended` | string | クエリの対象となるドメイン名またはIPアドレス。 | `www.example.com`; `opentelemetry.io` |

**[1] `error.type`:** 次のエラーが報告されます。

- `host_not_found`
- `try_again`
- `no_recovery`
- `address_family_not_supported`
- 完全な例外型名

詳細は[SocketError](https://learn.microsoft.com/dotnet/api/system.net.sockets.socketerror)を参照してください。

---

`error.type`には、次のよく知られた値の一覧があります。これらのいずれかが該当する場合は、対応する値を使用しなければなりません（MUST）。そうでない場合は、独自の値を使用してもかまいません（MAY）。

| Value | Description | Stability |
| --- | --- | --- |
| `_OTHER` | 計装が独自の値を定義していない場合に使用するフォールバック用のエラー値。 | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |

<!-- prettier-ignore-end -->
<!-- END AUTOGENERATED TEXT -->
<!-- endsemconv -->

## ソケット接続

<!-- semconv span.dotnet.socket.connect.internal -->
<!-- NOTE: THIS TEXT IS AUTOGENERATED. DO NOT EDIT BY HAND. -->
<!-- see templates/registry/markdown/snippet.md.j2 -->
<!-- prettier-ignore-start -->

**Status:** ![Development](https://img.shields.io/badge/-development-blue)

このスパンは、ソケット接続の確立を記述します。

これは、DNSルックアップとTLSハンドシェイクも対象とする[*HTTP接続のセットアップ*](/works/otel-specs-ja/semconv/dotnet/dotnet-network-traces/#http接続のセットアップ)スパンとは異なります。

*ソケット接続*スパンが*HTTP接続のセットアップ*スパンとともに報告される場合、ソケットのスパンはHTTP接続のセットアップの子となります。

対応する`Activity.OperationName`は`Experimental.System.Net.Sockets.Connect`、`ActivitySource`名は`Experimental.System.Net.Sockets`です。
.NET 9で追加されました。

**スパン名**は、ソケットのアドレスファミリーがポートの概念を持つ場合は`socket connect {network.peer.address}:{network.peer.port}`、そうでない場合は`socket connect {network.peer.address}`であるべきです（SHOULD）。

**スパン種別**は`INTERNAL`であるべきです（SHOULD）。

**スパンステータス**は[エラーの記録](/works/otel-specs-ja/semconv/general/recording-errors/)文書に従うべきです（SHOULD）。

**Attributes:**

| Key | Stability | [Requirement Level](/works/otel-specs-ja/semconv/general/attribute-requirement-level/) | Value Type | Description | Example Values |
| --- | --- | --- | --- | --- | --- |
| [`error.type`](https://opentelemetry.io/docs/specs/semconv/registry/attributes/error/) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` if and only if an error has occurred. | string | ソケットのエラーコード。[1] | `connection_refused`; `address_not_available` |
| [`network.peer.address`](https://opentelemetry.io/docs/specs/semconv/registry/attributes/network/) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | ネットワーク接続のピアアドレス（IPアドレスまたはUNIXドメインソケット名）。 | `10.1.2.80`; `/tmp/my.sock` |
| [`network.peer.port`](https://opentelemetry.io/docs/specs/semconv/registry/attributes/network/) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` [2] | int | ネットワーク接続のピアのポート番号。 | `65123` |
| [`network.transport`](https://opentelemetry.io/docs/specs/semconv/registry/attributes/network/) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` [3] | string | [OSIトランスポート層](https://wikipedia.org/wiki/Transport_layer)または[プロセス間通信の方式](https://wikipedia.org/wiki/Inter-process_communication)。[4] | `tcp`; `udp`; `unix` |
| [`network.type`](https://opentelemetry.io/docs/specs/semconv/registry/attributes/network/) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` if `network.peer.address` is an IP address. | string | [OSIネットワーク層](https://wikipedia.org/wiki/Network_layer)、または非OSIの同等の概念。[5] | `ipv4`; `ipv6` |

**[1] `error.type`:** 次のエラーコードが報告されます。

- `network_down`
- `address_already_in_use`
- `interrupted`
- `in_progress`
- `already_in_progress`
- `address_not_available`
- `address_family_not_supported`
- `connection_refused`
- `fault`
- `invalid_argument`
- `is_connected`
- `network_unreachable`
- `host_unreachable`
- `no_buffer_space_available`
- `timed_out`
- `access_denied`
- `protocol_type`

詳細は、[Windows](https://learn.microsoft.com/windows/win32/api/winsock2/nf-winsock2-connect#return-value)と[Linux](https://man7.org/linux/man-pages/man2/connect.2.html)のソケットエラーを参照してください。

**[2] `network.peer.port`:** ソケットのアドレスファミリーがポートをサポートしている場合。

**[3] `network.transport`:** 値が`tcp`でない場合。値が指定されていない場合、`tcp`であると仮定されます。

**[4] `network.transport`:** この値は小文字に正規化されるべきです（SHOULD）。

ポート番号を設定する際は、常にトランスポートも設定することを検討してください。トランスポートが分からなければ、ポート番号は曖昧になるためです。たとえば、異なるプロセスがTCPポート12345とUDPポート12345の両方でリスンしている場合があります。

**[5] `network.type`:** この値は小文字に正規化されるべきです（SHOULD）。

---

`error.type`には、次のよく知られた値の一覧があります。これらのいずれかが該当する場合は、対応する値を使用しなければなりません（MUST）。そうでない場合は、独自の値を使用してもかまいません（MAY）。

| Value | Description | Stability |
| --- | --- | --- |
| `_OTHER` | 計装が独自の値を定義していない場合に使用するフォールバック用のエラー値。 | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |

---

`network.transport`には、次のよく知られた値の一覧があります。これらのいずれかが該当する場合は、対応する値を使用しなければなりません（MUST）。そうでない場合は、独自の値を使用してもかまいません（MAY）。

| Value | Description | Stability |
| --- | --- | --- |
| `pipe` | 名前付き、または匿名のパイプ。 | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
| `quic` | QUIC | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
| `tcp` | TCP | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
| `udp` | UDP | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
| `unix` | UNIXドメインソケット | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |

---

`network.type`には、次のよく知られた値の一覧があります。これらのいずれかが該当する場合は、対応する値を使用しなければなりません（MUST）。そうでない場合は、独自の値を使用してもかまいません（MAY）。

| Value | Description | Stability |
| --- | --- | --- |
| `ipv4` | IPv4 | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |
| `ipv6` | IPv6 | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |

<!-- prettier-ignore-end -->
<!-- END AUTOGENERATED TEXT -->
<!-- endsemconv -->

## TLSハンドシェイク

スパン名は、クライアント側で認証する場合は`TLS client handshake {server.address}`、サーバーを認証する場合は`TLS server handshake`であるべきです（SHOULD）。
スパン種別は、いずれの場合も`INTERNAL`であるべきです（SHOULD）。

<!-- semconv span.dotnet.tls.handshake.internal -->
<!-- NOTE: THIS TEXT IS AUTOGENERATED. DO NOT EDIT BY HAND. -->
<!-- see templates/registry/markdown/snippet.md.j2 -->
<!-- prettier-ignore-start -->

**Status:** ![Development](https://img.shields.io/badge/-development-blue)

このスパンは、[System.Net.Security.SslStream](https://learn.microsoft.com/dotnet/api/system.net.security.sslstream)で実行される、TLSクライアントまたはサーバーのハンドシェイクを記述します。

クライアント側の認証について*TLS*スパンが*HTTP接続のセットアップ*スパンおよび*ソケット接続*スパンとともに報告される場合、*TLS*スパンは*HTTP接続のセットアップ*の子となります。

対応する`Activity.OperationName`は`Experimental.System.Net.Security.TlsHandshake`、`ActivitySource`名は`Experimental.System.Net.Security`です。
.NET 9で追加されました。

**スパン名**は、クライアント側で認証する場合は`TLS client handshake {server.address}`、サーバーを認証する場合は`TLS server handshake`であるべきです（SHOULD）。

**スパン種別**は、いずれの場合も`INTERNAL`であるべきです（SHOULD）。

**スパンステータス**は[エラーの記録](/works/otel-specs-ja/semconv/general/recording-errors/)文書に従うべきです（SHOULD）。

**Attributes:**

| Key | Stability | [Requirement Level](/works/otel-specs-ja/semconv/general/attribute-requirement-level/) | Value Type | Description | Example Values |
| --- | --- | --- | --- | --- | --- |
| [`error.type`](https://opentelemetry.io/docs/specs/semconv/registry/attributes/error/) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` if and only if an error has occurred. | string | 操作が終了したエラーのクラスを記述します。 | `System.Net.Security.Authentication.AuthenticationException`; `System.OperationCanceledException` |
| [`server.address`](https://opentelemetry.io/docs/specs/semconv/registry/attributes/server/) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` when authenticating the client. | string | TLSハンドシェイク中の「Client Hello」メッセージで使用される[サーバー名表示（SNI）](https://en.wikipedia.org/wiki/Server_Name_Indication)。[1] | `opentelemetry.io`; `example.com` |
| [`tls.protocol.name`](https://opentelemetry.io/docs/specs/semconv/registry/attributes/tls/) | ![Development](https://img.shields.io/badge/-development-blue) | `Recommended` when available | string | ネゴシエーションされた[SSL/TLSプロトコルバージョン](https://docs.openssl.org/1.1.1/man3/SSL_get_version/#return-values)の元の文字列から解析された、正規化済みの小文字のプロトコル名。 | `ssl`; `tls` |
| [`tls.protocol.version`](https://opentelemetry.io/docs/specs/semconv/registry/attributes/tls/) | ![Development](https://img.shields.io/badge/-development-blue) | `Recommended` when available | string | ネゴシエーションされた[SSL/TLSプロトコルバージョン](https://docs.openssl.org/1.1.1/man3/SSL_get_version/#return-values)の元の文字列から解析された、バージョンの数値部分。 | `1.2`; `3` |

**[1] `server.address`:** クライアント側から観測し、かつ中間サーバーを介して通信している場合、`server.address`は、（利用可能であれば）プロキシなどの中間サーバーの背後にあるサーバーのアドレスを表すべきです（SHOULD）。

---

`error.type`には、次のよく知られた値の一覧があります。これらのいずれかが該当する場合は、対応する値を使用しなければなりません（MUST）。そうでない場合は、独自の値を使用してもかまいません（MAY）。

| Value | Description | Stability |
| --- | --- | --- |
| `_OTHER` | 計装が独自の値を定義していない場合に使用するフォールバック用のエラー値。 | ![Stable](https://img.shields.io/badge/-stable-lightgreen) |

---

`tls.protocol.name`には、次のよく知られた値の一覧があります。これらのいずれかが該当する場合は、対応する値を使用しなければなりません（MUST）。そうでない場合は、独自の値を使用してもかまいません（MAY）。

| Value | Description | Stability |
| --- | --- | --- |
| `ssl` | SSL | ![Development](https://img.shields.io/badge/-development-blue) |
| `tls` | TLS | ![Development](https://img.shields.io/badge/-development-blue) |

<!-- prettier-ignore-end -->
<!-- END AUTOGENERATED TEXT -->
<!-- endsemconv -->

## 例

### 接続がすぐに利用可能な状態でHTTPリクエストが実行された場合

リクエストに対して接続がすぐに利用可能な場合、`HttpClient`はHTTPリクエスト用に1つのスパンを作成し、それをこの接続に関連付けられた*HTTP connection_setup*スパンにリンクします。

この時点で、*HTTP connection_setup*スパンはすでに終了しています。

```
<- HTTP connection_setup - (trace=t1, span=s1) ->
<--- DNS --->
             <--- socket connect --->
                                     <--- TLS -->
                                                  <--- GET / (INTERNAL, trace=t2, span=s2, link_to=t1,s1) --->
```

### HTTPリクエストが接続のセットアップを待たなければならない場合

リクエストに対して接続がすぐに利用可能でなかった場合、HTTPクライアントとハンドラーは、HTTPリクエストスパンと*接続待機*スパンを作成します。この例では、新しい接続が作成され、その接続が作成された直後にリクエストがその接続上で実行されました。計装は、HTTPリクエストの`GET`スパンに、*HTTP connection_setup*スパンへのリンクを追加しています。

```
<--------- HTTP connection_setup (trace=t1, span=s1) -------->
<--- DNS --->
             <--------- socket connect -------->
                                                <--- TLS --->


<----------------------- GET / (trace=t2, span=s2, link_to=t1,s1) -------------------------------->
<--------- HTTP wait_for_connection (trace=t2, span=s3) ------>
```

### HTTPリクエストが接続のセットアップと、その接続上の他のリクエストの完了を待たなければならない場合

リクエストに対して接続がすぐに利用可能でなかった場合、HTTPクライアントとハンドラーは、HTTPリクエストスパンと*接続待機*スパンを作成します。この例では、リクエストは既存の接続上で実行されましたが、この接続はこのリクエストに利用可能になる前に、キュー内の他のリクエストを処理していました。

```
<- HTTP connection_setup - (t1,s1) ->
                                        <--------------------- GET / (trace=t2, span=s2) ----------------------------------------->
                                        <---- HTTP wait_for_connection (trace=t2, span=s2, link_to=t1,s1) ---->
```

*HTTP connection_setup*スパンはこのリクエストより前に開始されており、対応する接続は、上記の`GET`リクエストに利用可能になるまで、他のリクエストを処理していました。

ここでの長い*接続待機*スパンは、リクエストのキューが存在し、プール内の接続への需要が高いことを示しています。

### 接続が確立できないためHTTPリクエストが失敗する場合

接続が確立される前にHTTPリクエストが失敗する場合、以下のようになります。

- 接続を確立するすべての試行が、*HTTP connection_setup*スパンとして記録されます。
- HTTPリクエストの`GET`スパンは、対応するエラー型とともに、*接続待機*スパンと合わせて記録されます。
- HTTPリクエストの`GET`スパンは、これらの接続が対応するリクエストと関連付けられたことがないため、いずれの*HTTP connection_setup*スパンにもリンクされ**ません**。

```
<- HTTP connection_setup - (trace=t1, span=s1) - ERROR ->
<------------------- DNS - timeout ---------------->

<---------- GET / (trace=t2, span=s2) - ERROR ---------->
<- HTTP wait_for_connection (trace=t2, span=s3) - ERROR ->
```

[DocumentStatus]: https://opentelemetry.io/docs/specs/otel/document-status

