使用 Rust 语言对Opentelemetry 框架的一个封装,目的是减少应用程序引入 Opentelemetry 时对代码的侵入性。
opentelemetry-otlp-dayu = {git = "https://e.coding.net/dy-sec/aegis-vision/opentelemetry-otlp-dayu.git", branch = "master"}
## 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
在程序入口文件(main.rs)中调用初始化函数,并将配置文件传入初始化入口函数。
init_opentelemetry_config("src/opentelemetry.yaml");
Collector的地址一般都是:<span style="color协议://IP 地址:端口号/v1/(traces/logs/metrics)。
采样方式有如下几种:
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 两个重要的链路信息参数。