Span 应该有一个名为 iterHeaders(适应平台的命名约定)的方法,它返回一个可迭代的或 header 名称和值的映射。这是一个包含 return {"sentry-trace": toSentryTrace()} 的薄 wrapper。 请参阅 continueFromHeaders 以了解为什么存在这种情况,并且在编写集成(integration)时应该首选。
Transaction 接口
一个 Transaction 内部包含一个子 Span 的平面列表(不是树结构)
Transaction 还有一个 setName 方法来设置 transaction 的名称
Transaction 在创建时收到一个 TransactionContext(新属性与 SpanContext 是 name)
由于 Transaction 继承了 Span,因此它具有所有 Span 可用的函数并且可以像 Span 一样进行交互
一个 transaction 要么被采样(sampled = true),要么被取消采样(sampled = false),一个在 transaction 的生命周期中被继承或设置一次的决定,并且在任何一种情况下都会传播给所有的 children。不应将未抽样的 transaction 发送给 Sentry。
TransactionContext 应该有一个叫做 fromSentryTrace 的 static/ctor 方法,它用从 sentry-trace header值接收的数据预填充一个 TransactionContext
TransactionContext 应该有一个名为 continueFromHeaders(headerMap) 的 static/ctor 方法,它现在实际上只是一个围绕 fromSentryTrace(headerMap.get("sentry-trace")) 的薄 wrapper。integration/framework-sdk 的作者应该更喜欢 fromSentryTrace,因为它隐藏了核心 sdk 中更深层次使用的确切 header 名称,并为将来使用其他 header(来自 W3C)留下了机会,而无需更改所有集成。
Span.finish()
只需将 endTimestamp 设置为当前时间(在 payload timestamp 中)
Transaction.finish()
super.finish() (在 Span 上调用 finish)
仅当 sampled == true 时才将其发送给 Sentry
一个 Transaction 需要被包裹在一个 Envelope 中并发送到 Envelope Endpoint
Transport 应该为 Transactions/Events 使用相同的内部队列
Transport 应该实现基于类别的速率限制 →
Transport 应该处理在内部将 Transaction 包装在 Envelope 中
采样每个 transaction 都有一个 “抽样决策”,即一个布尔值,指示是否应该将其发送给 Sentry。
这应该在 transaction 的生命周期内只设置一次,并且应该存储在内部的 sampled 布尔值中。
transaction 可以通过多种方式结束抽样决策(sampling decision):
根据 tracesSampleRate 中设置的静态采样率随机采样
根据 tracesSampler 返回的动态采样率进行随机采样
tracesSampler 返回的绝对决策(100% 概率或 0% 概率)
如果 transaction 有父级,继承其父级的抽样决策
传递给 startTransaction 的绝对决策
当其中一个以上发挥作用的可能性时,应适用以下优先规则:
如果将抽样决策传递给 startTransaction (startTransaction({name: "my transaction", sampled: true})),则将使用该决策,而不管其他任何事情。
如果定义了 tracesSampler,则将使用其决策。它可以选择保留或忽略任何父采样决策,或使用采样上下文数据做出自己的决策或为 transaction 选择采样率。
如果未定义 tracesSampler,但存在父采样决策,则将使用父采样决策。
如果没有定义 tracesSampler 并且没有父采样决策,则将使用 tracesSampleRate。
Transaction 应仅通过 tracesSampleRate 或 tracesSampler 进行采样。sampleRate 配置用于 error 事件,不应应用于 transaction。
采样上下文如果定义,tracesSampler 回调应该传递一个 samplingContext 对象,该对象至少应该包括:
创建 transaction 的 transactionContext
一个布尔值 parentSampled,包含从父级传递过来的采样决策,如果有的话
来自可选的 customSamplingContext 对象的数据在手动调用时传递给 startTransaction
根据平台,可能包含其他默认数据。(例如,对于服务器框架,包含与 transaction 正在测量的请求相对应的 request 对象是有意义的。)
传播transaction 的抽样决策应传递给其所有子项,包括跨服务边界。这可以在相同服务子项的 startChild 方法中完成,并为不同服务中的子项使用 senry-trace header。
Header sentry-traceHeader 用于跟踪传播。SDK 使用 header 继续跟踪来自上游服务(传入 HTTP 请求),并将跟踪信息传播到下游服务(传出 HTTP 请求)。
sentry-trace = traceid-spanid-sampled
sampled 是可选的。所以至少,它是预期的:
sentry-trace = traceid-spanid
为了与 (没有版本前缀)
和 (考虑 64 位和 128 位的 traceId 有效)提供最小的兼容性,
sentry-trace header 应具有以 32 个十六进制字符编码的 128 位的 traceId 以及以 16 个十六进制字符编码的 64 位 spanId。
为了避免与 W3C traceparent header(我们的 header 相似但不相同)混淆,
我们将其简称为 sentry-trace。header 中没有定义版本。
为简化处理,该值由单个(可选)字符组成。可能的值为:
- No value means defer 0 - Don\'t sample 1 - Sampled