我应该修改 zipkin 服务库以传递通用功能标志吗?
Should I modify zipkin service libraries to pass generic feature flags?
我们希望在我们的技术栈中实施 Zipkin。当我研究 Zipkin 时,扩展 Zipkin 系统以处理通用标志对我来说很有意义。
观察:
- Zipkin 的任何实现都需要捕获 "B3" 标记值(HTTP 中的 headers)并将它们传播到堆栈下方的请求。
- 一些值发生了变化
- 一些值刚刚传播(采样、调试)
结论:
- 使用传播 (X-)B3-Flag- Key/Value 对的选项扩展 Zipkin 是有意义的。
- 这会启用 A/B 测试和 Blue/Green 部署。
- 除非服务开发团队注明,否则这些技术通常需要比较计时以确保计时相似或改进。
TL;DR; B3 propagation 最初是为固定大小的数据设计的:携带辅助跟踪的数据不在范围内,因此任何以这种方式扩展 B3 的解决方案都不会与现有代码兼容。
所以,这意味着像这样的任何解决方案都将是一个扩展,这意味着在 instrumented apps 中进行自定义处理,这些是传递 header 的东西。服务器不会关心,因为它永远不会看到这些 header。
人们通常将标志等其他东西与 zipkin 集成的方法是添加一个标签,也就是二进制注释,包括它的值(通常在根跨度中)。这将允许您离线查询或检索这些内容,但无法解决 in-flight 从应用程序进行的查找。
假设我们不想使用像 linkerd 这样的中介,或者 platform-specific 传播的上下文,我们希望将责任分派给跟踪层。首先,什么样的数据可以正常工作?最简单的是 set-once(比如 zipkin 的跟踪 ID)。任何在不改变它的情况下设置和传播的东西都是最少的机制。下一个困难是添加新条目 mid-stream,最困难的是 mutating/merging 个条目。
让我们假设这是针对在 request/trace 树中永远不会改变的入站标志。我们在处理跟踪数据时看到一个header,我们将其存储并转发到下游。如果跟踪系统不需要读取此值,则最简单,因为它主要是 transport/propagation 关注点。例如,也许其他中间件读到 header 而它只是我们添加到跟踪器的 "side job" 以记住要传递的某些内容。如果这是在单个 header 中完成的,它将比要添加的每个地方的模式代码更少。如果标志可以用数字编码,那么代码会更少,但是这可能是不现实的。
有些库带有 api 来手动操作传播的上下文,例如,"baggage" from brownsys and OpenTracing (of which some libraries support zipkin). The former aims to be a generic layer for any instrumentation (ex monitoring, chargeback, tracing etc) and the latter is specific to tracing. OpenTracing has defines abstract types like injector and extractor 可以自定义它来携带其他字段。但是,您仍然需要一个具体的实现(它知道您的 header 格式等)才能执行此操作。除非您希望应用程序读取此数据,否则它需要是该实现的秘密细节(特别是跟踪上下文)。
某些 zipkin-specific 库,如 Spring Cloud Sleuth 和 Brave,有办法 customize how headers are parsed 支持 B3 或新的或 site-specific 跟踪格式的变体。目前并非所有人都支持这一点,但我希望这种类型的功能会变得更加普遍。这意味着您可能需要做一些手术才能支持您可能需要支持的所有平台。
长话短说,有些库在传播方面是可插入的,修改这些库最容易以支持此用例。无论如何都需要一些代码,因为 B3 目前没有定义这样的表达式。
我们希望在我们的技术栈中实施 Zipkin。当我研究 Zipkin 时,扩展 Zipkin 系统以处理通用标志对我来说很有意义。
观察:
- Zipkin 的任何实现都需要捕获 "B3" 标记值(HTTP 中的 headers)并将它们传播到堆栈下方的请求。
- 一些值发生了变化
- 一些值刚刚传播(采样、调试)
结论:
- 使用传播 (X-)B3-Flag- Key/Value 对的选项扩展 Zipkin 是有意义的。
- 这会启用 A/B 测试和 Blue/Green 部署。
- 除非服务开发团队注明,否则这些技术通常需要比较计时以确保计时相似或改进。
TL;DR; B3 propagation 最初是为固定大小的数据设计的:携带辅助跟踪的数据不在范围内,因此任何以这种方式扩展 B3 的解决方案都不会与现有代码兼容。
所以,这意味着像这样的任何解决方案都将是一个扩展,这意味着在 instrumented apps 中进行自定义处理,这些是传递 header 的东西。服务器不会关心,因为它永远不会看到这些 header。
人们通常将标志等其他东西与 zipkin 集成的方法是添加一个标签,也就是二进制注释,包括它的值(通常在根跨度中)。这将允许您离线查询或检索这些内容,但无法解决 in-flight 从应用程序进行的查找。
假设我们不想使用像 linkerd 这样的中介,或者 platform-specific 传播的上下文,我们希望将责任分派给跟踪层。首先,什么样的数据可以正常工作?最简单的是 set-once(比如 zipkin 的跟踪 ID)。任何在不改变它的情况下设置和传播的东西都是最少的机制。下一个困难是添加新条目 mid-stream,最困难的是 mutating/merging 个条目。
让我们假设这是针对在 request/trace 树中永远不会改变的入站标志。我们在处理跟踪数据时看到一个header,我们将其存储并转发到下游。如果跟踪系统不需要读取此值,则最简单,因为它主要是 transport/propagation 关注点。例如,也许其他中间件读到 header 而它只是我们添加到跟踪器的 "side job" 以记住要传递的某些内容。如果这是在单个 header 中完成的,它将比要添加的每个地方的模式代码更少。如果标志可以用数字编码,那么代码会更少,但是这可能是不现实的。
有些库带有 api 来手动操作传播的上下文,例如,"baggage" from brownsys and OpenTracing (of which some libraries support zipkin). The former aims to be a generic layer for any instrumentation (ex monitoring, chargeback, tracing etc) and the latter is specific to tracing. OpenTracing has defines abstract types like injector and extractor 可以自定义它来携带其他字段。但是,您仍然需要一个具体的实现(它知道您的 header 格式等)才能执行此操作。除非您希望应用程序读取此数据,否则它需要是该实现的秘密细节(特别是跟踪上下文)。
某些 zipkin-specific 库,如 Spring Cloud Sleuth 和 Brave,有办法 customize how headers are parsed 支持 B3 或新的或 site-specific 跟踪格式的变体。目前并非所有人都支持这一点,但我希望这种类型的功能会变得更加普遍。这意味着您可能需要做一些手术才能支持您可能需要支持的所有平台。
长话短说,有些库在传播方面是可插入的,修改这些库最容易以支持此用例。无论如何都需要一些代码,因为 B3 目前没有定义这样的表达式。