groups: - id: rpc prefix: rpc type: span brief: 'This document defines semantic conventions for remote procedure calls.' events: [rpc.message] attributes: - id: system requirement_level: required brief: 'A string identifying the remoting system. See below for a list of well-known identifiers.' type: allow_custom_values: true members: - id: grpc value: 'grpc' brief: 'gRPC' - id: java_rmi value: 'java_rmi' brief: 'Java RMI' - id: dotnet_wcf value: 'dotnet_wcf' brief: '.NET WCF' - id: apache_dubbo value: 'apache_dubbo' brief: 'Apache Dubbo' - id: connect_rpc value: 'connect_rpc' brief: 'Connect RPC' - id: service type: string requirement_level: recommended brief: 'The full (logical) name of the service being called, including its package name, if applicable.' note: > This is the logical name of the service from the RPC interface perspective, which can be different from the name of any implementing class. The `code.namespace` attribute may be used to store the latter (despite the attribute name, it may include a class name; e.g., class with method actually executing the call on the server side, RPC client stub class on the client side). examples: "myservice.EchoService" - id: method type: string requirement_level: recommended brief: 'The name of the (logical) method being called, must be equal to the $method part in the span name.' note: > This is the logical name of the method from the RPC interface perspective, which can be different from the name of any implementing method/function. The `code.function` attribute may be used to store the latter (e.g., method actually executing the call on the server side, RPC client stub method on the client side). examples: "exampleMethod" - ref: net.sock.peer.addr - ref: net.sock.peer.port requirement_level: recommended: If different than `net.peer.port` and if `net.sock.peer.addr` is set. - ref: net.sock.family requirement_level: conditionally_required: If and only if `net.sock.peer.addr` is set. - ref: net.sock.peer.name requirement_level: recommended: If different than `net.peer.name` and if `net.sock.peer.addr` is set. - ref: net.peer.name requirement_level: required brief: > RPC server [host name](https://grpc.github.io/grpc/core/md_doc_naming.html). note: > 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 `net.peer.name` to the IP address provided in the host component. - ref: net.peer.port requirement_level: conditionally_required: See below - ref: net.transport requirement_level: conditionally_required: See below constraints: - any_of: - net.sock.peer.addr - net.peer.name - include: network - id: rpc.server prefix: rpc type: span extends: rpc span_kind: server brief: 'Semantic Convention for RPC server spans' attributes: - ref: net.host.name - ref: net.sock.host.addr - ref: net.sock.host.port - ref: net.sock.family - id: rpc.grpc prefix: rpc.grpc type: span extends: rpc brief: 'Tech-specific attributes for gRPC.' attributes: - id: status_code type: members: - id: ok brief: OK value: 0 - id: cancelled brief: CANCELLED value: 1 - id: unknown brief: UNKNOWN value: 2 - id: invalid_argument brief: INVALID_ARGUMENT value: 3 - id: deadline_exceeded brief: DEADLINE_EXCEEDED value: 4 - id: not_found brief: NOT_FOUND value: 5 - id: already_exists brief: ALREADY_EXISTS value: 6 - id: permission_denied brief: PERMISSION_DENIED value: 7 - id: resource_exhausted brief: RESOURCE_EXHAUSTED value: 8 - id: failed_precondition brief: FAILED_PRECONDITION value: 9 - id: aborted brief: ABORTED value: 10 - id: out_of_range brief: OUT_OF_RANGE value: 11 - id: unimplemented brief: UNIMPLEMENTED value: 12 - id: internal brief: INTERNAL value: 13 - id: unavailable brief: UNAVAILABLE value: 14 - id: data_loss brief: DATA_LOSS value: 15 - id: unauthenticated brief: UNAUTHENTICATED value: 16 requirement_level: required brief: "The [numeric status code](https://github.com/grpc/grpc/blob/v1.33.2/doc/statuscodes.md) of the gRPC request." - id: rpc.jsonrpc prefix: rpc.jsonrpc type: span extends: rpc brief: 'Tech-specific attributes for [JSON RPC](https://www.jsonrpc.org/).' attributes: - id: version type: string requirement_level: conditionally_required: If other than the default version (`1.0`) brief: "Protocol version as in `jsonrpc` property of request/response. Since JSON-RPC 1.0 does not specify this, the value can be omitted." examples: ['2.0', '1.0'] - id: request_id type: string brief: > `id` property of request or response. Since protocol allows id to be int, string, `null` or missing (for notifications), value is expected to be cast to string for simplicity. Use empty string in case of `null` value. Omit entirely if this is a notification. examples: ['10', 'request-7', ''] - id: error_code type: int requirement_level: conditionally_required: If response is not successful. brief: "`error.code` property of response if it is an error response." examples: [-32700, 100] - id: error_message type: string brief: "`error.message` property of response if it is an error response." examples: ['Parse error', 'User already exists'] - ref: rpc.method requirement_level: required note: > This is always required for jsonrpc. See the note in the general RPC conventions for more information. - id: rpc.message prefix: "message" # TODO: Change the prefix to rpc.message? type: event brief: "RPC received/sent message." attributes: - id: type type: members: - id: sent value: "SENT" - id: received value: "RECEIVED" brief: "Whether this is a received or sent message." - id: id type: int brief: "MUST be calculated as two different counters starting from `1` one for sent messages and one for received message." note: "This way we guarantee that the values will be consistent between different implementations." - id: compressed_size type: int brief: "Compressed size of the message in bytes." - id: uncompressed_size type: int brief: "Uncompressed size of the message in bytes." - id: rpc.connect_rpc prefix: rpc.connect_rpc type: span extends: rpc brief: 'Tech-specific attributes for Connect RPC.' attributes: - id: error_code type: members: - id: cancelled value: cancelled - id: unknown value: unknown - id: invalid_argument value: invalid_argument - id: deadline_exceeded value: deadline_exceeded - id: not_found value: not_found - id: already_exists value: already_exists - id: permission_denied value: permission_denied - id: resource_exhausted value: resource_exhausted - id: failed_precondition value: failed_precondition - id: aborted value: aborted - id: out_of_range value: out_of_range - id: unimplemented value: unimplemented - id: internal value: internal - id: unavailable value: unavailable - id: data_loss value: data_loss - id: unauthenticated value: unauthenticated requirement_level: conditionally_required: If response is not successful and if error code available. brief: "The [error codes](https://connect.build/docs/protocol/#error-codes) of the Connect request. Error codes are always string values."