HTTPセマンティック規約の安定版宣言

Blog posts are not updated after publication. This post is more than a year old, so its content may be outdated, and some links may be invalid. Cross-verify any information before relying on it.

今年の初め、HTTPセマンティック規約の安定化に向けた取り組みを開始しました。 本日、HTTPセマンティック規約がOpenTelemetryセマンティック規約として 初めて 安定版 と宣言されたことを誇りを持って発表します! この最初の安定版 v1.23.0 リリースは、以前のバージョンからの大幅な進歩であり、以下の特長があります。

  • Elastic Common Schema との統合による改善点。 たとえば以下のようなものがあります。
    • url.* 名前空間。 将来、HTTP以外のセマンティック規約でも再利用可能です。
    • net.peer.* および net.host.* 名前空間を client.* および server.* に置き換え。 これにより以下のメリットがあります。
      • ログにおいて、スパンの種類でどちら側がピアでどちら側がホストかを示す必要がなく、より適切に機能します。
      • クライアントとサーバーのテレメトリー間の相関を簡素化します(たとえば、net.peer.addr == net.host.addr を結合するかわりに、server.address で直接結合できます)。
      • network.* 名前空間からの明確な分離を提供します。 network.* は現在、低レベルのネットワーク属性専用です。
    • http.request.* および http.response.* 名前空間の使用に関するより高い一貫性。
  • Prometheus との一貫性の向上。 メトリクス単位を秒に標準化しました。
  • あまり有用でない属性を省略することで属性のキャプチャを合理化し、テレメトリーのキャプチャ、処理、ストレージのコストを削減しました。
  • デフォルト値の定義を明確化し、属性が存在しない場合のあいまいさを排除しました。
  • HTTPメトリクスがカーディナリティの爆発に対して脆弱でなくなりました。
    • http.request.method は(設定可能な)既知のメソッドの集合に制限されます。
    • server.addressserver.portHost ヘッダーの影響を受けるため、HTTPメトリクスではオプトインになりました。

移行計画

変更が多数あり、影響を受けるユーザーベースも広いため、OpenTelemetryが公開している既存のHTTP計装には、ユーザーが安定版HTTPセマンティック規約に移行するのを支援する移行計画を実装することを求めています。 他のセマンティック規約を安定化する際にも、同様の戦略を使用する予定です。

具体的には、OpenTelemetryが公開している既存のHTTP計装を安定版HTTPセマンティック規約に更新する場合、以下を行う必要があります。

  • 既存のメジャーバージョンに環境変数 OTEL_SEMCONV_STABILITY_OPT_IN を導入する必要があります。 この環境変数は以下の値を受け付けます。
    • http - 安定版のHTTPおよびネットワーク規約を出力し、以前の計装が出力していた古いHTTPおよびネットワーク規約の出力を停止します。
    • http/dup - 古い規約と安定版のHTTPおよびネットワーク規約の両方を出力し、安定版セマンティック規約の段階的な展開を可能にします。
    • デフォルトの動作(これらの値が指定されていない場合)は、計装が以前出力していたバージョンの古いHTTPおよびネットワーク規約を引き続き出力することです。
  • 両方の規約の出力を開始してから少なくとも6か月間は、既存のメジャーバージョンのメンテナンス(最低限セキュリティパッチ)を行う必要があります。
  • 次のメジャーバージョンで環境変数を廃止し、安定版のHTTPおよびネットワーク規約のみを出力することができます。

変更の概要

このセクションでは、HTTPセマンティック規約における v1.20.0 から v1.23.0(安定版) への変更をまとめます。

HTTPクライアントおよびサーバースパンの共通属性

変更コメント
http.methodhttp.request.methodデフォルトで9つの一般的なHTTPメソッドのみをキャプチャするようになりました(設定可能)。加えて _OTHER もキャプチャされます
http.status_codehttp.response.status_code
http.request.header.<key><key> におけるダッシュ ("-") からアンダースコア ("_") への正規化が削除されました
• HTTPサーバースパンの場合:サンプラーに提供する必要があります
http.response.header.<key><key> におけるダッシュ ("-") からアンダースコア ("_") への正規化が削除されました
http.request_content_lengthhttp.request.body.size• Recommended → Opt-In
まだ安定版としてマークされていません
http.response_content_lengthhttp.response.body.size• Recommended → Opt-In
まだ安定版としてマークされていません
user_agent.original• HTTPクライアントスパンの場合:Recommended → Opt-In
• HTTPサーバースパンの場合:サンプラーに提供する必要があります
<= v1.18.0 からの移行の場合は注記を参照してください
net.protocol.namenetwork.protocol.nameRecommended → http ではなく、network.protocol.version が設定されている場合に条件付きで必須
net.protocol.versionnetwork.protocol.version• 例の修正:2.02 および 3.03
<= v1.19.0 からの移行の場合は注記を参照してください
net.sock.family削除
net.sock.peer.addrnetwork.peer.addressHTTPサーバースパンの場合:http.client_ip が不明な場合は net.sock.peer.addrclient.address にもなります。client.address はサンプラーに提供する必要があります
net.sock.peer.portnetwork.peer.portserver.port と同じ場合でもキャプチャされるようになりました
net.sock.peer.name削除
新規:http.request.method_originalhttp.request.method_OTHER の場合にのみキャプチャされます
新規:error.type新規

