From 3f99b33b07abd04dd3ef345b2be4759fb458db14 Mon Sep 17 00:00:00 2001 From: Steve Rao Date: Fri, 16 Jan 2026 10:15:35 +0800 Subject: [PATCH 01/17] Add semantic conventions for Apache Dubbo RPC spans and metrics --- .chloggen/add-dubbo-rpc-semconv.yaml | 22 ++ docs/rpc/README.md | 1 + docs/rpc/dubbo.md | 319 +++++++++++++++++++++++++++ model/rpc/spans.yaml | 86 ++++++++ 4 files changed, 428 insertions(+) create mode 100644 .chloggen/add-dubbo-rpc-semconv.yaml create mode 100644 docs/rpc/dubbo.md diff --git a/.chloggen/add-dubbo-rpc-semconv.yaml b/.chloggen/add-dubbo-rpc-semconv.yaml new file mode 100644 index 0000000000..030f8926a1 --- /dev/null +++ b/.chloggen/add-dubbo-rpc-semconv.yaml @@ -0,0 +1,22 @@ +# Use this changelog template to create an entry for release notes. +# +# If your change doesn't affect end users you should instead start +# your pull request title with [chore] or use the "Skip Changelog" label. + +# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix' +change_type: enhancement + +# The name of the area of concern in the attributes-registry, (e.g. http, cloud, db) +component: rpc + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: Add semantic conventions for Apache Dubbo RPC system. + +# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists. +# The values here must be integers. +issues: [3291] + +# (Optional) One or more lines of additional information to render under the primary note. +# These lines will be padded with 2 spaces and then inserted directly into the document. +# Use pipe (|) for multiline entries. +subtext: diff --git a/docs/rpc/README.md b/docs/rpc/README.md index 9334c0d02b..98b3052a10 100644 --- a/docs/rpc/README.md +++ b/docs/rpc/README.md @@ -43,6 +43,7 @@ Semantic conventions for RPC are defined for the following signals: Technology specific semantic conventions are defined for the following RPC systems: * [Connect](connect-rpc.md): Semantic Conventions for *Connect RPC*. +* [Dubbo](dubbo.md): Semantic Conventions for *Apache Dubbo*. * [gRPC](grpc.md): Semantic Conventions for *gRPC*. * [JSON-RPC](json-rpc.md): Semantic Conventions for *JSON-RPC*. diff --git a/docs/rpc/dubbo.md b/docs/rpc/dubbo.md new file mode 100644 index 0000000000..194f012f50 --- /dev/null +++ b/docs/rpc/dubbo.md @@ -0,0 +1,319 @@ + + +# Semantic conventions for Apache Dubbo + +**Status**: [Development][DocumentStatus] + +The Semantic Conventions for [Apache Dubbo](https://dubbo.apache.org/) extend and override the [RPC spans](rpc-spans.md) and [RPC metrics](rpc-metrics.md) Semantic Conventions +that describe common RPC operations attributes in addition to the Semantic Conventions +described on this page. + +## Client Span + + + + + + +**Status:** ![Development](https://img.shields.io/badge/-development-blue) + +This span represents an outgoing Remote Procedure Call (RPC). + +`rpc.system.name` MUST be set to `"dubbo"` and SHOULD be provided **at span creation time.** + +**Span name:** refer to the [Span Name](/docs/rpc/rpc-spans.md#span-name) section. + +**Span kind** MUST be `CLIENT`. + +**Span status** Refer to the [Recording Errors](/docs/general/recording-errors.md) +document for details on how to record span status. See also `rpc.response.status_code` attribute +for the details on which values classify as errors. + +**Attributes:** + +| Key | Stability | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Value Type | Description | Example Values | +| --- | --- | --- | --- | --- | --- | +| [`rpc.method`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Required` | string | The fully-qualified logical name of the method from the RPC interface perspective. [1] | `com.example.ExampleService/exampleMethod`; `EchoService/Echo`; `_OTHER` | +| [`error.type`](/docs/registry/attributes/error.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If and only if the operation failed. | string | Describes a class of error the operation ended with. [2] | `DEADLINE_EXCEEDED`; `java.net.UnknownHostException`; `-32602` | +| [`rpc.method_original`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` If and only if it's different than `rpc.method`. | string | The original name of the method used by the client. | `com.myservice.EchoService/catchAll`; `com.myservice.EchoService/unknownMethod`; `InvalidMethod` | +| [`rpc.response.status_code`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` if available. | string | The string representation of the [status code](https://dubbo.apache.org/en/overview/reference/protocols/tcp/) returned by the server or generated by the client. [3] | `OK`; `DEADLINE_EXCEEDED`; `-32602` | +| [`server.address`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If available. | string | RPC server [host name](https://grpc.github.io/grpc/core/md_doc_naming.html). [4] | `example.com`; `10.1.2.80`; `/tmp/my.sock` | +| [`server.port`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` [5] | int | Server port number. [6] | `80`; `8080`; `443` | +| [`network.peer.address`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | Peer address of the network connection - IP address or Unix domain socket name. | `10.1.2.80`; `/tmp/my.sock` | +| [`network.peer.port`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` If `network.peer.address` is set. | int | Peer port number of the network connection. | `65123` | +| [`network.protocol.name`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | [OSI application layer](https://wikipedia.org/wiki/Application_layer) or non-OSI equivalent. [7] | `http` | +| [`network.protocol.version`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | The actual version of the protocol used for network communication. [8] | `1.1`; `2` | +| [`network.transport`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | [OSI transport layer](https://wikipedia.org/wiki/Transport_layer) or [inter-process communication method](https://wikipedia.org/wiki/Inter-process_communication). [9] | `tcp`; `udp` | +| [`rpc.request.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC request metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [10] | `["1.2.3.4", "1.2.3.5"]` | +| [`rpc.response.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC response metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [11] | `["attribute_value"]` | + +**[1] `rpc.method`:** The method name MAY have unbounded cardinality in edge or error cases. + +Some RPC frameworks or libraries provide a fixed set of recognized methods +for client stubs and server implementations. Instrumentations for such +frameworks MUST set this attribute to the original method name only +when the method is recognized by the framework or library. + +When the method is not recognized, for example, when the server receives +a request for a method that is not predefined on the server, or when +instrumentation is not able to reliably detect if the method is predefined, +the attribute MUST be set to `_OTHER`. In such cases, tracing +instrumentations MUST also set `rpc.method_original` attribute to +the original method value. + +If the RPC instrumentation could end up converting valid RPC methods to +`_OTHER`, then it SHOULD provide a way to configure the list of recognized +RPC methods. + +The `rpc.method` can be different from the name of any implementing +method/function. +The `code.function.name` attribute may be used to record the fully-qualified +method actually executing the call on the server side, or the +RPC client stub method on the client side. + +**[2] `error.type`:** If the RPC fails with an error before status code is returned, +`error.type` SHOULD be set to the exception type (its fully-qualified class name, if applicable) +or a component-specific, low cardinality error identifier. + +If a response status code is returned and status indicates an error, +`error.type` SHOULD be set to that status code. Check system-specific conventions +for the details on which values of `rpc.response.status_code` are considered errors. + +The `error.type` value SHOULD be predictable and SHOULD have low cardinality. +Instrumentations SHOULD document the list of errors they report. + +If the request has completed successfully, instrumentations SHOULD NOT set +`error.type`. + +**[3] `rpc.response.status_code`:** Dubbo protocol uses numeric status codes. +Any status code other than `20` (OK) SHOULD be considered an error. + +Common status codes include: + +- `20` - OK +- `30` - CLIENT_TIMEOUT +- `31` - SERVER_TIMEOUT +- `40` - BAD_REQUEST +- `50` - BAD_RESPONSE +- `60` - SERVICE_NOT_FOUND +- `70` - SERVICE_ERROR +- `80` - SERVER_ERROR +- `90` - CLIENT_ERROR +- `100` - SERVER_THREADPOOL_EXHAUSTED_ERROR + +**[4] `server.address`:** May contain server IP address, DNS name, or local socket name. When host component is an IP address, instrumentations SHOULD NOT do a reverse proxy lookup to obtain DNS name and SHOULD set `server.address` to the IP address provided in the host component. + +**[5] `server.port`:** if `server.address` is set and if the port is supported by the network transport used for communication. + +**[6] `server.port`:** When observed from the client side, and when communicating through an intermediary, `server.port` SHOULD represent the server port behind any intermediaries, for example proxies, if it's available. + +**[7] `network.protocol.name`:** The value SHOULD be normalized to lowercase. + +**[8] `network.protocol.version`:** If protocol version is subject to negotiation (for example using [ALPN](https://www.rfc-editor.org/rfc/rfc7301.html)), this attribute SHOULD be set to the negotiated version. If the actual protocol version is not known, this attribute SHOULD NOT be set. + +**[9] `network.transport`:** The value SHOULD be normalized to lowercase. + +Consider always setting the transport when setting a port number, since +a port number is ambiguous without knowing the transport. For example +different processes could be listening on TCP port 12345 and UDP port 12345. + +**[10] `rpc.request.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. +Including all request metadata values can be a security risk - explicit configuration helps avoid leaking sensitive information. + +For example, a property `my-custom-key` with value `["1.2.3.4", "1.2.3.5"]` SHOULD be recorded as +`rpc.request.metadata.my-custom-key` attribute with value `["1.2.3.4", "1.2.3.5"]` + +**[11] `rpc.response.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. +Including all response metadata values can be a security risk - explicit configuration helps avoid leaking sensitive information. + +For example, a property `my-custom-key` with value `["attribute_value"]` SHOULD be recorded as +the `rpc.response.metadata.my-custom-key` attribute with value `["attribute_value"]` + +The following attributes can be important for making sampling decisions +and SHOULD be provided **at span creation time** (if provided at all): + +* [`rpc.method`](/docs/registry/attributes/rpc.md) +* [`server.address`](/docs/registry/attributes/server.md) +* [`server.port`](/docs/registry/attributes/server.md) + +--- + +`error.type` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used. + +| Value | Description | Stability | +| --- | --- | --- | +| `_OTHER` | A fallback error value to be used when the instrumentation doesn't define a custom value. | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | + +--- + +`network.transport` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used. + +| Value | Description | Stability | +| --- | --- | --- | +| `pipe` | Named or anonymous 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 domain socket | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | + + + + + +## Server Span + + + + + + +**Status:** ![Development](https://img.shields.io/badge/-development-blue) + +This span represents an incoming Remote Procedure Call (RPC). + +`rpc.system.name` MUST be set to `"dubbo"` and SHOULD be provided **at span creation time.** + +**Span name:** refer to the [Span Name](/docs/rpc/rpc-spans.md#span-name) section. + +**Span kind** MUST be `SERVER`. + +**Span status** Refer to the [Recording Errors](/docs/general/recording-errors.md) +document for details on how to record span status. See also `rpc.response.status_code` attribute +for the details on which values classify as errors. + +**Attributes:** + +| Key | Stability | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Value Type | Description | Example Values | +| --- | --- | --- | --- | --- | --- | +| [`error.type`](/docs/registry/attributes/error.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If and only if the operation failed. | string | Describes a class of error the operation ended with. [1] | `DEADLINE_EXCEEDED`; `java.net.UnknownHostException`; `-32602` | +| [`rpc.method`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` if available. | string | The fully-qualified logical name of the method from the RPC interface perspective. [2] | `com.example.ExampleService/exampleMethod`; `EchoService/Echo`; `_OTHER` | +| [`rpc.method_original`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` If and only if it's different than `rpc.method`. | string | The original name of the method used by the client. | `com.myservice.EchoService/catchAll`; `com.myservice.EchoService/unknownMethod`; `InvalidMethod` | +| [`rpc.response.status_code`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` if available. | string | The string representation of the [status code](https://dubbo.apache.org/en/overview/reference/protocols/tcp/) returned by the server. [3] | `OK`; `DEADLINE_EXCEEDED`; `-32602` | +| [`server.address`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If available. | string | RPC server [host name](https://grpc.github.io/grpc/core/md_doc_naming.html). [4] | `example.com`; `10.1.2.80`; `/tmp/my.sock` | +| [`server.port`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` [5] | int | Server port number. [6] | `80`; `8080`; `443` | +| [`client.address`](/docs/registry/attributes/client.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | Client address - domain name if available without reverse DNS lookup; otherwise, IP address or Unix domain socket name. [7] | `client.example.com`; `10.1.2.80`; `/tmp/my.sock` | +| [`client.port`](/docs/registry/attributes/client.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | int | Client port number. [8] | `65123` | +| [`network.peer.address`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | Peer address of the network connection - IP address or Unix domain socket name. | `10.1.2.80`; `/tmp/my.sock` | +| [`network.peer.port`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` If `network.peer.address` is set. | int | Peer port number of the network connection. | `65123` | +| [`network.protocol.name`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | [OSI application layer](https://wikipedia.org/wiki/Application_layer) or non-OSI equivalent. [9] | `http` | +| [`network.protocol.version`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | The actual version of the protocol used for network communication. [10] | `1.1`; `2` | +| [`network.transport`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | [OSI transport layer](https://wikipedia.org/wiki/Transport_layer) or [inter-process communication method](https://wikipedia.org/wiki/Inter-process_communication). [11] | `tcp`; `udp` | +| [`rpc.request.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC request metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [12] | `["1.2.3.4", "1.2.3.5"]` | +| [`rpc.response.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC response metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [13] | `["attribute_value"]` | + +**[1] `error.type`:** If the RPC fails with an error before status code is returned, +`error.type` SHOULD be set to the exception type (its fully-qualified class name, if applicable) +or a component-specific, low cardinality error identifier. + +If a response status code is returned and status indicates an error, +`error.type` SHOULD be set to that status code. Check system-specific conventions +for the details on which values of `rpc.response.status_code` are considered errors. + +The `error.type` value SHOULD be predictable and SHOULD have low cardinality. +Instrumentations SHOULD document the list of errors they report. + +If the request has completed successfully, instrumentations SHOULD NOT set +`error.type`. + +**[2] `rpc.method`:** The method name MAY have unbounded cardinality in edge or error cases. + +Some RPC frameworks or libraries provide a fixed set of recognized methods +for client stubs and server implementations. Instrumentations for such +frameworks MUST set this attribute to the original method name only +when the method is recognized by the framework or library. + +When the method is not recognized, for example, when the server receives +a request for a method that is not predefined on the server, or when +instrumentation is not able to reliably detect if the method is predefined, +the attribute MUST be set to `_OTHER`. In such cases, tracing +instrumentations MUST also set `rpc.method_original` attribute to +the original method value. + +If the RPC instrumentation could end up converting valid RPC methods to +`_OTHER`, then it SHOULD provide a way to configure the list of recognized +RPC methods. + +The `rpc.method` can be different from the name of any implementing +method/function. +The `code.function.name` attribute may be used to record the fully-qualified +method actually executing the call on the server side, or the +RPC client stub method on the client side. + +**[3] `rpc.response.status_code`:** The following status codes SHOULD be considered errors: + +- `30` - CLIENT_TIMEOUT +- `31` - SERVER_TIMEOUT +- `40` - BAD_REQUEST +- `50` - BAD_RESPONSE +- `60` - SERVICE_NOT_FOUND +- `70` - SERVICE_ERROR +- `80` - SERVER_ERROR +- `90` - CLIENT_ERROR +- `100` - SERVER_THREADPOOL_EXHAUSTED_ERROR + +**[4] `server.address`:** May contain server IP address, DNS name, or local socket name. When host component is an IP address, instrumentations SHOULD NOT do a reverse proxy lookup to obtain DNS name and SHOULD set `server.address` to the IP address provided in the host component. + +**[5] `server.port`:** if `server.address` is set and if the port is supported by the network transport used for communication. + +**[6] `server.port`:** When observed from the client side, and when communicating through an intermediary, `server.port` SHOULD represent the server port behind any intermediaries, for example proxies, if it's available. + +**[7] `client.address`:** When observed from the server side, and when communicating through an intermediary, `client.address` SHOULD represent the client address behind any intermediaries, for example proxies, if it's available. + +**[8] `client.port`:** When observed from the server side, and when communicating through an intermediary, `client.port` SHOULD represent the client port behind any intermediaries, for example proxies, if it's available. + +**[9] `network.protocol.name`:** The value SHOULD be normalized to lowercase. + +**[10] `network.protocol.version`:** If protocol version is subject to negotiation (for example using [ALPN](https://www.rfc-editor.org/rfc/rfc7301.html)), this attribute SHOULD be set to the negotiated version. If the actual protocol version is not known, this attribute SHOULD NOT be set. + +**[11] `network.transport`:** The value SHOULD be normalized to lowercase. + +Consider always setting the transport when setting a port number, since +a port number is ambiguous without knowing the transport. For example +different processes could be listening on TCP port 12345 and UDP port 12345. + +**[12] `rpc.request.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. +Including all request metadata values can be a security risk - explicit configuration helps avoid leaking sensitive information. + +For example, a property `my-custom-key` with value `["1.2.3.4", "1.2.3.5"]` SHOULD be recorded as +`rpc.request.metadata.my-custom-key` attribute with value `["1.2.3.4", "1.2.3.5"]` + +**[13] `rpc.response.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. +Including all response metadata values can be a security risk - explicit configuration helps avoid leaking sensitive information. + +For example, a property `my-custom-key` with value `["attribute_value"]` SHOULD be recorded as +the `rpc.response.metadata.my-custom-key` attribute with value `["attribute_value"]` + +The following attributes can be important for making sampling decisions +and SHOULD be provided **at span creation time** (if provided at all): + +* [`rpc.method`](/docs/registry/attributes/rpc.md) +* [`server.address`](/docs/registry/attributes/server.md) +* [`server.port`](/docs/registry/attributes/server.md) + +--- + +`error.type` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used. + +| Value | Description | Stability | +| --- | --- | --- | +| `_OTHER` | A fallback error value to be used when the instrumentation doesn't define a custom value. | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | + +--- + +`network.transport` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used. + +| Value | Description | Stability | +| --- | --- | --- | +| `pipe` | Named or anonymous 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 domain socket | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | + + + + + +[DocumentStatus]: https://opentelemetry.io/docs/specs/otel/document-status diff --git a/model/rpc/spans.yaml b/model/rpc/spans.yaml index a47ee307e3..c22e4fea77 100644 --- a/model/rpc/spans.yaml +++ b/model/rpc/spans.yaml @@ -303,3 +303,89 @@ groups: All JSON RPC error codes SHOULD be considered errors. requirement_level: conditionally_required: when available + + - id: span.rpc.dubbo.call.client + type: span + stability: development + brief: This span represents an outgoing Remote Procedure Call (RPC). + note: | + `rpc.system.name` MUST be set to `"dubbo"` and SHOULD be provided **at span creation time.** + + **Span name:** refer to the [Span Name](/docs/rpc/rpc-spans.md#span-name) section. + + **Span kind** MUST be `CLIENT`. + + **Span status** Refer to the [Recording Errors](/docs/general/recording-errors.md) + document for details on how to record span status. See also `rpc.response.status_code` attribute + for the details on which values classify as errors. + extends: rpc + span_kind: client + attributes: + - ref: rpc.method + requirement_level: required + - ref: rpc.response.status_code + requirement_level: + conditionally_required: if available. + brief: > + The string representation of the [status code](https://dubbo.apache.org/en/overview/reference/protocols/tcp/) + returned by the server or generated by the client. + note: | + Dubbo protocol uses numeric status codes. + Any status code other than `20` (OK) SHOULD be considered an error. + + Common status codes include: + + - `20` - OK + - `30` - CLIENT_TIMEOUT + - `31` - SERVER_TIMEOUT + - `40` - BAD_REQUEST + - `50` - BAD_RESPONSE + - `60` - SERVICE_NOT_FOUND + - `70` - SERVICE_ERROR + - `80` - SERVER_ERROR + - `90` - CLIENT_ERROR + - `100` - SERVER_THREADPOOL_EXHAUSTED_ERROR + - ref: rpc.request.metadata + requirement_level: opt_in + - ref: rpc.response.metadata + requirement_level: opt_in + + - id: span.rpc.dubbo.call.server + type: span + stability: development + extends: rpc.server + span_kind: server + brief: This span represents an incoming Remote Procedure Call (RPC). + note: | + `rpc.system.name` MUST be set to `"dubbo"` and SHOULD be provided **at span creation time.** + + **Span name:** refer to the [Span Name](/docs/rpc/rpc-spans.md#span-name) section. + + **Span kind** MUST be `SERVER`. + + **Span status** Refer to the [Recording Errors](/docs/general/recording-errors.md) + document for details on how to record span status. See also `rpc.response.status_code` attribute + for the details on which values classify as errors. + attributes: + - ref: rpc.response.status_code + requirement_level: + conditionally_required: if available. + brief: > + The string representation of the [status code](https://dubbo.apache.org/en/overview/reference/protocols/tcp/) + returned by the server. + note: | + The following status codes SHOULD be considered errors: + + - `30` - CLIENT_TIMEOUT + - `31` - SERVER_TIMEOUT + - `40` - BAD_REQUEST + - `50` - BAD_RESPONSE + - `60` - SERVICE_NOT_FOUND + - `70` - SERVICE_ERROR + - `80` - SERVER_ERROR + - `90` - CLIENT_ERROR + - `100` - SERVER_THREADPOOL_EXHAUSTED_ERROR + - ref: rpc.request.metadata + requirement_level: opt_in + - ref: rpc.response.metadata + requirement_level: opt_in From 5579bd08c8a84a60bec1a1c2b29647bffce22e89 Mon Sep 17 00:00:00 2001 From: Steve Rao Date: Wed, 21 Jan 2026 22:14:52 +0800 Subject: [PATCH 02/17] Refine RPC status code documentation and remove deprecated metadata references --- docs/rpc/dubbo.md | 44 +++++--------------------------------------- model/rpc/spans.yaml | 24 +++++------------------- 2 files changed, 10 insertions(+), 58 deletions(-) diff --git a/docs/rpc/dubbo.md b/docs/rpc/dubbo.md index 194f012f50..8a4522fe1a 100644 --- a/docs/rpc/dubbo.md +++ b/docs/rpc/dubbo.md @@ -46,8 +46,6 @@ for the details on which values classify as errors. | [`network.protocol.name`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | [OSI application layer](https://wikipedia.org/wiki/Application_layer) or non-OSI equivalent. [7] | `http` | | [`network.protocol.version`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | The actual version of the protocol used for network communication. [8] | `1.1`; `2` | | [`network.transport`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | [OSI transport layer](https://wikipedia.org/wiki/Transport_layer) or [inter-process communication method](https://wikipedia.org/wiki/Inter-process_communication). [9] | `tcp`; `udp` | -| [`rpc.request.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC request metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [10] | `["1.2.3.4", "1.2.3.5"]` | -| [`rpc.response.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC response metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [11] | `["attribute_value"]` | **[1] `rpc.method`:** The method name MAY have unbounded cardinality in edge or error cases. @@ -90,18 +88,15 @@ If the request has completed successfully, instrumentations SHOULD NOT set **[3] `rpc.response.status_code`:** Dubbo protocol uses numeric status codes. Any status code other than `20` (OK) SHOULD be considered an error. -Common status codes include: +Client-side status codes: - `20` - OK - `30` - CLIENT_TIMEOUT -- `31` - SERVER_TIMEOUT -- `40` - BAD_REQUEST - `50` - BAD_RESPONSE -- `60` - SERVICE_NOT_FOUND -- `70` - SERVICE_ERROR -- `80` - SERVER_ERROR - `90` - CLIENT_ERROR -- `100` - SERVER_THREADPOOL_EXHAUSTED_ERROR + +The client may also receive server-side status codes (31, 40, 60, 70, 80, 100) +when the server encounters an error. **[4] `server.address`:** May contain server IP address, DNS name, or local socket name. When host component is an IP address, instrumentations SHOULD NOT do a reverse proxy lookup to obtain DNS name and SHOULD set `server.address` to the IP address provided in the host component. @@ -119,18 +114,6 @@ Consider always setting the transport when setting a port number, since a port number is ambiguous without knowing the transport. For example different processes could be listening on TCP port 12345 and UDP port 12345. -**[10] `rpc.request.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. -Including all request metadata values can be a security risk - explicit configuration helps avoid leaking sensitive information. - -For example, a property `my-custom-key` with value `["1.2.3.4", "1.2.3.5"]` SHOULD be recorded as -`rpc.request.metadata.my-custom-key` attribute with value `["1.2.3.4", "1.2.3.5"]` - -**[11] `rpc.response.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. -Including all response metadata values can be a security risk - explicit configuration helps avoid leaking sensitive information. - -For example, a property `my-custom-key` with value `["attribute_value"]` SHOULD be recorded as -the `rpc.response.metadata.my-custom-key` attribute with value `["attribute_value"]` - The following attributes can be important for making sampling decisions and SHOULD be provided **at span creation time** (if provided at all): @@ -200,8 +183,6 @@ for the details on which values classify as errors. | [`network.protocol.name`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | [OSI application layer](https://wikipedia.org/wiki/Application_layer) or non-OSI equivalent. [9] | `http` | | [`network.protocol.version`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | The actual version of the protocol used for network communication. [10] | `1.1`; `2` | | [`network.transport`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | [OSI transport layer](https://wikipedia.org/wiki/Transport_layer) or [inter-process communication method](https://wikipedia.org/wiki/Inter-process_communication). [11] | `tcp`; `udp` | -| [`rpc.request.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC request metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [12] | `["1.2.3.4", "1.2.3.5"]` | -| [`rpc.response.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC response metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [13] | `["attribute_value"]` | **[1] `error.type`:** If the RPC fails with an error before status code is returned, `error.type` SHOULD be set to the exception type (its fully-qualified class name, if applicable) @@ -241,16 +222,13 @@ The `code.function.name` attribute may be used to record the fully-qualified method actually executing the call on the server side, or the RPC client stub method on the client side. -**[3] `rpc.response.status_code`:** The following status codes SHOULD be considered errors: +**[3] `rpc.response.status_code`:** Server-side status codes that SHOULD be considered errors: -- `30` - CLIENT_TIMEOUT - `31` - SERVER_TIMEOUT - `40` - BAD_REQUEST -- `50` - BAD_RESPONSE - `60` - SERVICE_NOT_FOUND - `70` - SERVICE_ERROR - `80` - SERVER_ERROR -- `90` - CLIENT_ERROR - `100` - SERVER_THREADPOOL_EXHAUSTED_ERROR **[4] `server.address`:** May contain server IP address, DNS name, or local socket name. When host component is an IP address, instrumentations SHOULD NOT do a reverse proxy lookup to obtain DNS name and SHOULD set `server.address` to the IP address provided in the host component. @@ -273,18 +251,6 @@ Consider always setting the transport when setting a port number, since a port number is ambiguous without knowing the transport. For example different processes could be listening on TCP port 12345 and UDP port 12345. -**[12] `rpc.request.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. -Including all request metadata values can be a security risk - explicit configuration helps avoid leaking sensitive information. - -For example, a property `my-custom-key` with value `["1.2.3.4", "1.2.3.5"]` SHOULD be recorded as -`rpc.request.metadata.my-custom-key` attribute with value `["1.2.3.4", "1.2.3.5"]` - -**[13] `rpc.response.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. -Including all response metadata values can be a security risk - explicit configuration helps avoid leaking sensitive information. - -For example, a property `my-custom-key` with value `["attribute_value"]` SHOULD be recorded as -the `rpc.response.metadata.my-custom-key` attribute with value `["attribute_value"]` - The following attributes can be important for making sampling decisions and SHOULD be provided **at span creation time** (if provided at all): diff --git a/model/rpc/spans.yaml b/model/rpc/spans.yaml index c22e4fea77..aa933d8ed2 100644 --- a/model/rpc/spans.yaml +++ b/model/rpc/spans.yaml @@ -333,22 +333,15 @@ groups: Dubbo protocol uses numeric status codes. Any status code other than `20` (OK) SHOULD be considered an error. - Common status codes include: + Client-side status codes: - `20` - OK - `30` - CLIENT_TIMEOUT - - `31` - SERVER_TIMEOUT - - `40` - BAD_REQUEST - `50` - BAD_RESPONSE - - `60` - SERVICE_NOT_FOUND - - `70` - SERVICE_ERROR - - `80` - SERVER_ERROR - `90` - CLIENT_ERROR - - `100` - SERVER_THREADPOOL_EXHAUSTED_ERROR - - ref: rpc.request.metadata - requirement_level: opt_in - - ref: rpc.response.metadata - requirement_level: opt_in + + The client may also receive server-side status codes (31, 40, 60, 70, 80, 100) + when the server encounters an error. - id: span.rpc.dubbo.call.server type: span @@ -374,18 +367,11 @@ groups: The string representation of the [status code](https://dubbo.apache.org/en/overview/reference/protocols/tcp/) returned by the server. note: | - The following status codes SHOULD be considered errors: + Server-side status codes that SHOULD be considered errors: - - `30` - CLIENT_TIMEOUT - `31` - SERVER_TIMEOUT - `40` - BAD_REQUEST - - `50` - BAD_RESPONSE - `60` - SERVICE_NOT_FOUND - `70` - SERVICE_ERROR - `80` - SERVER_ERROR - - `90` - CLIENT_ERROR - `100` - SERVER_THREADPOOL_EXHAUSTED_ERROR - - ref: rpc.request.metadata - requirement_level: opt_in - - ref: rpc.response.metadata - requirement_level: opt_in From 3f1acafa92047fc345ed63f34de254d8c3a8981f Mon Sep 17 00:00:00 2001 From: Steve Rao Date: Sun, 25 Jan 2026 20:07:02 +0800 Subject: [PATCH 03/17] Update RPC status code documentation and examples for Dubbo2 and Dubbo3 --- docs/rpc/dubbo.md | 86 +++++++++++++++++++++++++++++--------------- model/rpc/spans.yaml | 74 +++++++++++++++++++++++++++----------- 2 files changed, 111 insertions(+), 49 deletions(-) diff --git a/docs/rpc/dubbo.md b/docs/rpc/dubbo.md index 8a4522fe1a..32fb26a7cc 100644 --- a/docs/rpc/dubbo.md +++ b/docs/rpc/dubbo.md @@ -38,14 +38,16 @@ for the details on which values classify as errors. | [`rpc.method`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Required` | string | The fully-qualified logical name of the method from the RPC interface perspective. [1] | `com.example.ExampleService/exampleMethod`; `EchoService/Echo`; `_OTHER` | | [`error.type`](/docs/registry/attributes/error.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If and only if the operation failed. | string | Describes a class of error the operation ended with. [2] | `DEADLINE_EXCEEDED`; `java.net.UnknownHostException`; `-32602` | | [`rpc.method_original`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` If and only if it's different than `rpc.method`. | string | The original name of the method used by the client. | `com.myservice.EchoService/catchAll`; `com.myservice.EchoService/unknownMethod`; `InvalidMethod` | -| [`rpc.response.status_code`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` if available. | string | The string representation of the [status code](https://dubbo.apache.org/en/overview/reference/protocols/tcp/) returned by the server or generated by the client. [3] | `OK`; `DEADLINE_EXCEEDED`; `-32602` | +| [`rpc.response.status_code`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` if available. | string | The string representation of the [status code](https://dubbo.apache.org/en/overview/reference/protocols/) returned by the server or generated by the client. [3] | `20`; `31`; `100` | | [`server.address`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If available. | string | RPC server [host name](https://grpc.github.io/grpc/core/md_doc_naming.html). [4] | `example.com`; `10.1.2.80`; `/tmp/my.sock` | | [`server.port`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` [5] | int | Server port number. [6] | `80`; `8080`; `443` | | [`network.peer.address`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | Peer address of the network connection - IP address or Unix domain socket name. | `10.1.2.80`; `/tmp/my.sock` | | [`network.peer.port`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` If `network.peer.address` is set. | int | Peer port number of the network connection. | `65123` | -| [`network.protocol.name`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | [OSI application layer](https://wikipedia.org/wiki/Application_layer) or non-OSI equivalent. [7] | `http` | -| [`network.protocol.version`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | The actual version of the protocol used for network communication. [8] | `1.1`; `2` | +| [`network.protocol.name`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | [OSI application layer](https://wikipedia.org/wiki/Application_layer) or non-OSI equivalent. [7] | `dubbo`; `http` | +| [`network.protocol.version`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | The actual version of the protocol used for network communication. [8] | `2` | | [`network.transport`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | [OSI transport layer](https://wikipedia.org/wiki/Transport_layer) or [inter-process communication method](https://wikipedia.org/wiki/Inter-process_communication). [9] | `tcp`; `udp` | +| [`rpc.request.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC request metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [10] | `["1.2.3.4", "1.2.3.5"]` | +| [`rpc.response.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC response metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [11] | `["attribute_value"]` | **[1] `rpc.method`:** The method name MAY have unbounded cardinality in edge or error cases. @@ -85,18 +87,9 @@ Instrumentations SHOULD document the list of errors they report. If the request has completed successfully, instrumentations SHOULD NOT set `error.type`. -**[3] `rpc.response.status_code`:** Dubbo protocol uses numeric status codes. -Any status code other than `20` (OK) SHOULD be considered an error. +**[3] `rpc.response.status_code`:** For Dubbo2, any status code other than `20` SHOULD be considered an error. -Client-side status codes: - -- `20` - OK -- `30` - CLIENT_TIMEOUT -- `50` - BAD_RESPONSE -- `90` - CLIENT_ERROR - -The client may also receive server-side status codes (31, 40, 60, 70, 80, 100) -when the server encounters an error. +For Dubbo3 Triple protocol, all status codes except `OK` SHOULD be considered errors. **[4] `server.address`:** May contain server IP address, DNS name, or local socket name. When host component is an IP address, instrumentations SHOULD NOT do a reverse proxy lookup to obtain DNS name and SHOULD set `server.address` to the IP address provided in the host component. @@ -104,9 +97,11 @@ when the server encounters an error. **[6] `server.port`:** When observed from the client side, and when communicating through an intermediary, `server.port` SHOULD represent the server port behind any intermediaries, for example proxies, if it's available. -**[7] `network.protocol.name`:** The value SHOULD be normalized to lowercase. +**[7] `network.protocol.name`:** For Dubbo2, this value is typically `dubbo`. +For Dubbo3 Triple protocol, this value is `http` as Triple is built on HTTP/2. -**[8] `network.protocol.version`:** If protocol version is subject to negotiation (for example using [ALPN](https://www.rfc-editor.org/rfc/rfc7301.html)), this attribute SHOULD be set to the negotiated version. If the actual protocol version is not known, this attribute SHOULD NOT be set. +**[8] `network.protocol.version`:** For Dubbo2 using the dubbo protocol, this value is typically not set or set to `2`. +For Dubbo3 Triple protocol over HTTP/2, this value is `2`. **[9] `network.transport`:** The value SHOULD be normalized to lowercase. @@ -114,6 +109,18 @@ Consider always setting the transport when setting a port number, since a port number is ambiguous without knowing the transport. For example different processes could be listening on TCP port 12345 and UDP port 12345. +**[10] `rpc.request.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. +Including all request metadata values can be a security risk - explicit configuration helps avoid leaking sensitive information. + +For example, a property `my-custom-key` with value `["1.2.3.4", "1.2.3.5"]` SHOULD be recorded as +`rpc.request.metadata.my-custom-key` attribute with value `["1.2.3.4", "1.2.3.5"]` + +**[11] `rpc.response.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. +Including all response metadata values can be a security risk - explicit configuration helps avoid leaking sensitive information. + +For example, a property `my-custom-key` with value `["attribute_value"]` SHOULD be recorded as +the `rpc.response.metadata.my-custom-key` attribute with value `["attribute_value"]` + The following attributes can be important for making sampling decisions and SHOULD be provided **at span creation time** (if provided at all): @@ -173,16 +180,18 @@ for the details on which values classify as errors. | [`error.type`](/docs/registry/attributes/error.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If and only if the operation failed. | string | Describes a class of error the operation ended with. [1] | `DEADLINE_EXCEEDED`; `java.net.UnknownHostException`; `-32602` | | [`rpc.method`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` if available. | string | The fully-qualified logical name of the method from the RPC interface perspective. [2] | `com.example.ExampleService/exampleMethod`; `EchoService/Echo`; `_OTHER` | | [`rpc.method_original`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` If and only if it's different than `rpc.method`. | string | The original name of the method used by the client. | `com.myservice.EchoService/catchAll`; `com.myservice.EchoService/unknownMethod`; `InvalidMethod` | -| [`rpc.response.status_code`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` if available. | string | The string representation of the [status code](https://dubbo.apache.org/en/overview/reference/protocols/tcp/) returned by the server. [3] | `OK`; `DEADLINE_EXCEEDED`; `-32602` | +| [`rpc.response.status_code`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` if available. | string | The string representation of the [status code](https://dubbo.apache.org/en/overview/reference/protocols/) returned by the server. [3] | `20`; `80`; `100` | | [`server.address`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If available. | string | RPC server [host name](https://grpc.github.io/grpc/core/md_doc_naming.html). [4] | `example.com`; `10.1.2.80`; `/tmp/my.sock` | | [`server.port`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` [5] | int | Server port number. [6] | `80`; `8080`; `443` | | [`client.address`](/docs/registry/attributes/client.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | Client address - domain name if available without reverse DNS lookup; otherwise, IP address or Unix domain socket name. [7] | `client.example.com`; `10.1.2.80`; `/tmp/my.sock` | | [`client.port`](/docs/registry/attributes/client.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | int | Client port number. [8] | `65123` | | [`network.peer.address`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | Peer address of the network connection - IP address or Unix domain socket name. | `10.1.2.80`; `/tmp/my.sock` | | [`network.peer.port`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` If `network.peer.address` is set. | int | Peer port number of the network connection. | `65123` | -| [`network.protocol.name`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | [OSI application layer](https://wikipedia.org/wiki/Application_layer) or non-OSI equivalent. [9] | `http` | -| [`network.protocol.version`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | The actual version of the protocol used for network communication. [10] | `1.1`; `2` | +| [`network.protocol.name`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | [OSI application layer](https://wikipedia.org/wiki/Application_layer) or non-OSI equivalent. [9] | `dubbo`; `http` | +| [`network.protocol.version`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | The actual version of the protocol used for network communication. [10] | `2` | | [`network.transport`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | [OSI transport layer](https://wikipedia.org/wiki/Transport_layer) or [inter-process communication method](https://wikipedia.org/wiki/Inter-process_communication). [11] | `tcp`; `udp` | +| [`rpc.request.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC request metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [12] | `["1.2.3.4", "1.2.3.5"]` | +| [`rpc.response.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC response metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [13] | `["attribute_value"]` | **[1] `error.type`:** If the RPC fails with an error before status code is returned, `error.type` SHOULD be set to the exception type (its fully-qualified class name, if applicable) @@ -222,14 +231,21 @@ The `code.function.name` attribute may be used to record the fully-qualified method actually executing the call on the server side, or the RPC client stub method on the client side. -**[3] `rpc.response.status_code`:** Server-side status codes that SHOULD be considered errors: +**[3] `rpc.response.status_code`:** For Dubbo2, the following status codes SHOULD be considered errors: -- `31` - SERVER_TIMEOUT -- `40` - BAD_REQUEST -- `60` - SERVICE_NOT_FOUND -- `70` - SERVICE_ERROR -- `80` - SERVER_ERROR -- `100` - SERVER_THREADPOOL_EXHAUSTED_ERROR +- `31` - `SERVER_TIMEOUT` +- `70` - `SERVICE_ERROR` +- `80` - `SERVER_ERROR` +- `100` - `SERVER_THREADPOOL_EXHAUSTED_ERROR` + +For Dubbo3 Triple protocol, the following status codes SHOULD be considered errors: + +- `UNKNOWN` +- `DEADLINE_EXCEEDED` +- `UNIMPLEMENTED` +- `INTERNAL` +- `UNAVAILABLE` +- `DATA_LOSS` **[4] `server.address`:** May contain server IP address, DNS name, or local socket name. When host component is an IP address, instrumentations SHOULD NOT do a reverse proxy lookup to obtain DNS name and SHOULD set `server.address` to the IP address provided in the host component. @@ -241,9 +257,11 @@ RPC client stub method on the client side. **[8] `client.port`:** When observed from the server side, and when communicating through an intermediary, `client.port` SHOULD represent the client port behind any intermediaries, for example proxies, if it's available. -**[9] `network.protocol.name`:** The value SHOULD be normalized to lowercase. +**[9] `network.protocol.name`:** For Dubbo2, this value is typically `dubbo`. +For Dubbo3 Triple protocol, this value is `http` as Triple is built on HTTP/2. -**[10] `network.protocol.version`:** If protocol version is subject to negotiation (for example using [ALPN](https://www.rfc-editor.org/rfc/rfc7301.html)), this attribute SHOULD be set to the negotiated version. If the actual protocol version is not known, this attribute SHOULD NOT be set. +**[10] `network.protocol.version`:** For Dubbo2 using the dubbo protocol, this value is typically not set or set to `2`. +For Dubbo3 Triple protocol over HTTP/2, this value is `2`. **[11] `network.transport`:** The value SHOULD be normalized to lowercase. @@ -251,6 +269,18 @@ Consider always setting the transport when setting a port number, since a port number is ambiguous without knowing the transport. For example different processes could be listening on TCP port 12345 and UDP port 12345. +**[12] `rpc.request.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. +Including all request metadata values can be a security risk - explicit configuration helps avoid leaking sensitive information. + +For example, a property `my-custom-key` with value `["1.2.3.4", "1.2.3.5"]` SHOULD be recorded as +`rpc.request.metadata.my-custom-key` attribute with value `["1.2.3.4", "1.2.3.5"]` + +**[13] `rpc.response.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. +Including all response metadata values can be a security risk - explicit configuration helps avoid leaking sensitive information. + +For example, a property `my-custom-key` with value `["attribute_value"]` SHOULD be recorded as +the `rpc.response.metadata.my-custom-key` attribute with value `["attribute_value"]` + The following attributes can be important for making sampling decisions and SHOULD be provided **at span creation time** (if provided at all): diff --git a/model/rpc/spans.yaml b/model/rpc/spans.yaml index aa933d8ed2..a4ae6e28a9 100644 --- a/model/rpc/spans.yaml +++ b/model/rpc/spans.yaml @@ -327,21 +327,29 @@ groups: requirement_level: conditionally_required: if available. brief: > - The string representation of the [status code](https://dubbo.apache.org/en/overview/reference/protocols/tcp/) + The string representation of the [status code](https://dubbo.apache.org/en/overview/reference/protocols/) returned by the server or generated by the client. + examples: ['20', '31', '100'] note: | - Dubbo protocol uses numeric status codes. - Any status code other than `20` (OK) SHOULD be considered an error. + For Dubbo2, any status code other than `20` SHOULD be considered an error. - Client-side status codes: - - - `20` - OK - - `30` - CLIENT_TIMEOUT - - `50` - BAD_RESPONSE - - `90` - CLIENT_ERROR - - The client may also receive server-side status codes (31, 40, 60, 70, 80, 100) - when the server encounters an error. + For Dubbo3 Triple protocol, all status codes except `OK` SHOULD be considered errors. + - ref: network.protocol.name + requirement_level: recommended + examples: ['dubbo', 'http'] + note: | + For Dubbo2, this value is typically `dubbo`. + For Dubbo3 Triple protocol, this value is `http` as Triple is built on HTTP/2. + - ref: network.protocol.version + requirement_level: recommended + examples: ['2'] + note: | + For Dubbo2 using the dubbo protocol, this value is typically not set or set to `2`. + For Dubbo3 Triple protocol over HTTP/2, this value is `2`. + - ref: rpc.request.metadata + requirement_level: opt_in + - ref: rpc.response.metadata + requirement_level: opt_in - id: span.rpc.dubbo.call.server type: span @@ -364,14 +372,38 @@ groups: requirement_level: conditionally_required: if available. brief: > - The string representation of the [status code](https://dubbo.apache.org/en/overview/reference/protocols/tcp/) + The string representation of the [status code](https://dubbo.apache.org/en/overview/reference/protocols/) returned by the server. + examples: ['20', '80', '100'] note: | - Server-side status codes that SHOULD be considered errors: - - - `31` - SERVER_TIMEOUT - - `40` - BAD_REQUEST - - `60` - SERVICE_NOT_FOUND - - `70` - SERVICE_ERROR - - `80` - SERVER_ERROR - - `100` - SERVER_THREADPOOL_EXHAUSTED_ERROR + For Dubbo2, the following status codes SHOULD be considered errors: + + - `31` - `SERVER_TIMEOUT` + - `70` - `SERVICE_ERROR` + - `80` - `SERVER_ERROR` + - `100` - `SERVER_THREADPOOL_EXHAUSTED_ERROR` + + For Dubbo3 Triple protocol, the following status codes SHOULD be considered errors: + + - `UNKNOWN` + - `DEADLINE_EXCEEDED` + - `UNIMPLEMENTED` + - `INTERNAL` + - `UNAVAILABLE` + - `DATA_LOSS` + - ref: network.protocol.name + requirement_level: recommended + examples: ['dubbo', 'http'] + note: | + For Dubbo2, this value is typically `dubbo`. + For Dubbo3 Triple protocol, this value is `http` as Triple is built on HTTP/2. + - ref: network.protocol.version + requirement_level: recommended + examples: ['2'] + note: | + For Dubbo2 using the dubbo protocol, this value is typically not set or set to `2`. + For Dubbo3 Triple protocol over HTTP/2, this value is `2`. + - ref: rpc.request.metadata + requirement_level: opt_in + - ref: rpc.response.metadata + requirement_level: opt_in From fdc0db00959d20e929e9a7fb50bd6d75f6cca886 Mon Sep 17 00:00:00 2001 From: Steve Rao Date: Mon, 26 Jan 2026 23:55:31 +0800 Subject: [PATCH 04/17] Update documentation for Dubbo response status codes and add references --- docs/rpc/dubbo.md | 12 ++++++++++-- model/rpc/spans.yaml | 14 ++++++++++---- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/docs/rpc/dubbo.md b/docs/rpc/dubbo.md index 32fb26a7cc..424c5f288e 100644 --- a/docs/rpc/dubbo.md +++ b/docs/rpc/dubbo.md @@ -38,7 +38,7 @@ for the details on which values classify as errors. | [`rpc.method`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Required` | string | The fully-qualified logical name of the method from the RPC interface perspective. [1] | `com.example.ExampleService/exampleMethod`; `EchoService/Echo`; `_OTHER` | | [`error.type`](/docs/registry/attributes/error.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If and only if the operation failed. | string | Describes a class of error the operation ended with. [2] | `DEADLINE_EXCEEDED`; `java.net.UnknownHostException`; `-32602` | | [`rpc.method_original`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` If and only if it's different than `rpc.method`. | string | The original name of the method used by the client. | `com.myservice.EchoService/catchAll`; `com.myservice.EchoService/unknownMethod`; `InvalidMethod` | -| [`rpc.response.status_code`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` if available. | string | The string representation of the [status code](https://dubbo.apache.org/en/overview/reference/protocols/) returned by the server or generated by the client. [3] | `20`; `31`; `100` | +| [`rpc.response.status_code`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` if available. | string | Dubbo response status code returned by the server or generated by the client. [3] | `20`; `31`; `100` | | [`server.address`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If available. | string | RPC server [host name](https://grpc.github.io/grpc/core/md_doc_naming.html). [4] | `example.com`; `10.1.2.80`; `/tmp/my.sock` | | [`server.port`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` [5] | int | Server port number. [6] | `80`; `8080`; `443` | | [`network.peer.address`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | Peer address of the network connection - IP address or Unix domain socket name. | `10.1.2.80`; `/tmp/my.sock` | @@ -91,6 +91,10 @@ If the request has completed successfully, instrumentations SHOULD NOT set For Dubbo3 Triple protocol, all status codes except `OK` SHOULD be considered errors. +Status codes reference: +- Dubbo2: [Dubbo2 Protocol Status Codes](https://dubbo.apache.org/en/overview/reference/protocols/tcp/#protocol-specification) +- Dubbo3: [Triple Protocol Error Codes](https://dubbo.apache.org/en/overview/reference/protocols/triple-spec/#311-request) + **[4] `server.address`:** May contain server IP address, DNS name, or local socket name. When host component is an IP address, instrumentations SHOULD NOT do a reverse proxy lookup to obtain DNS name and SHOULD set `server.address` to the IP address provided in the host component. **[5] `server.port`:** if `server.address` is set and if the port is supported by the network transport used for communication. @@ -180,7 +184,7 @@ for the details on which values classify as errors. | [`error.type`](/docs/registry/attributes/error.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If and only if the operation failed. | string | Describes a class of error the operation ended with. [1] | `DEADLINE_EXCEEDED`; `java.net.UnknownHostException`; `-32602` | | [`rpc.method`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` if available. | string | The fully-qualified logical name of the method from the RPC interface perspective. [2] | `com.example.ExampleService/exampleMethod`; `EchoService/Echo`; `_OTHER` | | [`rpc.method_original`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` If and only if it's different than `rpc.method`. | string | The original name of the method used by the client. | `com.myservice.EchoService/catchAll`; `com.myservice.EchoService/unknownMethod`; `InvalidMethod` | -| [`rpc.response.status_code`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` if available. | string | The string representation of the [status code](https://dubbo.apache.org/en/overview/reference/protocols/) returned by the server. [3] | `20`; `80`; `100` | +| [`rpc.response.status_code`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` if available. | string | Dubbo response status code returned by the server. [3] | `20`; `80`; `100` | | [`server.address`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If available. | string | RPC server [host name](https://grpc.github.io/grpc/core/md_doc_naming.html). [4] | `example.com`; `10.1.2.80`; `/tmp/my.sock` | | [`server.port`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` [5] | int | Server port number. [6] | `80`; `8080`; `443` | | [`client.address`](/docs/registry/attributes/client.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | Client address - domain name if available without reverse DNS lookup; otherwise, IP address or Unix domain socket name. [7] | `client.example.com`; `10.1.2.80`; `/tmp/my.sock` | @@ -247,6 +251,10 @@ For Dubbo3 Triple protocol, the following status codes SHOULD be considered erro - `UNAVAILABLE` - `DATA_LOSS` +Status codes reference: +- Dubbo2: [Dubbo2 Protocol Status Codes](https://dubbo.apache.org/en/overview/reference/protocols/tcp/#protocol-specification) +- Dubbo3: [Triple Protocol Error Codes](https://dubbo.apache.org/en/overview/reference/protocols/triple-spec/#311-request) + **[4] `server.address`:** May contain server IP address, DNS name, or local socket name. When host component is an IP address, instrumentations SHOULD NOT do a reverse proxy lookup to obtain DNS name and SHOULD set `server.address` to the IP address provided in the host component. **[5] `server.port`:** if `server.address` is set and if the port is supported by the network transport used for communication. diff --git a/model/rpc/spans.yaml b/model/rpc/spans.yaml index a4ae6e28a9..7a6dd65c7e 100644 --- a/model/rpc/spans.yaml +++ b/model/rpc/spans.yaml @@ -327,13 +327,16 @@ groups: requirement_level: conditionally_required: if available. brief: > - The string representation of the [status code](https://dubbo.apache.org/en/overview/reference/protocols/) - returned by the server or generated by the client. + Dubbo response status code returned by the server or generated by the client. examples: ['20', '31', '100'] note: | For Dubbo2, any status code other than `20` SHOULD be considered an error. For Dubbo3 Triple protocol, all status codes except `OK` SHOULD be considered errors. + + Status codes reference: + - Dubbo2: [Dubbo2 Protocol Status Codes](https://dubbo.apache.org/en/overview/reference/protocols/tcp/#protocol-specification) + - Dubbo3: [Triple Protocol Error Codes](https://dubbo.apache.org/en/overview/reference/protocols/triple-spec/#311-request) - ref: network.protocol.name requirement_level: recommended examples: ['dubbo', 'http'] @@ -372,8 +375,7 @@ groups: requirement_level: conditionally_required: if available. brief: > - The string representation of the [status code](https://dubbo.apache.org/en/overview/reference/protocols/) - returned by the server. + Dubbo response status code returned by the server. examples: ['20', '80', '100'] note: | For Dubbo2, the following status codes SHOULD be considered errors: @@ -391,6 +393,10 @@ groups: - `INTERNAL` - `UNAVAILABLE` - `DATA_LOSS` + + Status codes reference: + - Dubbo2: [Dubbo2 Protocol Status Codes](https://dubbo.apache.org/en/overview/reference/protocols/tcp/#protocol-specification) + - Dubbo3: [Triple Protocol Error Codes](https://dubbo.apache.org/en/overview/reference/protocols/triple-spec/#311-request) - ref: network.protocol.name requirement_level: recommended examples: ['dubbo', 'http'] From e2761e73e0fcd8b74d141742b826ec85bbe5be5a Mon Sep 17 00:00:00 2001 From: Steve Rao Date: Tue, 27 Jan 2026 00:05:23 +0800 Subject: [PATCH 05/17] Add missing line breaks in status codes reference sections for clarity --- docs/rpc/dubbo.md | 2 ++ model/rpc/spans.yaml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/docs/rpc/dubbo.md b/docs/rpc/dubbo.md index 424c5f288e..f4a97b5b8d 100644 --- a/docs/rpc/dubbo.md +++ b/docs/rpc/dubbo.md @@ -92,6 +92,7 @@ If the request has completed successfully, instrumentations SHOULD NOT set For Dubbo3 Triple protocol, all status codes except `OK` SHOULD be considered errors. Status codes reference: + - Dubbo2: [Dubbo2 Protocol Status Codes](https://dubbo.apache.org/en/overview/reference/protocols/tcp/#protocol-specification) - Dubbo3: [Triple Protocol Error Codes](https://dubbo.apache.org/en/overview/reference/protocols/triple-spec/#311-request) @@ -252,6 +253,7 @@ For Dubbo3 Triple protocol, the following status codes SHOULD be considered erro - `DATA_LOSS` Status codes reference: + - Dubbo2: [Dubbo2 Protocol Status Codes](https://dubbo.apache.org/en/overview/reference/protocols/tcp/#protocol-specification) - Dubbo3: [Triple Protocol Error Codes](https://dubbo.apache.org/en/overview/reference/protocols/triple-spec/#311-request) diff --git a/model/rpc/spans.yaml b/model/rpc/spans.yaml index 7a6dd65c7e..182c1fb8d1 100644 --- a/model/rpc/spans.yaml +++ b/model/rpc/spans.yaml @@ -335,6 +335,7 @@ groups: For Dubbo3 Triple protocol, all status codes except `OK` SHOULD be considered errors. Status codes reference: + - Dubbo2: [Dubbo2 Protocol Status Codes](https://dubbo.apache.org/en/overview/reference/protocols/tcp/#protocol-specification) - Dubbo3: [Triple Protocol Error Codes](https://dubbo.apache.org/en/overview/reference/protocols/triple-spec/#311-request) - ref: network.protocol.name @@ -395,6 +396,7 @@ groups: - `DATA_LOSS` Status codes reference: + - Dubbo2: [Dubbo2 Protocol Status Codes](https://dubbo.apache.org/en/overview/reference/protocols/tcp/#protocol-specification) - Dubbo3: [Triple Protocol Error Codes](https://dubbo.apache.org/en/overview/reference/protocols/triple-spec/#311-request) - ref: network.protocol.name From 921448bf6fa8b608d4656fba01c8160fccdad1b2 Mon Sep 17 00:00:00 2001 From: Steve Rao Date: Wed, 4 Feb 2026 21:48:28 +0800 Subject: [PATCH 06/17] Update Dubbo response status code examples and documentation for clarity --- docs/rpc/dubbo.md | 65 +++++++++++++++++++++++++++----------------- model/rpc/spans.yaml | 43 ++++++++++++++++++++++++----- 2 files changed, 76 insertions(+), 32 deletions(-) diff --git a/docs/rpc/dubbo.md b/docs/rpc/dubbo.md index f4a97b5b8d..7d25ac3aba 100644 --- a/docs/rpc/dubbo.md +++ b/docs/rpc/dubbo.md @@ -38,16 +38,16 @@ for the details on which values classify as errors. | [`rpc.method`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Required` | string | The fully-qualified logical name of the method from the RPC interface perspective. [1] | `com.example.ExampleService/exampleMethod`; `EchoService/Echo`; `_OTHER` | | [`error.type`](/docs/registry/attributes/error.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If and only if the operation failed. | string | Describes a class of error the operation ended with. [2] | `DEADLINE_EXCEEDED`; `java.net.UnknownHostException`; `-32602` | | [`rpc.method_original`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` If and only if it's different than `rpc.method`. | string | The original name of the method used by the client. | `com.myservice.EchoService/catchAll`; `com.myservice.EchoService/unknownMethod`; `InvalidMethod` | -| [`rpc.response.status_code`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` if available. | string | Dubbo response status code returned by the server or generated by the client. [3] | `20`; `31`; `100` | -| [`server.address`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If available. | string | RPC server [host name](https://grpc.github.io/grpc/core/md_doc_naming.html). [4] | `example.com`; `10.1.2.80`; `/tmp/my.sock` | -| [`server.port`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` [5] | int | Server port number. [6] | `80`; `8080`; `443` | +| [`rpc.response.status_code`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` if available. | string | Dubbo response status code returned by the server or generated by the client. [3] | `OK`; `DEADLINE_EXCEEDED`; `SERVER_ERROR` | +| [`server.address`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If available. | string | RPC server [host name](https://grpc.github.io/grpc/core/md_doc_naming.html). [4] | `192.168.1.100`; `api.example.com` | | [`network.peer.address`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | Peer address of the network connection - IP address or Unix domain socket name. | `10.1.2.80`; `/tmp/my.sock` | | [`network.peer.port`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` If `network.peer.address` is set. | int | Peer port number of the network connection. | `65123` | -| [`network.protocol.name`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | [OSI application layer](https://wikipedia.org/wiki/Application_layer) or non-OSI equivalent. [7] | `dubbo`; `http` | -| [`network.protocol.version`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | The actual version of the protocol used for network communication. [8] | `2` | -| [`network.transport`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | [OSI transport layer](https://wikipedia.org/wiki/Transport_layer) or [inter-process communication method](https://wikipedia.org/wiki/Inter-process_communication). [9] | `tcp`; `udp` | -| [`rpc.request.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC request metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [10] | `["1.2.3.4", "1.2.3.5"]` | -| [`rpc.response.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC response metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [11] | `["attribute_value"]` | +| [`network.protocol.name`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | [OSI application layer](https://wikipedia.org/wiki/Application_layer) or non-OSI equivalent. [5] | `dubbo`; `http` | +| [`network.protocol.version`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | The actual version of the protocol used for network communication. [6] | `2` | +| [`network.transport`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | [OSI transport layer](https://wikipedia.org/wiki/Transport_layer) or [inter-process communication method](https://wikipedia.org/wiki/Inter-process_communication). [7] | `tcp`; `udp` | +| [`server.port`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` If `server.address` is set. | int | Server port number. [8] | `20880`; `50051` | +| [`rpc.request.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC request metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [9] | `["1.2.3.4", "1.2.3.5"]` | +| [`rpc.response.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC response metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [10] | `["attribute_value"]` | **[1] `rpc.method`:** The method name MAY have unbounded cardinality in edge or error cases. @@ -87,7 +87,7 @@ Instrumentations SHOULD document the list of errors they report. If the request has completed successfully, instrumentations SHOULD NOT set `error.type`. -**[3] `rpc.response.status_code`:** For Dubbo2, any status code other than `20` SHOULD be considered an error. +**[3] `rpc.response.status_code`:** For Dubbo2, any status code other than `OK` SHOULD be considered an error. For Dubbo3 Triple protocol, all status codes except `OK` SHOULD be considered errors. @@ -96,31 +96,46 @@ Status codes reference: - Dubbo2: [Dubbo2 Protocol Status Codes](https://dubbo.apache.org/en/overview/reference/protocols/tcp/#protocol-specification) - Dubbo3: [Triple Protocol Error Codes](https://dubbo.apache.org/en/overview/reference/protocols/triple-spec/#311-request) -**[4] `server.address`:** May contain server IP address, DNS name, or local socket name. When host component is an IP address, instrumentations SHOULD NOT do a reverse proxy lookup to obtain DNS name and SHOULD set `server.address` to the IP address provided in the host component. - -**[5] `server.port`:** if `server.address` is set and if the port is supported by the network transport used for communication. - -**[6] `server.port`:** When observed from the client side, and when communicating through an intermediary, `server.port` SHOULD represent the server port behind any intermediaries, for example proxies, if it's available. - -**[7] `network.protocol.name`:** For Dubbo2, this value is typically `dubbo`. +**[4] `server.address`:** Instrumentations SHOULD populate `server.address` (along with `server.port`) +based on the configuration used when creating the Dubbo client and +SHOULD NOT use actual network-level connection information for this purpose +to ensure low cardinality. + +- Given the target URL `dubbo://192.168.1.100:20880/com.example.DemoService`, expected attributes: + - `server.address`: `"192.168.1.100"` + - `server.port`: `20880` +- Given the target URL `tri://api.example.com:50051/com.example.GreeterService`, expected attributes: + - `server.address`: `"api.example.com"` + - `server.port`: `50051` +- Given the target URL `tri://api.example.com/com.example.GreeterService` (port not specified), expected attributes: + - `server.address`: `"api.example.com"` + - `server.port`: not set + +When the address is an IP address, instrumentations SHOULD NOT do a +reverse proxy lookup to obtain a DNS name and SHOULD set `server.address` +to the IP address provided. + +**[5] `network.protocol.name`:** For Dubbo2, this value is typically `dubbo`. For Dubbo3 Triple protocol, this value is `http` as Triple is built on HTTP/2. -**[8] `network.protocol.version`:** For Dubbo2 using the dubbo protocol, this value is typically not set or set to `2`. +**[6] `network.protocol.version`:** For Dubbo2 using the dubbo protocol, this value is typically not set or set to `2`. For Dubbo3 Triple protocol over HTTP/2, this value is `2`. -**[9] `network.transport`:** The value SHOULD be normalized to lowercase. +**[7] `network.transport`:** The value SHOULD be normalized to lowercase. Consider always setting the transport when setting a port number, since a port number is ambiguous without knowing the transport. For example different processes could be listening on TCP port 12345 and UDP port 12345. -**[10] `rpc.request.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. +**[8] `server.port`:** See the `server.address` for details on parsing the target string. + +**[9] `rpc.request.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. Including all request metadata values can be a security risk - explicit configuration helps avoid leaking sensitive information. For example, a property `my-custom-key` with value `["1.2.3.4", "1.2.3.5"]` SHOULD be recorded as `rpc.request.metadata.my-custom-key` attribute with value `["1.2.3.4", "1.2.3.5"]` -**[11] `rpc.response.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. +**[10] `rpc.response.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. Including all response metadata values can be a security risk - explicit configuration helps avoid leaking sensitive information. For example, a property `my-custom-key` with value `["attribute_value"]` SHOULD be recorded as @@ -185,7 +200,7 @@ for the details on which values classify as errors. | [`error.type`](/docs/registry/attributes/error.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If and only if the operation failed. | string | Describes a class of error the operation ended with. [1] | `DEADLINE_EXCEEDED`; `java.net.UnknownHostException`; `-32602` | | [`rpc.method`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` if available. | string | The fully-qualified logical name of the method from the RPC interface perspective. [2] | `com.example.ExampleService/exampleMethod`; `EchoService/Echo`; `_OTHER` | | [`rpc.method_original`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` If and only if it's different than `rpc.method`. | string | The original name of the method used by the client. | `com.myservice.EchoService/catchAll`; `com.myservice.EchoService/unknownMethod`; `InvalidMethod` | -| [`rpc.response.status_code`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` if available. | string | Dubbo response status code returned by the server. [3] | `20`; `80`; `100` | +| [`rpc.response.status_code`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` if available. | string | Dubbo response status code returned by the server. [3] | `OK`; `SERVER_ERROR`; `SERVER_THREADPOOL_EXHAUSTED_ERROR` | | [`server.address`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If available. | string | RPC server [host name](https://grpc.github.io/grpc/core/md_doc_naming.html). [4] | `example.com`; `10.1.2.80`; `/tmp/my.sock` | | [`server.port`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` [5] | int | Server port number. [6] | `80`; `8080`; `443` | | [`client.address`](/docs/registry/attributes/client.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | Client address - domain name if available without reverse DNS lookup; otherwise, IP address or Unix domain socket name. [7] | `client.example.com`; `10.1.2.80`; `/tmp/my.sock` | @@ -238,10 +253,10 @@ RPC client stub method on the client side. **[3] `rpc.response.status_code`:** For Dubbo2, the following status codes SHOULD be considered errors: -- `31` - `SERVER_TIMEOUT` -- `70` - `SERVICE_ERROR` -- `80` - `SERVER_ERROR` -- `100` - `SERVER_THREADPOOL_EXHAUSTED_ERROR` +- `SERVER_TIMEOUT` +- `SERVICE_ERROR` +- `SERVER_ERROR` +- `SERVER_THREADPOOL_EXHAUSTED_ERROR` For Dubbo3 Triple protocol, the following status codes SHOULD be considered errors: diff --git a/model/rpc/spans.yaml b/model/rpc/spans.yaml index 182c1fb8d1..d6b9fd33d2 100644 --- a/model/rpc/spans.yaml +++ b/model/rpc/spans.yaml @@ -328,9 +328,9 @@ groups: conditionally_required: if available. brief: > Dubbo response status code returned by the server or generated by the client. - examples: ['20', '31', '100'] + examples: ['OK', 'DEADLINE_EXCEEDED', 'SERVER_ERROR'] note: | - For Dubbo2, any status code other than `20` SHOULD be considered an error. + For Dubbo2, any status code other than `OK` SHOULD be considered an error. For Dubbo3 Triple protocol, all status codes except `OK` SHOULD be considered errors. @@ -350,6 +350,35 @@ groups: note: | For Dubbo2 using the dubbo protocol, this value is typically not set or set to `2`. For Dubbo3 Triple protocol over HTTP/2, this value is `2`. + - ref: server.address + requirement_level: + conditionally_required: If available. + examples: ['192.168.1.100', 'api.example.com'] + note: | + Instrumentations SHOULD populate `server.address` (along with `server.port`) + based on the configuration used when creating the Dubbo client and + SHOULD NOT use actual network-level connection information for this purpose + to ensure low cardinality. + + - Given the target URL `dubbo://192.168.1.100:20880/com.example.DemoService`, expected attributes: + - `server.address`: `"192.168.1.100"` + - `server.port`: `20880` + - Given the target URL `tri://api.example.com:50051/com.example.GreeterService`, expected attributes: + - `server.address`: `"api.example.com"` + - `server.port`: `50051` + - Given the target URL `tri://api.example.com/com.example.GreeterService` (port not specified), expected attributes: + - `server.address`: `"api.example.com"` + - `server.port`: not set + + When the address is an IP address, instrumentations SHOULD NOT do a + reverse proxy lookup to obtain a DNS name and SHOULD set `server.address` + to the IP address provided. + - ref: server.port + requirement_level: + recommended: If `server.address` is set. + examples: [20880, 50051] + note: > + See the `server.address` for details on parsing the target string. - ref: rpc.request.metadata requirement_level: opt_in - ref: rpc.response.metadata @@ -377,14 +406,14 @@ groups: conditionally_required: if available. brief: > Dubbo response status code returned by the server. - examples: ['20', '80', '100'] + examples: ['OK', 'SERVER_ERROR', 'SERVER_THREADPOOL_EXHAUSTED_ERROR'] note: | For Dubbo2, the following status codes SHOULD be considered errors: - - `31` - `SERVER_TIMEOUT` - - `70` - `SERVICE_ERROR` - - `80` - `SERVER_ERROR` - - `100` - `SERVER_THREADPOOL_EXHAUSTED_ERROR` + - `SERVER_TIMEOUT` + - `SERVICE_ERROR` + - `SERVER_ERROR` + - `SERVER_THREADPOOL_EXHAUSTED_ERROR` For Dubbo3 Triple protocol, the following status codes SHOULD be considered errors: From 1b72bb7682950ba7487bc4fead64b1121f97d09e Mon Sep 17 00:00:00 2001 From: Steve Rao Date: Thu, 5 Feb 2026 08:03:47 +0800 Subject: [PATCH 07/17] Refactor Dubbo documentation to improve clarity and structure, including updates to spans and metrics sections --- docs/rpc/dubbo.md | 96 ++++++++++++++------------------------------ model/rpc/spans.yaml | 24 ----------- 2 files changed, 30 insertions(+), 90 deletions(-) diff --git a/docs/rpc/dubbo.md b/docs/rpc/dubbo.md index 7d25ac3aba..2f8cf88aed 100644 --- a/docs/rpc/dubbo.md +++ b/docs/rpc/dubbo.md @@ -6,11 +6,22 @@ linkTitle: Dubbo **Status**: [Development][DocumentStatus] + + +- [Spans](#spans) + - [Client](#client) + - [Server](#server) +- [Metrics](#metrics) + + + The Semantic Conventions for [Apache Dubbo](https://dubbo.apache.org/) extend and override the [RPC spans](rpc-spans.md) and [RPC metrics](rpc-metrics.md) Semantic Conventions that describe common RPC operations attributes in addition to the Semantic Conventions described on this page. -## Client Span +## Spans + +### Client @@ -42,12 +53,9 @@ for the details on which values classify as errors. | [`server.address`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If available. | string | RPC server [host name](https://grpc.github.io/grpc/core/md_doc_naming.html). [4] | `192.168.1.100`; `api.example.com` | | [`network.peer.address`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | Peer address of the network connection - IP address or Unix domain socket name. | `10.1.2.80`; `/tmp/my.sock` | | [`network.peer.port`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` If `network.peer.address` is set. | int | Peer port number of the network connection. | `65123` | -| [`network.protocol.name`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | [OSI application layer](https://wikipedia.org/wiki/Application_layer) or non-OSI equivalent. [5] | `dubbo`; `http` | -| [`network.protocol.version`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | The actual version of the protocol used for network communication. [6] | `2` | -| [`network.transport`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | [OSI transport layer](https://wikipedia.org/wiki/Transport_layer) or [inter-process communication method](https://wikipedia.org/wiki/Inter-process_communication). [7] | `tcp`; `udp` | -| [`server.port`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` If `server.address` is set. | int | Server port number. [8] | `20880`; `50051` | -| [`rpc.request.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC request metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [9] | `["1.2.3.4", "1.2.3.5"]` | -| [`rpc.response.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC response metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [10] | `["attribute_value"]` | +| [`server.port`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` If `server.address` is set. | int | Server port number. [5] | `20880`; `50051` | +| [`rpc.request.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC request metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [6] | `["1.2.3.4", "1.2.3.5"]` | +| [`rpc.response.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC response metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [7] | `["attribute_value"]` | **[1] `rpc.method`:** The method name MAY have unbounded cardinality in edge or error cases. @@ -115,27 +123,15 @@ When the address is an IP address, instrumentations SHOULD NOT do a reverse proxy lookup to obtain a DNS name and SHOULD set `server.address` to the IP address provided. -**[5] `network.protocol.name`:** For Dubbo2, this value is typically `dubbo`. -For Dubbo3 Triple protocol, this value is `http` as Triple is built on HTTP/2. - -**[6] `network.protocol.version`:** For Dubbo2 using the dubbo protocol, this value is typically not set or set to `2`. -For Dubbo3 Triple protocol over HTTP/2, this value is `2`. - -**[7] `network.transport`:** The value SHOULD be normalized to lowercase. - -Consider always setting the transport when setting a port number, since -a port number is ambiguous without knowing the transport. For example -different processes could be listening on TCP port 12345 and UDP port 12345. +**[5] `server.port`:** See the `server.address` for details on parsing the target string. -**[8] `server.port`:** See the `server.address` for details on parsing the target string. - -**[9] `rpc.request.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. +**[6] `rpc.request.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. Including all request metadata values can be a security risk - explicit configuration helps avoid leaking sensitive information. For example, a property `my-custom-key` with value `["1.2.3.4", "1.2.3.5"]` SHOULD be recorded as `rpc.request.metadata.my-custom-key` attribute with value `["1.2.3.4", "1.2.3.5"]` -**[10] `rpc.response.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. +**[7] `rpc.response.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. Including all response metadata values can be a security risk - explicit configuration helps avoid leaking sensitive information. For example, a property `my-custom-key` with value `["attribute_value"]` SHOULD be recorded as @@ -156,23 +152,11 @@ and SHOULD be provided **at span creation time** (if provided at all): | --- | --- | --- | | `_OTHER` | A fallback error value to be used when the instrumentation doesn't define a custom value. | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | ---- - -`network.transport` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used. - -| Value | Description | Stability | -| --- | --- | --- | -| `pipe` | Named or anonymous 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 domain socket | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | - -## Server Span +### Server @@ -207,11 +191,8 @@ for the details on which values classify as errors. | [`client.port`](/docs/registry/attributes/client.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | int | Client port number. [8] | `65123` | | [`network.peer.address`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | Peer address of the network connection - IP address or Unix domain socket name. | `10.1.2.80`; `/tmp/my.sock` | | [`network.peer.port`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` If `network.peer.address` is set. | int | Peer port number of the network connection. | `65123` | -| [`network.protocol.name`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | [OSI application layer](https://wikipedia.org/wiki/Application_layer) or non-OSI equivalent. [9] | `dubbo`; `http` | -| [`network.protocol.version`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | The actual version of the protocol used for network communication. [10] | `2` | -| [`network.transport`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | [OSI transport layer](https://wikipedia.org/wiki/Transport_layer) or [inter-process communication method](https://wikipedia.org/wiki/Inter-process_communication). [11] | `tcp`; `udp` | -| [`rpc.request.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC request metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [12] | `["1.2.3.4", "1.2.3.5"]` | -| [`rpc.response.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC response metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [13] | `["attribute_value"]` | +| [`rpc.request.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC request metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [9] | `["1.2.3.4", "1.2.3.5"]` | +| [`rpc.response.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC response metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [10] | `["attribute_value"]` | **[1] `error.type`:** If the RPC fails with an error before status code is returned, `error.type` SHOULD be set to the exception type (its fully-qualified class name, if applicable) @@ -282,25 +263,13 @@ Status codes reference: **[8] `client.port`:** When observed from the server side, and when communicating through an intermediary, `client.port` SHOULD represent the client port behind any intermediaries, for example proxies, if it's available. -**[9] `network.protocol.name`:** For Dubbo2, this value is typically `dubbo`. -For Dubbo3 Triple protocol, this value is `http` as Triple is built on HTTP/2. - -**[10] `network.protocol.version`:** For Dubbo2 using the dubbo protocol, this value is typically not set or set to `2`. -For Dubbo3 Triple protocol over HTTP/2, this value is `2`. - -**[11] `network.transport`:** The value SHOULD be normalized to lowercase. - -Consider always setting the transport when setting a port number, since -a port number is ambiguous without knowing the transport. For example -different processes could be listening on TCP port 12345 and UDP port 12345. - -**[12] `rpc.request.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. +**[9] `rpc.request.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. Including all request metadata values can be a security risk - explicit configuration helps avoid leaking sensitive information. For example, a property `my-custom-key` with value `["1.2.3.4", "1.2.3.5"]` SHOULD be recorded as `rpc.request.metadata.my-custom-key` attribute with value `["1.2.3.4", "1.2.3.5"]` -**[13] `rpc.response.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. +**[10] `rpc.response.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. Including all response metadata values can be a security risk - explicit configuration helps avoid leaking sensitive information. For example, a property `my-custom-key` with value `["attribute_value"]` SHOULD be recorded as @@ -321,20 +290,15 @@ and SHOULD be provided **at span creation time** (if provided at all): | --- | --- | --- | | `_OTHER` | A fallback error value to be used when the instrumentation doesn't define a custom value. | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | ---- - -`network.transport` has the following list of well-known values. If one of them applies, then the respective value MUST be used; otherwise, a custom value MAY be used. - -| Value | Description | Stability | -| --- | --- | --- | -| `pipe` | Named or anonymous 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 domain socket | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | - +## Metrics + +Dubbo instrumentations SHOULD collect metrics according to the general +[Semantic Conventions for RPC Metrics](/docs/rpc/rpc-metrics.md). + +`rpc.system.name` MUST be set to `"dubbo"`. + [DocumentStatus]: https://opentelemetry.io/docs/specs/otel/document-status diff --git a/model/rpc/spans.yaml b/model/rpc/spans.yaml index 0d2a78729f..5dac1ebfa6 100644 --- a/model/rpc/spans.yaml +++ b/model/rpc/spans.yaml @@ -338,18 +338,6 @@ groups: - Dubbo2: [Dubbo2 Protocol Status Codes](https://dubbo.apache.org/en/overview/reference/protocols/tcp/#protocol-specification) - Dubbo3: [Triple Protocol Error Codes](https://dubbo.apache.org/en/overview/reference/protocols/triple-spec/#311-request) - - ref: network.protocol.name - requirement_level: recommended - examples: ['dubbo', 'http'] - note: | - For Dubbo2, this value is typically `dubbo`. - For Dubbo3 Triple protocol, this value is `http` as Triple is built on HTTP/2. - - ref: network.protocol.version - requirement_level: recommended - examples: ['2'] - note: | - For Dubbo2 using the dubbo protocol, this value is typically not set or set to `2`. - For Dubbo3 Triple protocol over HTTP/2, this value is `2`. - ref: server.address requirement_level: conditionally_required: If available. @@ -428,18 +416,6 @@ groups: - Dubbo2: [Dubbo2 Protocol Status Codes](https://dubbo.apache.org/en/overview/reference/protocols/tcp/#protocol-specification) - Dubbo3: [Triple Protocol Error Codes](https://dubbo.apache.org/en/overview/reference/protocols/triple-spec/#311-request) - - ref: network.protocol.name - requirement_level: recommended - examples: ['dubbo', 'http'] - note: | - For Dubbo2, this value is typically `dubbo`. - For Dubbo3 Triple protocol, this value is `http` as Triple is built on HTTP/2. - - ref: network.protocol.version - requirement_level: recommended - examples: ['2'] - note: | - For Dubbo2 using the dubbo protocol, this value is typically not set or set to `2`. - For Dubbo3 Triple protocol over HTTP/2, this value is `2`. - ref: rpc.request.metadata requirement_level: opt_in - ref: rpc.response.metadata From 67fb18156e9c972f59c29678dda6cf6214e9e196 Mon Sep 17 00:00:00 2001 From: Steve Rao Date: Thu, 5 Feb 2026 09:54:47 +0800 Subject: [PATCH 08/17] Clarify documentation for Dubbo response status codes, specifying string representation and updating references --- docs/rpc/dubbo.md | 11 +++++++---- model/rpc/spans.yaml | 11 +++++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/docs/rpc/dubbo.md b/docs/rpc/dubbo.md index 2f8cf88aed..db17e8d37d 100644 --- a/docs/rpc/dubbo.md +++ b/docs/rpc/dubbo.md @@ -49,7 +49,7 @@ for the details on which values classify as errors. | [`rpc.method`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Required` | string | The fully-qualified logical name of the method from the RPC interface perspective. [1] | `com.example.ExampleService/exampleMethod`; `EchoService/Echo`; `_OTHER` | | [`error.type`](/docs/registry/attributes/error.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If and only if the operation failed. | string | Describes a class of error the operation ended with. [2] | `DEADLINE_EXCEEDED`; `java.net.UnknownHostException`; `-32602` | | [`rpc.method_original`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` If and only if it's different than `rpc.method`. | string | The original name of the method used by the client. | `com.myservice.EchoService/catchAll`; `com.myservice.EchoService/unknownMethod`; `InvalidMethod` | -| [`rpc.response.status_code`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` if available. | string | Dubbo response status code returned by the server or generated by the client. [3] | `OK`; `DEADLINE_EXCEEDED`; `SERVER_ERROR` | +| [`rpc.response.status_code`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` if available. | string | The string representation of the Dubbo response status code returned by the server or generated by the client. [3] | `OK`; `DEADLINE_EXCEEDED`; `SERVER_ERROR` | | [`server.address`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If available. | string | RPC server [host name](https://grpc.github.io/grpc/core/md_doc_naming.html). [4] | `192.168.1.100`; `api.example.com` | | [`network.peer.address`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | Peer address of the network connection - IP address or Unix domain socket name. | `10.1.2.80`; `/tmp/my.sock` | | [`network.peer.port`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` If `network.peer.address` is set. | int | Peer port number of the network connection. | `65123` | @@ -102,13 +102,16 @@ For Dubbo3 Triple protocol, all status codes except `OK` SHOULD be considered er Status codes reference: - Dubbo2: [Dubbo2 Protocol Status Codes](https://dubbo.apache.org/en/overview/reference/protocols/tcp/#protocol-specification) -- Dubbo3: [Triple Protocol Error Codes](https://dubbo.apache.org/en/overview/reference/protocols/triple-spec/#311-request) +- Dubbo3 Triple protocol: [Triple Protocol Error Codes](https://dubbo.apache.org/en/overview/reference/protocols/triple-spec/#311-request) **[4] `server.address`:** Instrumentations SHOULD populate `server.address` (along with `server.port`) based on the configuration used when creating the Dubbo client and SHOULD NOT use actual network-level connection information for this purpose to ensure low cardinality. +The Dubbo registry address SHOULD NOT be used as `server.address`. Instead, use +the address of the actual server being called. + - Given the target URL `dubbo://192.168.1.100:20880/com.example.DemoService`, expected attributes: - `server.address`: `"192.168.1.100"` - `server.port`: `20880` @@ -184,7 +187,7 @@ for the details on which values classify as errors. | [`error.type`](/docs/registry/attributes/error.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If and only if the operation failed. | string | Describes a class of error the operation ended with. [1] | `DEADLINE_EXCEEDED`; `java.net.UnknownHostException`; `-32602` | | [`rpc.method`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` if available. | string | The fully-qualified logical name of the method from the RPC interface perspective. [2] | `com.example.ExampleService/exampleMethod`; `EchoService/Echo`; `_OTHER` | | [`rpc.method_original`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` If and only if it's different than `rpc.method`. | string | The original name of the method used by the client. | `com.myservice.EchoService/catchAll`; `com.myservice.EchoService/unknownMethod`; `InvalidMethod` | -| [`rpc.response.status_code`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` if available. | string | Dubbo response status code returned by the server. [3] | `OK`; `SERVER_ERROR`; `SERVER_THREADPOOL_EXHAUSTED_ERROR` | +| [`rpc.response.status_code`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` if available. | string | The string representation of the Dubbo response status code returned by the server. [3] | `OK`; `SERVER_ERROR`; `SERVER_THREADPOOL_EXHAUSTED_ERROR` | | [`server.address`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If available. | string | RPC server [host name](https://grpc.github.io/grpc/core/md_doc_naming.html). [4] | `example.com`; `10.1.2.80`; `/tmp/my.sock` | | [`server.port`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` [5] | int | Server port number. [6] | `80`; `8080`; `443` | | [`client.address`](/docs/registry/attributes/client.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | Client address - domain name if available without reverse DNS lookup; otherwise, IP address or Unix domain socket name. [7] | `client.example.com`; `10.1.2.80`; `/tmp/my.sock` | @@ -251,7 +254,7 @@ For Dubbo3 Triple protocol, the following status codes SHOULD be considered erro Status codes reference: - Dubbo2: [Dubbo2 Protocol Status Codes](https://dubbo.apache.org/en/overview/reference/protocols/tcp/#protocol-specification) -- Dubbo3: [Triple Protocol Error Codes](https://dubbo.apache.org/en/overview/reference/protocols/triple-spec/#311-request) +- Dubbo3 Triple protocol: [Triple Protocol Error Codes](https://dubbo.apache.org/en/overview/reference/protocols/triple-spec/#311-request) **[4] `server.address`:** May contain server IP address, DNS name, or local socket name. When host component is an IP address, instrumentations SHOULD NOT do a reverse proxy lookup to obtain DNS name and SHOULD set `server.address` to the IP address provided in the host component. diff --git a/model/rpc/spans.yaml b/model/rpc/spans.yaml index 5dac1ebfa6..901f80e2ff 100644 --- a/model/rpc/spans.yaml +++ b/model/rpc/spans.yaml @@ -327,7 +327,7 @@ groups: requirement_level: conditionally_required: if available. brief: > - Dubbo response status code returned by the server or generated by the client. + The string representation of the Dubbo response status code returned by the server or generated by the client. examples: ['OK', 'DEADLINE_EXCEEDED', 'SERVER_ERROR'] note: | For Dubbo2, any status code other than `OK` SHOULD be considered an error. @@ -337,7 +337,7 @@ groups: Status codes reference: - Dubbo2: [Dubbo2 Protocol Status Codes](https://dubbo.apache.org/en/overview/reference/protocols/tcp/#protocol-specification) - - Dubbo3: [Triple Protocol Error Codes](https://dubbo.apache.org/en/overview/reference/protocols/triple-spec/#311-request) + - Dubbo3 Triple protocol: [Triple Protocol Error Codes](https://dubbo.apache.org/en/overview/reference/protocols/triple-spec/#311-request) - ref: server.address requirement_level: conditionally_required: If available. @@ -348,6 +348,9 @@ groups: SHOULD NOT use actual network-level connection information for this purpose to ensure low cardinality. + The Dubbo registry address SHOULD NOT be used as `server.address`. Instead, use + the address of the actual server being called. + - Given the target URL `dubbo://192.168.1.100:20880/com.example.DemoService`, expected attributes: - `server.address`: `"192.168.1.100"` - `server.port`: `20880` @@ -393,7 +396,7 @@ groups: requirement_level: conditionally_required: if available. brief: > - Dubbo response status code returned by the server. + The string representation of the Dubbo response status code returned by the server. examples: ['OK', 'SERVER_ERROR', 'SERVER_THREADPOOL_EXHAUSTED_ERROR'] note: | For Dubbo2, the following status codes SHOULD be considered errors: @@ -415,7 +418,7 @@ groups: Status codes reference: - Dubbo2: [Dubbo2 Protocol Status Codes](https://dubbo.apache.org/en/overview/reference/protocols/tcp/#protocol-specification) - - Dubbo3: [Triple Protocol Error Codes](https://dubbo.apache.org/en/overview/reference/protocols/triple-spec/#311-request) + - Dubbo3 Triple protocol: [Triple Protocol Error Codes](https://dubbo.apache.org/en/overview/reference/protocols/triple-spec/#311-request) - ref: rpc.request.metadata requirement_level: opt_in - ref: rpc.response.metadata From d47a5359fce0f182393e4e25594b7a507168b730 Mon Sep 17 00:00:00 2001 From: Steve Rao Date: Thu, 5 Feb 2026 10:07:06 +0800 Subject: [PATCH 09/17] Update documentation to clarify the relationship between Apache Dubbo and RPC Semantic Conventions --- docs/rpc/dubbo.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/rpc/dubbo.md b/docs/rpc/dubbo.md index db17e8d37d..7ddbc460d1 100644 --- a/docs/rpc/dubbo.md +++ b/docs/rpc/dubbo.md @@ -15,9 +15,7 @@ linkTitle: Dubbo -The Semantic Conventions for [Apache Dubbo](https://dubbo.apache.org/) extend and override the [RPC spans](rpc-spans.md) and [RPC metrics](rpc-metrics.md) Semantic Conventions -that describe common RPC operations attributes in addition to the Semantic Conventions -described on this page. +The Semantic Conventions for [Apache Dubbo](https://dubbo.apache.org/) extend and override the [RPC Semantic Conventions](README.md). ## Spans From 843a3352323510a6b96891d66df92316e8680427 Mon Sep 17 00:00:00 2001 From: Steve Rao Date: Thu, 12 Feb 2026 14:36:39 +0800 Subject: [PATCH 10/17] Update documentation for Dubbo response status codes and requirements --- docs/rpc/dubbo.md | 90 ++++++++++++++++++++++---------------------- model/rpc/spans.yaml | 11 +++--- 2 files changed, 52 insertions(+), 49 deletions(-) diff --git a/docs/rpc/dubbo.md b/docs/rpc/dubbo.md index 7ddbc460d1..08c2c76d7e 100644 --- a/docs/rpc/dubbo.md +++ b/docs/rpc/dubbo.md @@ -45,15 +45,15 @@ for the details on which values classify as errors. | Key | Stability | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Value Type | Description | Example Values | | --- | --- | --- | --- | --- | --- | | [`rpc.method`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Required` | string | The fully-qualified logical name of the method from the RPC interface perspective. [1] | `com.example.ExampleService/exampleMethod`; `EchoService/Echo`; `_OTHER` | -| [`error.type`](/docs/registry/attributes/error.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If and only if the operation failed. | string | Describes a class of error the operation ended with. [2] | `DEADLINE_EXCEEDED`; `java.net.UnknownHostException`; `-32602` | +| [`rpc.response.status_code`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Required` | string | The string representation of the Dubbo response status code returned by the server or generated by the client. [2] | `OK`; `DEADLINE_EXCEEDED`; `SERVER_ERROR` | +| [`error.type`](/docs/registry/attributes/error.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If and only if the operation failed. | string | Describes a class of error the operation ended with. [3] | `DEADLINE_EXCEEDED`; `java.net.UnknownHostException`; `-32602` | | [`rpc.method_original`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` If and only if it's different than `rpc.method`. | string | The original name of the method used by the client. | `com.myservice.EchoService/catchAll`; `com.myservice.EchoService/unknownMethod`; `InvalidMethod` | -| [`rpc.response.status_code`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` if available. | string | The string representation of the Dubbo response status code returned by the server or generated by the client. [3] | `OK`; `DEADLINE_EXCEEDED`; `SERVER_ERROR` | | [`server.address`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If available. | string | RPC server [host name](https://grpc.github.io/grpc/core/md_doc_naming.html). [4] | `192.168.1.100`; `api.example.com` | +| [`server.port`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` [5] | int | Server port number. [6] | `20880`; `50051` | | [`network.peer.address`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | Peer address of the network connection - IP address or Unix domain socket name. | `10.1.2.80`; `/tmp/my.sock` | | [`network.peer.port`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` If `network.peer.address` is set. | int | Peer port number of the network connection. | `65123` | -| [`server.port`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` If `server.address` is set. | int | Server port number. [5] | `20880`; `50051` | -| [`rpc.request.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC request metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [6] | `["1.2.3.4", "1.2.3.5"]` | -| [`rpc.response.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC response metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [7] | `["attribute_value"]` | +| [`rpc.request.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC request metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [7] | `["1.2.3.4", "1.2.3.5"]` | +| [`rpc.response.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC response metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [8] | `["attribute_value"]` | **[1] `rpc.method`:** The method name MAY have unbounded cardinality in edge or error cases. @@ -79,7 +79,16 @@ The `code.function.name` attribute may be used to record the fully-qualified method actually executing the call on the server side, or the RPC client stub method on the client side. -**[2] `error.type`:** If the RPC fails with an error before status code is returned, +**[2] `rpc.response.status_code`:** For Dubbo2, any status code other than `OK` SHOULD be considered an error. + +For Dubbo3 Triple protocol, all status codes except `OK` SHOULD be considered errors. + +Status codes reference: + +- Dubbo2: [Dubbo2 Protocol Status Codes](https://dubbo.apache.org/en/overview/reference/protocols/tcp/#protocol-specification) +- Dubbo3 Triple protocol: [Triple Protocol Error Codes](https://dubbo.apache.org/en/overview/reference/protocols/triple-spec/#311-request) + +**[3] `error.type`:** If the RPC fails with an error before status code is returned, `error.type` SHOULD be set to the exception type (its fully-qualified class name, if applicable) or a component-specific, low cardinality error identifier. @@ -93,15 +102,6 @@ Instrumentations SHOULD document the list of errors they report. If the request has completed successfully, instrumentations SHOULD NOT set `error.type`. -**[3] `rpc.response.status_code`:** For Dubbo2, any status code other than `OK` SHOULD be considered an error. - -For Dubbo3 Triple protocol, all status codes except `OK` SHOULD be considered errors. - -Status codes reference: - -- Dubbo2: [Dubbo2 Protocol Status Codes](https://dubbo.apache.org/en/overview/reference/protocols/tcp/#protocol-specification) -- Dubbo3 Triple protocol: [Triple Protocol Error Codes](https://dubbo.apache.org/en/overview/reference/protocols/triple-spec/#311-request) - **[4] `server.address`:** Instrumentations SHOULD populate `server.address` (along with `server.port`) based on the configuration used when creating the Dubbo client and SHOULD NOT use actual network-level connection information for this purpose @@ -124,15 +124,17 @@ When the address is an IP address, instrumentations SHOULD NOT do a reverse proxy lookup to obtain a DNS name and SHOULD set `server.address` to the IP address provided. -**[5] `server.port`:** See the `server.address` for details on parsing the target string. +**[5] `server.port`:** if `server.address` is set and if the port is supported by the network transport used for communication. + +**[6] `server.port`:** See the `server.address` for details on parsing the target string. -**[6] `rpc.request.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. +**[7] `rpc.request.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. Including all request metadata values can be a security risk - explicit configuration helps avoid leaking sensitive information. For example, a property `my-custom-key` with value `["1.2.3.4", "1.2.3.5"]` SHOULD be recorded as `rpc.request.metadata.my-custom-key` attribute with value `["1.2.3.4", "1.2.3.5"]` -**[7] `rpc.response.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. +**[8] `rpc.response.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. Including all response metadata values can be a security risk - explicit configuration helps avoid leaking sensitive information. For example, a property `my-custom-key` with value `["attribute_value"]` SHOULD be recorded as @@ -182,10 +184,10 @@ for the details on which values classify as errors. | Key | Stability | [Requirement Level](https://opentelemetry.io/docs/specs/semconv/general/attribute-requirement-level/) | Value Type | Description | Example Values | | --- | --- | --- | --- | --- | --- | -| [`error.type`](/docs/registry/attributes/error.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If and only if the operation failed. | string | Describes a class of error the operation ended with. [1] | `DEADLINE_EXCEEDED`; `java.net.UnknownHostException`; `-32602` | -| [`rpc.method`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` if available. | string | The fully-qualified logical name of the method from the RPC interface perspective. [2] | `com.example.ExampleService/exampleMethod`; `EchoService/Echo`; `_OTHER` | +| [`rpc.response.status_code`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Required` | string | The string representation of the Dubbo response status code returned by the server. [1] | `OK`; `SERVER_ERROR`; `SERVER_THREADPOOL_EXHAUSTED_ERROR` | +| [`error.type`](/docs/registry/attributes/error.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If and only if the operation failed. | string | Describes a class of error the operation ended with. [2] | `DEADLINE_EXCEEDED`; `java.net.UnknownHostException`; `-32602` | +| [`rpc.method`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` if available. | string | The fully-qualified logical name of the method from the RPC interface perspective. [3] | `com.example.ExampleService/exampleMethod`; `EchoService/Echo`; `_OTHER` | | [`rpc.method_original`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` If and only if it's different than `rpc.method`. | string | The original name of the method used by the client. | `com.myservice.EchoService/catchAll`; `com.myservice.EchoService/unknownMethod`; `InvalidMethod` | -| [`rpc.response.status_code`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` if available. | string | The string representation of the Dubbo response status code returned by the server. [3] | `OK`; `SERVER_ERROR`; `SERVER_THREADPOOL_EXHAUSTED_ERROR` | | [`server.address`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If available. | string | RPC server [host name](https://grpc.github.io/grpc/core/md_doc_naming.html). [4] | `example.com`; `10.1.2.80`; `/tmp/my.sock` | | [`server.port`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` [5] | int | Server port number. [6] | `80`; `8080`; `443` | | [`client.address`](/docs/registry/attributes/client.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | Client address - domain name if available without reverse DNS lookup; otherwise, IP address or Unix domain socket name. [7] | `client.example.com`; `10.1.2.80`; `/tmp/my.sock` | @@ -195,7 +197,28 @@ for the details on which values classify as errors. | [`rpc.request.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC request metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [9] | `["1.2.3.4", "1.2.3.5"]` | | [`rpc.response.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC response metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [10] | `["attribute_value"]` | -**[1] `error.type`:** If the RPC fails with an error before status code is returned, +**[1] `rpc.response.status_code`:** For Dubbo2, the following status codes SHOULD be considered errors: + +- `SERVER_TIMEOUT` +- `SERVICE_ERROR` +- `SERVER_ERROR` +- `SERVER_THREADPOOL_EXHAUSTED_ERROR` + +For Dubbo3 Triple protocol, the following status codes SHOULD be considered errors: + +- `UNKNOWN` +- `DEADLINE_EXCEEDED` +- `UNIMPLEMENTED` +- `INTERNAL` +- `UNAVAILABLE` +- `DATA_LOSS` + +Status codes reference: + +- Dubbo2: [Dubbo2 Protocol Status Codes](https://dubbo.apache.org/en/overview/reference/protocols/tcp/#protocol-specification) +- Dubbo3 Triple protocol: [Triple Protocol Error Codes](https://dubbo.apache.org/en/overview/reference/protocols/triple-spec/#311-request) + +**[2] `error.type`:** If the RPC fails with an error before status code is returned, `error.type` SHOULD be set to the exception type (its fully-qualified class name, if applicable) or a component-specific, low cardinality error identifier. @@ -209,7 +232,7 @@ Instrumentations SHOULD document the list of errors they report. If the request has completed successfully, instrumentations SHOULD NOT set `error.type`. -**[2] `rpc.method`:** The method name MAY have unbounded cardinality in edge or error cases. +**[3] `rpc.method`:** The method name MAY have unbounded cardinality in edge or error cases. Some RPC frameworks or libraries provide a fixed set of recognized methods for client stubs and server implementations. Instrumentations for such @@ -233,27 +256,6 @@ The `code.function.name` attribute may be used to record the fully-qualified method actually executing the call on the server side, or the RPC client stub method on the client side. -**[3] `rpc.response.status_code`:** For Dubbo2, the following status codes SHOULD be considered errors: - -- `SERVER_TIMEOUT` -- `SERVICE_ERROR` -- `SERVER_ERROR` -- `SERVER_THREADPOOL_EXHAUSTED_ERROR` - -For Dubbo3 Triple protocol, the following status codes SHOULD be considered errors: - -- `UNKNOWN` -- `DEADLINE_EXCEEDED` -- `UNIMPLEMENTED` -- `INTERNAL` -- `UNAVAILABLE` -- `DATA_LOSS` - -Status codes reference: - -- Dubbo2: [Dubbo2 Protocol Status Codes](https://dubbo.apache.org/en/overview/reference/protocols/tcp/#protocol-specification) -- Dubbo3 Triple protocol: [Triple Protocol Error Codes](https://dubbo.apache.org/en/overview/reference/protocols/triple-spec/#311-request) - **[4] `server.address`:** May contain server IP address, DNS name, or local socket name. When host component is an IP address, instrumentations SHOULD NOT do a reverse proxy lookup to obtain DNS name and SHOULD set `server.address` to the IP address provided in the host component. **[5] `server.port`:** if `server.address` is set and if the port is supported by the network transport used for communication. diff --git a/model/rpc/spans.yaml b/model/rpc/spans.yaml index 901f80e2ff..48b3ffb41e 100644 --- a/model/rpc/spans.yaml +++ b/model/rpc/spans.yaml @@ -324,8 +324,7 @@ groups: - ref: rpc.method requirement_level: required - ref: rpc.response.status_code - requirement_level: - conditionally_required: if available. + requirement_level: required brief: > The string representation of the Dubbo response status code returned by the server or generated by the client. examples: ['OK', 'DEADLINE_EXCEEDED', 'SERVER_ERROR'] @@ -366,7 +365,7 @@ groups: to the IP address provided. - ref: server.port requirement_level: - recommended: If `server.address` is set. + conditionally_required: if `server.address` is set and if the port is supported by the network transport used for communication. examples: [20880, 50051] note: > See the `server.address` for details on parsing the target string. @@ -393,8 +392,7 @@ groups: for the details on which values classify as errors. attributes: - ref: rpc.response.status_code - requirement_level: - conditionally_required: if available. + requirement_level: required brief: > The string representation of the Dubbo response status code returned by the server. examples: ['OK', 'SERVER_ERROR', 'SERVER_THREADPOOL_EXHAUSTED_ERROR'] @@ -419,6 +417,9 @@ groups: - Dubbo2: [Dubbo2 Protocol Status Codes](https://dubbo.apache.org/en/overview/reference/protocols/tcp/#protocol-specification) - Dubbo3 Triple protocol: [Triple Protocol Error Codes](https://dubbo.apache.org/en/overview/reference/protocols/triple-spec/#311-request) + - ref: server.port + requirement_level: + conditionally_required: if `server.address` is set and if the port is supported by the network transport used for communication. - ref: rpc.request.metadata requirement_level: opt_in - ref: rpc.response.metadata From 12fefd9cb486e3ad17c0b2bf70dc73181f1a84b0 Mon Sep 17 00:00:00 2001 From: Steve Rao Date: Thu, 12 Feb 2026 15:56:55 +0800 Subject: [PATCH 11/17] Trigger CI again. --- .chloggen/add-dubbo-rpc-semconv.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.chloggen/add-dubbo-rpc-semconv.yaml b/.chloggen/add-dubbo-rpc-semconv.yaml index 030f8926a1..153e0af6c0 100644 --- a/.chloggen/add-dubbo-rpc-semconv.yaml +++ b/.chloggen/add-dubbo-rpc-semconv.yaml @@ -1,5 +1,3 @@ -# Use this changelog template to create an entry for release notes. -# # If your change doesn't affect end users you should instead start # your pull request title with [chore] or use the "Skip Changelog" label. From 7b6fe84b75283ca6a62937be93661b15ac68affe Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 13 Feb 2026 15:49:24 -0800 Subject: [PATCH 12/17] make --- docs/rpc/dubbo.md | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/docs/rpc/dubbo.md b/docs/rpc/dubbo.md index 08c2c76d7e..7eb041ebb2 100644 --- a/docs/rpc/dubbo.md +++ b/docs/rpc/dubbo.md @@ -50,10 +50,10 @@ for the details on which values classify as errors. | [`rpc.method_original`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Conditionally Required` If and only if it's different than `rpc.method`. | string | The original name of the method used by the client. | `com.myservice.EchoService/catchAll`; `com.myservice.EchoService/unknownMethod`; `InvalidMethod` | | [`server.address`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` If available. | string | RPC server [host name](https://grpc.github.io/grpc/core/md_doc_naming.html). [4] | `192.168.1.100`; `api.example.com` | | [`server.port`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` [5] | int | Server port number. [6] | `20880`; `50051` | -| [`network.peer.address`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | Peer address of the network connection - IP address or Unix domain socket name. | `10.1.2.80`; `/tmp/my.sock` | +| [`network.peer.address`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | Peer address of the network connection - IP address or Unix domain socket name. [7] | `10.1.2.80`; `/tmp/my.sock` | | [`network.peer.port`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` If `network.peer.address` is set. | int | Peer port number of the network connection. | `65123` | -| [`rpc.request.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC request metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [7] | `["1.2.3.4", "1.2.3.5"]` | -| [`rpc.response.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC response metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [8] | `["attribute_value"]` | +| [`rpc.request.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC request metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [8] | `["1.2.3.4", "1.2.3.5"]` | +| [`rpc.response.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC response metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [9] | `["attribute_value"]` | **[1] `rpc.method`:** The method name MAY have unbounded cardinality in edge or error cases. @@ -128,13 +128,15 @@ to the IP address provided. **[6] `server.port`:** See the `server.address` for details on parsing the target string. -**[7] `rpc.request.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. +**[7] `network.peer.address`:** If a RPC involved multiple network calls (for example retries), the last contacted address SHOULD be used. + +**[8] `rpc.request.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. Including all request metadata values can be a security risk - explicit configuration helps avoid leaking sensitive information. For example, a property `my-custom-key` with value `["1.2.3.4", "1.2.3.5"]` SHOULD be recorded as `rpc.request.metadata.my-custom-key` attribute with value `["1.2.3.4", "1.2.3.5"]` -**[8] `rpc.response.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. +**[9] `rpc.response.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. Including all response metadata values can be a security risk - explicit configuration helps avoid leaking sensitive information. For example, a property `my-custom-key` with value `["attribute_value"]` SHOULD be recorded as @@ -192,10 +194,10 @@ for the details on which values classify as errors. | [`server.port`](/docs/registry/attributes/server.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Conditionally Required` [5] | int | Server port number. [6] | `80`; `8080`; `443` | | [`client.address`](/docs/registry/attributes/client.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | Client address - domain name if available without reverse DNS lookup; otherwise, IP address or Unix domain socket name. [7] | `client.example.com`; `10.1.2.80`; `/tmp/my.sock` | | [`client.port`](/docs/registry/attributes/client.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | int | Client port number. [8] | `65123` | -| [`network.peer.address`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | Peer address of the network connection - IP address or Unix domain socket name. | `10.1.2.80`; `/tmp/my.sock` | +| [`network.peer.address`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` | string | Peer address of the network connection - IP address or Unix domain socket name. [9] | `10.1.2.80`; `/tmp/my.sock` | | [`network.peer.port`](/docs/registry/attributes/network.md) | ![Stable](https://img.shields.io/badge/-stable-lightgreen) | `Recommended` If `network.peer.address` is set. | int | Peer port number of the network connection. | `65123` | -| [`rpc.request.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC request metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [9] | `["1.2.3.4", "1.2.3.5"]` | -| [`rpc.response.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC response metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [10] | `["attribute_value"]` | +| [`rpc.request.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC request metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [10] | `["1.2.3.4", "1.2.3.5"]` | +| [`rpc.response.metadata.`](/docs/registry/attributes/rpc.md) | ![Development](https://img.shields.io/badge/-development-blue) | `Opt-In` | string[] | RPC response metadata, `` being the normalized RPC metadata key (lowercase), the value being the metadata values. [11] | `["attribute_value"]` | **[1] `rpc.response.status_code`:** For Dubbo2, the following status codes SHOULD be considered errors: @@ -266,13 +268,15 @@ RPC client stub method on the client side. **[8] `client.port`:** When observed from the server side, and when communicating through an intermediary, `client.port` SHOULD represent the client port behind any intermediaries, for example proxies, if it's available. -**[9] `rpc.request.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. +**[9] `network.peer.address`:** If a RPC involved multiple network calls (for example retries), the last contacted address SHOULD be used. + +**[10] `rpc.request.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. Including all request metadata values can be a security risk - explicit configuration helps avoid leaking sensitive information. For example, a property `my-custom-key` with value `["1.2.3.4", "1.2.3.5"]` SHOULD be recorded as `rpc.request.metadata.my-custom-key` attribute with value `["1.2.3.4", "1.2.3.5"]` -**[10] `rpc.response.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. +**[11] `rpc.response.metadata.`:** Instrumentations SHOULD require an explicit configuration of which metadata values are to be captured. Including all response metadata values can be a security risk - explicit configuration helps avoid leaking sensitive information. For example, a property `my-custom-key` with value `["attribute_value"]` SHOULD be recorded as From 85d87f492cf4bdd975817986d2115dea171c0c94 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 13 Feb 2026 16:08:52 -0800 Subject: [PATCH 13/17] fix link --- docs/rpc/dubbo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/rpc/dubbo.md b/docs/rpc/dubbo.md index 7eb041ebb2..5bb0b1ad19 100644 --- a/docs/rpc/dubbo.md +++ b/docs/rpc/dubbo.md @@ -32,7 +32,7 @@ This span represents an outgoing Remote Procedure Call (RPC). `rpc.system.name` MUST be set to `"dubbo"` and SHOULD be provided **at span creation time.** -**Span name:** refer to the [Span Name](/docs/rpc/rpc-spans.md#span-name) section. +**Span name:** refer to the [Span Name](/docs/rpc/rpc-spans.md#name) section. **Span kind** MUST be `CLIENT`. From 9ac373bdc485f2490ab9195699441a93a3016a49 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 13 Feb 2026 16:14:08 -0800 Subject: [PATCH 14/17] fix link --- docs/rpc/dubbo.md | 2 +- model/rpc/spans.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/rpc/dubbo.md b/docs/rpc/dubbo.md index 5bb0b1ad19..6373e2219b 100644 --- a/docs/rpc/dubbo.md +++ b/docs/rpc/dubbo.md @@ -174,7 +174,7 @@ This span represents an incoming Remote Procedure Call (RPC). `rpc.system.name` MUST be set to `"dubbo"` and SHOULD be provided **at span creation time.** -**Span name:** refer to the [Span Name](/docs/rpc/rpc-spans.md#span-name) section. +**Span name:** refer to the [Span Name](/docs/rpc/rpc-spans.md#name) section. **Span kind** MUST be `SERVER`. diff --git a/model/rpc/spans.yaml b/model/rpc/spans.yaml index cffd971717..406efc15fb 100644 --- a/model/rpc/spans.yaml +++ b/model/rpc/spans.yaml @@ -314,7 +314,7 @@ groups: note: | `rpc.system.name` MUST be set to `"dubbo"` and SHOULD be provided **at span creation time.** - **Span name:** refer to the [Span Name](/docs/rpc/rpc-spans.md#span-name) section. + **Span name:** refer to the [Span Name](/docs/rpc/rpc-spans.md#name) section. **Span kind** MUST be `CLIENT`. @@ -386,7 +386,7 @@ groups: note: | `rpc.system.name` MUST be set to `"dubbo"` and SHOULD be provided **at span creation time.** - **Span name:** refer to the [Span Name](/docs/rpc/rpc-spans.md#span-name) section. + **Span name:** refer to the [Span Name](/docs/rpc/rpc-spans.md#name) section. **Span kind** MUST be `SERVER`. From a7f44b35bb83c17a2b68519e465bf6bb9e8a870a Mon Sep 17 00:00:00 2001 From: Steve Rao Date: Sun, 15 Feb 2026 08:12:16 +0800 Subject: [PATCH 15/17] Update model/rpc/spans.yaml Co-authored-by: Matthew Hensley <130569+matt-hensley@users.noreply.github.com> --- model/rpc/spans.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/model/rpc/spans.yaml b/model/rpc/spans.yaml index 406efc15fb..a5a95fa5da 100644 --- a/model/rpc/spans.yaml +++ b/model/rpc/spans.yaml @@ -402,10 +402,10 @@ groups: note: | For Dubbo2, the following status codes SHOULD be considered errors: - - `SERVER_TIMEOUT` - - `SERVICE_ERROR` - `SERVER_ERROR` - `SERVER_THREADPOOL_EXHAUSTED_ERROR` + - `SERVER_TIMEOUT` + - `SERVICE_ERROR` For Dubbo3 Triple protocol, the following status codes SHOULD be considered errors: From 3ba1702b255fd38be260ed9e043055da23be415c Mon Sep 17 00:00:00 2001 From: Steve Rao Date: Sun, 15 Feb 2026 08:12:39 +0800 Subject: [PATCH 16/17] Update model/rpc/spans.yaml Co-authored-by: Matthew Hensley <130569+matt-hensley@users.noreply.github.com> --- model/rpc/spans.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/model/rpc/spans.yaml b/model/rpc/spans.yaml index a5a95fa5da..7d9707f6d3 100644 --- a/model/rpc/spans.yaml +++ b/model/rpc/spans.yaml @@ -409,12 +409,12 @@ groups: For Dubbo3 Triple protocol, the following status codes SHOULD be considered errors: - - `UNKNOWN` + - `DATA_LOSS` - `DEADLINE_EXCEEDED` - - `UNIMPLEMENTED` - `INTERNAL` - `UNAVAILABLE` - - `DATA_LOSS` + - `UNIMPLEMENTED` + - `UNKNOWN` Status codes reference: From aa2c160ce7a1c34a292e4ab3f7dd90ca99962608 Mon Sep 17 00:00:00 2001 From: Steve Rao Date: Sun, 15 Feb 2026 08:16:19 +0800 Subject: [PATCH 17/17] Address review comment --- docs/rpc/dubbo.md | 14 ++++++-------- model/rpc/spans.yaml | 4 +--- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/docs/rpc/dubbo.md b/docs/rpc/dubbo.md index 6373e2219b..fa0f41a1e7 100644 --- a/docs/rpc/dubbo.md +++ b/docs/rpc/dubbo.md @@ -79,9 +79,7 @@ The `code.function.name` attribute may be used to record the fully-qualified method actually executing the call on the server side, or the RPC client stub method on the client side. -**[2] `rpc.response.status_code`:** For Dubbo2, any status code other than `OK` SHOULD be considered an error. - -For Dubbo3 Triple protocol, all status codes except `OK` SHOULD be considered errors. +**[2] `rpc.response.status_code`:** All status codes except `OK` SHOULD be considered errors. Status codes reference: @@ -201,19 +199,19 @@ for the details on which values classify as errors. **[1] `rpc.response.status_code`:** For Dubbo2, the following status codes SHOULD be considered errors: -- `SERVER_TIMEOUT` -- `SERVICE_ERROR` - `SERVER_ERROR` - `SERVER_THREADPOOL_EXHAUSTED_ERROR` +- `SERVER_TIMEOUT` +- `SERVICE_ERROR` For Dubbo3 Triple protocol, the following status codes SHOULD be considered errors: -- `UNKNOWN` +- `DATA_LOSS` - `DEADLINE_EXCEEDED` -- `UNIMPLEMENTED` - `INTERNAL` - `UNAVAILABLE` -- `DATA_LOSS` +- `UNIMPLEMENTED` +- `UNKNOWN` Status codes reference: diff --git a/model/rpc/spans.yaml b/model/rpc/spans.yaml index 7d9707f6d3..db63bed2bc 100644 --- a/model/rpc/spans.yaml +++ b/model/rpc/spans.yaml @@ -332,9 +332,7 @@ groups: The string representation of the Dubbo response status code returned by the server or generated by the client. examples: ['OK', 'DEADLINE_EXCEEDED', 'SERVER_ERROR'] note: | - For Dubbo2, any status code other than `OK` SHOULD be considered an error. - - For Dubbo3 Triple protocol, all status codes except `OK` SHOULD be considered errors. + All status codes except `OK` SHOULD be considered errors. Status codes reference: