#metrics #tracing #label #spans #context #tracing-subscriber

metrics-tracing-context

一个将跟踪上下文作为指标标签使用的crate

21个版本 (破坏性更新)

0.16.0 2024年5月27日
0.15.0 2023年12月24日
0.14.0 2023年4月16日
0.13.0 2023年1月21日
0.1.0-alpha.52020年11月25日

#404 in 调试

Download history 9362/week @ 2024-04-26 7991/week @ 2024-05-03 7708/week @ 2024-05-10 8779/week @ 2024-05-17 12659/week @ 2024-05-24 10768/week @ 2024-05-31 8995/week @ 2024-06-07 12241/week @ 2024-06-14 11475/week @ 2024-06-21 9285/week @ 2024-06-28 7962/week @ 2024-07-05 7388/week @ 2024-07-12 12835/week @ 2024-07-19 8066/week @ 2024-07-26 9099/week @ 2024-08-02 9984/week @ 2024-08-09

41,515 每月下载量
用于lightyear

MIT许可证

290KB
5K SLoC

metrics-tracing-context

一个将跟踪上下文作为指标标签使用的crate。


lib.rs:

使用tracing::span!字段的值作为metrics标签。

metrics-tracing-context crate提供工具,可以注入由tracing crate的span!宏维护的上下文数据到指标中。

使用方法

首先,设置tracingmetrics crate

use metrics_tracing_context::{MetricsLayer, TracingContextLayer};
use metrics_util::layers::Layer;
use tracing_subscriber::layer::SubscriberExt;

// Prepare tracing.
let subscriber = my_subscriber.with(MetricsLayer::new());
tracing::subscriber::set_global_default(subscriber).unwrap();

// Prepare metrics.
let recorder = TracingContextLayer::all().layer(my_recorder);
metrics::set_global_recorder(recorder).unwrap();

然后在跨度中发出一些指标,并查看注入的标签!

use tracing::{span, Level};
use metrics::counter;

let user = "ferris";
let span = span!(Level::TRACE, "login", user);
let _guard = span.enter();

counter!("login_attempts", "service" => "login_service").increment(1);

上面的代码将发出一个带有以下标签的login_attempts计数器的增量

  • 服务=login_service
  • 用户=ferris

实现

集成层通过捕获跨度创建时存在的所有字段以及之后记录的字段,并将它们作为跨度的扩展来工作。如果在进入跨度时发出指标,则捕获的该跨度的任何字段将作为额外的标签添加到指标中。

请注意,我们递归地捕获span的字段,包括父span的字段,并在生成指标标签时使用它们。这意味着,如果在span B中发出指标,span B是span A的子span,且span A具有字段X,span B具有字段Y,那么指标标签将包括字段X和Y。这适用于当前进入的嵌套span数量。

重复的span字段

在捕获span字段时,它们会被去重,保留最新的值。在合并父span字段到当前span字段时,当前span的字段具有最高优先级。此外,当使用Span::record在创建span之后添加字段时,同样适用。这意味着记录字段多次只会保留最后记录的值,包括如果字段已经从一个父span存在,然后动态地在当前span中记录。

span字段和祖先关系

同样,我们捕获span及其父span(如果有的话)的所有字段的总和,这意味着如果你有以下span堆栈

root span        (fieldA => valueA)
 ⤷ mid-tier span (fieldB => valueB)
    ⤷ leaf span  (fieldC => valueC)

那么在叶子span内发出的指标将获得,作为标签,所有三个字段:A、B和C。此外,这一层不会去重字段。如果你有两个相同的字段名实例,这两个版本都将包含在你的指标标签中。这些字段是否去重以及如何去重是导出器特定的实现细节。

此外,出于性能考虑,span字段存储在池化存储中,并且还会复制父span的字段。以下面的示例span堆栈为例,中间层的span将保留字段A和B,而叶子span将保留字段A、B和C。

实际上,这些技术使用的额外内存消耗对于现代系统来说不应有问题,但在诸如嵌入式平台等受限系统上可能会代表不可接受的内存使用量。

依赖关系

~3MB
~48K SLoC