You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This document uses key words such as "MUST", "SHOULD", and "MAY" as defined in [RFC 2119](https://www.ietf.org/rfc/rfc2119.txt) to indicate requirement levels.
6
+
This document uses key words such as "MUST", "SHOULD", and "MAY" as defined in [RFC 2119](https://www.ietf.org/rfc/rfc2119.txt) to indicate requirement levels.
7
+
</Alert>
8
+
9
+
<Alertlevel="info">
10
+
The APIs specified in this documents MUST be implemented by all SDKs that don't use OpenTelemetry as their underlying tracing implementation.
11
+
SDKs using OTel SHOULD follow their own already established span APIs but MAY orient themselves on this document if applicable.
7
12
</Alert>
8
13
9
14
Spans are measuring the duration of certain operations in an application.
10
-
The topmost member of a span tree is called the root span. This span has no parent span and groups together its children with a representative name for the entire operation, such as `GET /` in case of a request to a backend application.
11
15
12
-
## Creating a root span
16
+
The topmost member of a (distributed) span tree is called the "Root Span".
17
+
This span has no parent span and groups together its children with a representative name for the entire operation, such as `GET /` in case of a request to a backend application.
13
18
14
-
The SDK must expose a method for creating a root span. The user must be able to set certain properties on this root span, such as its name, the type of operation (`op`) and others.
19
+
The topmost span within a service boundary is called the "Segment Span".
20
+
Segment spans have a `parent_span_id` pointing to a "remote" span from the parent service.
15
21
16
-
```js
17
-
span =sentry.tracing.startSpan()
18
-
->setName('GET /')
19
-
->setOp('http.server')
22
+
For example, a distributed trace from backend to frontend, would have a segment span for the backend, and a segment span for the frotnend.
23
+
The frontend segment span is also the root span of the entire span tree.
20
24
21
-
span.end()
22
-
```
25
+
SDKs MUST NOT expose names like "segment span" (e.g. in APIs) to users and SHOULD NOT (read "avoid") exposing "root span" if possible.
23
26
24
-
## Creating nested spans
27
+
## Span Interface
25
28
26
-
To create nested spans, the SDK must expose an explicit way for a user to perform this task.
29
+
SDKs' span implementations MUST at minimum implement the following span interface.
27
30
28
-
Additionally, the SDK may expose alternative APIs to create nested spans, such as allowing a user to wrap an operation into a callback or apply a decorator to certain blocks. These alternative APIs must never create a root span and no-op if no parent span is present.
When implementing the span interface, consider the following guidelines:
48
53
49
-
The SDK must expose a method to allow a user to set data attributes onto a span.
50
-
These attributes should use pre-defined keys whenever possible.
54
+
- SDKs MAY implement additional APIs, such as getters/setters for properties (e.g. `span.getStatus()`), or additional methods for convenience (e.g. `Span::spanContext()`).
55
+
- SDK implementers SHOULD dissalow direct mutation (without setters) of span properties such as the span name, depending on the plaform and the challenges involved.
56
+
- SDK implementers MAY disallow direct read access to span properties, depending on the platform and the challenges involved.
|`name`| Yes | The name of the span. MUST be set by users |
82
+
|`attributes`| No | Attributes to attach to the span. |
83
+
|`parentSpan`| No | The parent span. See description below for implications of allowed values |
84
+
|`active`| No | Whether the started span should be _active_ (i.e. if spans started while this span is active should become children of the started span). |
85
+
86
+
Behaviour:
87
+
- Spans MUST be started as active by default. This means that any span started, while the initial span is active, MUST be attached as a child span of the active span.
88
+
- Only if users set `active: false`, the span will be started as inactive, meaning spans started while this span is not yet ended, will not become children, but siblings of the started span.
89
+
- If a `Span` is passed via `parentSpan`, the span will be started as the child of the passed parent span. This has precedence over the currently active span.
90
+
- If `null` is passed via `parentSpan`, the new span will be started as a root/segment span.
91
+
- SDKs MUST NOT end the span automatically. This is the responsibility of the user.
92
+
-`startSpan` MUST always return a span instance, even if the started span's trace is negatively sampled.
93
+
94
+
95
+
### Additional Span Starting APIs
96
+
97
+
SDKs MAY expose additional span starting APIs or variants of `startSpan` that make sense for the platform.
98
+
These could be decorators, annotations, or closure- or callback-based APIs.
99
+
Additional APIs MAY e.g. end spans automatically (for example, when a callback terminates, the span is ended automatically).
100
+
Likewise, additional APIs MAY also adjust the span status based on errors thrown.
101
+
102
+
### Explicitly creating a child span
103
+
104
+
At this time, SDKs MUST NOT expose APIs like `Span::startChild` or similar functionality that explicitly creates a child span.
105
+
This is still TBD but the `parentSpan` option should suffice to serve this use case.
106
+
107
+
## Utility APIs
108
+
109
+
SDKs MAY expose additional utility APIs for users, or internal usage to access certain spans. For example,
110
+
111
+
-`Scope::getSpan()` - returns the currently active span.
112
+
-`Scope::_INTERNAL_getSegmentSpan()` - returns the segment span of the currently active span (MUST NOT be documented for users)
0 commit comments