logo
0
0
WeChat Login
zhoujianing<zhoujianing@TimedeMac-mini.local>
修改了配置文件

1.opentelemetry-otlp-dayu

使用 Rust 语言对Opentelemetry 框架的一个封装,目的是减少应用程序引入 Opentelemetry 时对代码的侵入性。

1.1 引入依赖

opentelemetry-otlp-dayu = {git = "https://e.coding.net/dy-sec/aegis-vision/opentelemetry-otlp-dayu.git", branch = "master"}

1.2 配置文件

## opentelemetry中源信息 resource: ## 服务名称 service_name: "opentelemetry-otlp-dayu" ## 基本参数 attributes: - key: "service.version" value: "0.1.1" ## 是否是客户系统 customer_system: true ## Trace配置 trace: ## Collector地址 endpoint: "http://127.0.0.1:4318/v1/traces" ## 是否开启 Trace enabled: true ## logs配置 logs: ## Collector 地址 endpoint: "http://127.0.0.1:4318/v1/logs" ## 是否开启Logs enabled: true ## 那些包的日志不需要记录 log_filter: - "hyper=off" - "tonic=off" - "actix=off" ## 日志等级 log_level: "info" ## metrics配置 metrics: ## Collector地址 endpoint: "http://127.0.0.1:4318/v1/metrics" ## 是一个与metrics相关的概念,主要用于描述累积(cumulative)和增量(delta)两种不同的数据报告模式 temporality: "delta" ## 是否开启Metrics enabled: true ## Trace采样器的配置 sampler: ## 是否开启采样器 enabled: false ## 采样方式 sampler_type: "TraceIdRatioBased" ## 采样的比率 0~1 rate: 0.5 ## 是否将采集的数据在控制台输出 std_logs: false

1.3 使用

在程序入口文件(main.rs)中调用初始化函数,并将配置文件传入初始化入口函数。

init_opentelemetry_config("src/opentelemetry.yaml");

Collector的地址一般都是:<span style="color协议://IP 地址:端口号/v1/(traces/logs/metrics)。

采样方式有如下几种:

  • TraceIdRatioBased:按比例采样
  • ParentBased:根据父 Span 的采样决策动态调整,如果父 Span 已采样 → 强制采样当前 Span;如果父 Span 未采样 → 使用子采样器(如 TraceIdRatioBased)

1.4 Web Example

1、导入上述依赖。
2、将配置文件传入初始化入口函数init_opentelemetry_config
3、在 main.rs 中配置初始化信息:

#[actix_web::main] async fn main() -> std::io::Result<()> { // 第一步:初始化 Opentelemetry 信息 init_opentelemetry_config(Some("src/opentelemetry.yaml")); HttpServer::new(|| { App::new() .service(greet) // 第二步:开启 Web 系统的链路追踪 .wrap(RequestTracing::default()) }) .bind(("0.0.0.0", 8080))? .run() .await }

4、对于日志输出,可以使用opentelemetry-otlp-dayu 提供的 info!等日志宏进行输出;或者在应用程序中引入 trace 这个日志库,引入其他的日志框架会冲突。

5、对于使用服务间的调用,支持 Http 的方式;在 opentelemetry-otlp-dayu crate中封装了 reqwest crate ,并对 Client 进行了封装,在使用时按照如下方式获取 client:

use opentelemetry_otlp_dayu::client; #[get("/A/getUsername")] async fn greet() -> impl Responder { client::builder().get("http://127.0.0.1:8081/B/zhangsan").send().await.unwrap().text().await.unwrap() }

通过上述方式发送的 Http 请求会在请求头中携带 traceID 和 spanID 两个重要的链路信息参数。