OpenTelemetry
An observability framework for cloud-native software.
tracingと合わせて使える
アーキテクチャ
https://gyazo.com/1871967136cf675a680d6fef0c596a6a
Tracer
TraceはSpanによって構成されるDAG
SpanごとにtraceId割当
A span represents an operation within a transaction
stateに含まれるもの(上のリンクより)
An operation name
A start and finish timestamp
Attributes
k-v pairのリスト
Eventの集合
Eventは(timestamp, name, Attributes)のタプル
親Spanのidentifier
0以上の関連Spansに対するLinks
SpanContext経由
SpanContext info
cipepser.icon tracing語のspanやeventと同じなのだけど、Rust実装上はcrateが別なので変換できなそう?(FromやIntoが見つけられてない)
SpanContext
Trace内のSpanをまたがってpropagateするときに使う
Metric
計測器へのアクセス
Spanのcontextで発生しない値の測定
CPU loadなど
CNCF
Cloud Native Computing Foundation
Linux Foundation配下
OpenTelemetryもこのPJの一つ
OpenTracingとOpenCensusがCNCF配下で統合され、OpenTelemetryになった
サンプルコード
動かしてみた感じ、以下の方式でtrace_idを取得できる
cipepser.icon opentelemetry::Context経由で取得したtrace_idがゼロ値になってしまう現象が発生した。opentelemetryのversionがinitとuseで異なっていた。crateが異なるとコンパイル時に拾えないので注意。
code:rs
fn greet_user(username: &str) -> String {
let ctx = Context::current();
let trace_id = ctx.span().span_context().trace_id().to_byte_array();
println!("{:?}", trace_id);
tracing::info!("preparing to greet user");
format!("Hello {}", username)
}
https://gyazo.com/a281269ff48cb51b3d28a2ec4f637292
opentelemetry_jaeger::new_pipeline()がないとtrace_idがゼロ値になってしまう。pipeline指定が必要そうだけど。。。stdoutにするのがいいのかしら。
let (tracer, _uninstall) = opentelemetry::sdk::export::trace::stdout::new_pipeline().install();でちゃんとtrace_idは取れる
PipelineBuilderを実装すればstdoutじゃない出力先もいけそう
rust in blockchainでtracing使ってそうなプロジェクト