参考資料:

HTTPクライアントスパン属性

変更コメント
http.urlurl.full
http.resend_counthttp.request.resend_count
net.peer.nameserver.address
net.peer.portserver.portスキームのデフォルトポートと同じ場合でもキャプチャされるようになりました

参考資料:

HTTPサーバースパン属性

変更コメント
http.route変更なし
http.targeturl.path および url.query2つの別々の属性に分割
http.schemeurl.schemeX-Forwarded-ProtoForwarded#proto ヘッダーを考慮するようになりました
http.client_ipclient.addresshttp.client_ip が不明な場合(つまり X-Forwarded-ForForwarded#for ヘッダーがない場合)は net.sock.peer.addrclient.address になります。サンプラーに提供する必要があります
net.host.nameserver.addressHost:authorityX-Forwarded-HostForwarded#host ヘッダーのみに基づくようになりました
net.host.portserver.portHost:authorityX-Forwarded-HostForwarded#host ヘッダーのみに基づくようになりました

参考資料:

HTTPクライアントおよびサーバーのスパン名

スパン名の {http.method} 部分は、{http.method}_OTHER の場合に HTTP に置き換えられます。

<= v1.17.0 からの移行の場合は注記を参照してください。

参考資料:

HTTPクライアント持続時間メトリクス

メトリクスの変更:

  • 名前http.client.durationhttp.client.request.duration
  • 単位mss
  • 説明Measures the duration of inbound HTTP requests.Duration of HTTP server requests.
  • ヒストグラムバケット:ミリ秒から秒への変更を反映してバケット境界が更新され、ゼロバケット境界が削除されました
  • 属性:以下の表を参照
属性の変更コメント
http.methodhttp.request.methodデフォルトで9つの一般的なHTTPメソッドのみをキャプチャするようになりました。加えて _OTHER もキャプチャされます
http.status_codehttp.response.status_code
net.peer.nameserver.address
net.peer.portserver.portスキームのデフォルトポートと同じ場合でもキャプチャされるようになりました
net.sock.peer.addr削除
net.protocol.namenetwork.protocol.nameRecommended → http ではなく、network.protocol.version が設定されている場合に条件付きで必須
net.protocol.versionnetwork.protocol.version例の修正:2.02 および 3.03<= v1.19.0 からの移行の場合は注記を参照してください
新規:error.type新規

参考資料:

HTTPサーバー持続時間メトリクス

メトリクスの変更:

  • 名前http.server.durationhttp.server.request.duration
  • 単位mss
  • 説明Measures the duration of inbound HTTP requests.Duration of HTTP server requests.
  • ヒストグラムバケット:ミリ秒から秒への変更を反映してバケット境界が更新され、ゼロバケット境界が削除されました
  • 属性:以下の表を参照
属性の変更コメント
http.route変更なし
http.methodhttp.request.methodデフォルトで9つの一般的なHTTPメソッドのみをキャプチャするようになりました。加えて _OTHER もキャプチャされます
http.status_codehttp.response.status_code
http.schemeurl.schemeX-Forwarded-Proto spanForwarded#proto span ヘッダーを考慮するようになりました
net.protocol.namenetwork.protocol.nameRecommended → http ではなく、network.protocol.version が設定されている場合に条件付きで必須
net.protocol.versionnetwork.protocol.version例の修正:2.02 および 3.03<= v1.19.0 からの移行の場合は注記を参照してください
net.host.nameserver.address• Recommended → Opt-In(HTTPヘッダーに基づくため、高カーディナリティの脆弱性があります)
Host span:authority spanX-Forwarded-Host spanForwarded#host span ヘッダーのみに基づくようになりました
net.host.portserver.port• Recommended → Opt-In(HTTPヘッダーに基づくため、高カーディナリティの脆弱性があります)
Host span:authority spanX-Forwarded-Host spanForwarded#host span ヘッダーのみに基づくようになりました
新規:error.type新規

参考資料:

v1.20.0 より前のバージョンからの移行

<= v1.19.0 からの移行

  • http.flavornetwork.protocol.version
    • 例の修正:2.02 および 3.03

<= v1.18.0 からの移行

  • http.user_agentuser_agent.original

<= v1.17.0 からの移行

HTTPサーバースパン名

  • http.route が利用可能な場合:
    {http.route}{summary} {http.route}
  • http.route が利用できない場合:
    HTTP {http.method}{summary}

ここで {summary}{http.method} です。 ただし {http.method}_OTHER の場合、{summary}HTTP になります。

HTTPクライアントスパン名

  • HTTP {http.method}{summary}

ここで {summary}{http.method} です。 ただし {http.method}_OTHER の場合、{summary}HTTP になります。

コミュニティへの称賛

これは大規模なコミュニティの取り組みでした。 関わってくださった全員に感謝します! 特に Liudmila Molkova には、HTTPドメインの専門知識を共有し、この取り組みのすべてのステップを推進する上で大きな力となっていただきました。