Sentry 开发者贡献指南 - SDK 开发(性能监控) (2)

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-trace

Header 用于跟踪传播。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 中没有定义版本。

sampled 值

为简化处理,该值由单个(可选)字符组成。可能的值为:

- No value means defer 0 - Don\'t sample 1 - Sampled

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzyfdf.html