groups: - id: http prefix: http type: span brief: 'This document defines semantic conventions for HTTP client and server Spans.' note: > These conventions can be used for http and https schemes and various HTTP versions like 1.1, 2 and SPDY. attributes: - id: method type: string requirement_level: required brief: 'HTTP request method.' sampling_relevant: true examples: ["GET", "POST", "HEAD"] - id: status_code type: int requirement_level: conditionally_required: If and only if one was received/sent. brief: '[HTTP response status code](https://tools.ietf.org/html/rfc7231#section-6).' examples: [200] - id: flavor type: # Default value: `true`. If false, it helps the code gen tool to # encode checks that only accept the listed values. allow_custom_values: true members: - id: http_1_0 value: '1.0' brief: 'HTTP/1.0' - id: http_1_1 value: '1.1' brief: 'HTTP/1.1' - id: http_2_0 value: '2.0' brief: 'HTTP/2' - id: http_3_0 value: '3.0' brief: 'HTTP/3' - id: spdy value: 'SPDY' brief: 'SPDY protocol.' - id: quic value: 'QUIC' brief: 'QUIC protocol.' brief: 'Kind of HTTP protocol used.' note: > If `net.transport` is not specified, it can be assumed to be `IP.TCP` except if `http.flavor` is `QUIC`, in which case `IP.UDP` is assumed. - id: user_agent type: string brief: 'Value of the [HTTP User-Agent](https://www.rfc-editor.org/rfc/rfc9110.html#field.user-agent) header sent by the client.' examples: ['CERN-LineMode/2.15 libwww/2.17b3'] - id: request_content_length type: int brief: > The size of the request payload body in bytes. This is the number of bytes transferred excluding headers and is often, but not always, present as the [Content-Length](https://www.rfc-editor.org/rfc/rfc9110.html#field.content-length) header. For requests using transport encoding, this should be the compressed size. examples: 3495 - id: response_content_length type: int brief: > The size of the response payload body in bytes. This is the number of bytes transferred excluding headers and is often, but not always, present as the [Content-Length](https://www.rfc-editor.org/rfc/rfc9110.html#field.content-length) header. For requests using transport encoding, this should be the compressed size. examples: 3495 - ref: net.sock.peer.addr - ref: net.sock.peer.port - ref: net.sock.peer.name - ref: net.sock.family examples: ['inet', 'inet6'] constraints: - include: network - id: http.client prefix: http type: span extends: http span_kind: client brief: 'Semantic Convention for HTTP Client' attributes: - id: url type: string requirement_level: required brief: > Full HTTP request URL in the form `scheme://host[:port]/path?query[#fragment]`. Usually the fragment is not transmitted over HTTP, but if it is known, it should be included nevertheless. note: > `http.url` MUST NOT contain credentials passed via URL in form of `https://username:password@www.example.com/`. In such case the attribute's value should be `https://www.example.com/`. sampling_relevant: true examples: ['https://www.foo.bar/search?q=OpenTelemetry#SemConv'] - ref: net.peer.name requirement_level: required sampling_relevant: true brief: > Host identifier of the ["URI origin"](https://www.rfc-editor.org/rfc/rfc9110.html#name-uri-origin) HTTP request is sent to. note: | Determined by using the first of the following that applies - Host identifier of the [request target](https://www.rfc-editor.org/rfc/rfc9110.html#target.resource) if it's sent in absolute-form - Host identifier of the `Host` header SHOULD NOT be set if capturing it would require an extra DNS lookup. - ref: net.peer.port sampling_relevant: true requirement_level: conditionally_required: If not default (`80` for `http` scheme, `443` for `https`). brief: > Port identifier of the ["URI origin"](https://www.rfc-editor.org/rfc/rfc9110.html#name-uri-origin) HTTP request is sent to. note: > When [request target](https://www.rfc-editor.org/rfc/rfc9110.html#target.resource) is absolute URI, `net.peer.name` MUST match URI port identifier, otherwise it MUST match `Host` header port identifier. - id: resend_count type: int brief: > The ordinal number of request resending attempt (for any reason, including redirects). note: > The resend count SHOULD be updated each time an HTTP request gets resent by the client, regardless of what was the cause of the resending (e.g. redirection, authorization failure, 503 Server Unavailable, network issues, or any other). requirement_level: recommended: if and only if request was retried. examples: 3 - id: http.server prefix: http type: span extends: http span_kind: server brief: 'Semantic Convention for HTTP Server' attributes: - id: scheme type: string brief: 'The URI scheme identifying the used protocol.' requirement_level: required sampling_relevant: true examples: ["http", "https"] - id: target type: string brief: 'The full request target as passed in a HTTP request line or equivalent.' requirement_level: required sampling_relevant: true examples: ['/path/12314/?q=ddds'] - id: route type: string requirement_level: conditionally_required: If and only if it's available brief: > The matched route (path template in the format used by the respective server framework). See note below examples: ['/users/:userID?', '{controller}/{action}/{id?}'] note: > MUST NOT be populated when this is not supported by the HTTP server framework as the route attribute should have low-cardinality and the URI path can NOT substitute it. SHOULD include the [application root](#http-server-definitions) if there is one. - id: client_ip type: string brief: > The IP address of the original client behind all proxies, if known (e.g. from [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For)). note: | This is not necessarily the same as `net.sock.peer.addr`, which would identify the network-level peer, which may be a proxy. This attribute should be set when a source of information different from the one used for `net.sock.peer.addr`, is available even if that other source just confirms the same value as `net.sock.peer.addr`. Rationale: For `net.sock.peer.addr`, one typically does not know if it comes from a proxy, reverse proxy, or the actual client. Setting `http.client_ip` when it's the same as `net.sock.peer.addr` means that one is at least somewhat confident that the address is not that of the closest proxy. examples: '83.164.160.102' - ref: net.host.name requirement_level: required sampling_relevant: true brief: > Name of the local HTTP server that received the request. note: | Determined by using the first of the following that applies - The [primary server name](#http-server-definitions) of the matched virtual host. MUST only include host identifier. - Host identifier of the [request target](https://www.rfc-editor.org/rfc/rfc9110.html#target.resource) if it's sent in absolute-form. - Host identifier of the `Host` header SHOULD NOT be set if only IP address is available and capturing name would require a reverse DNS lookup. - ref: net.host.port sampling_relevant: true requirement_level: conditionally_required: If not default (`80` for `http` scheme, `443` for `https`). brief: > Port of the local HTTP server that received the request. note: | Determined by using the first of the following that applies - Port identifier of the [primary server host](#http-server-definitions) of the matched virtual host. - Port identifier of the [request target](https://www.rfc-editor.org/rfc/rfc9110.html#target.resource) if it's sent in absolute-form. - Port identifier of the `Host` header - ref: net.sock.host.addr requirement_level: optional - ref: net.sock.host.port