1 个不稳定版本
0.1.0 | 2022年2月17日 |
---|
#777 在 调试
45KB
559 行
Apache SkyWalking Rust 代理
SkyWalking Rust 代理为Rust应用程序和库提供可观察性能力,包括跟踪、指标、分布式系统的拓扑图和警报。它使用SkyWalking原生格式和核心概念以保持最佳兼容性和性能。
概念
所有概念均来自官方SkyWalking定义。
跨度
跨度是分布式跟踪系统中的一个重要且常见的概念。从Google Dapper论文中学习跨度。为了提高性能,我们将跨度扩展为3种类型。
- EntrySpan EntrySpan表示服务提供者,也是服务器端端点。作为一个APM系统,我们针对应用程序服务器。因此,几乎所有服务和MQ消费者都是EntrySpan。
- LocalSpan LocalSpan表示一个普通的Java方法,它不涉及远程服务,也不是MQ生产者/消费者或服务(例如HTTP服务)提供者/消费者。
- ExitSpan ExitSpan表示服务的客户端或MQ生产者,在SkyWalking早期被称为LeafSpan。例如,通过JDBC访问数据库、读取Redis/Memcached都被归类为ExitSpan。
标签和日志是跨度的类似属性。
- 标签是一个键值对,用字符串值表示属性。
- 日志比标签更复杂,包含一个时间戳和多个键值对。日志代表一个事件,通常是错误发生。
跟踪上下文
跟踪上下文是跟踪过程的上下文。跨度应仅通过上下文创建,并在跨度完成后存档到上下文中。
示例
use skywalking_rust::context::trace_context::TracingContext;
use skywalking_rust::reporter::grpc::Reporter;
use tokio;
async fn handle_request(reporter: ContextReporter) {
let mut ctx = TracingContext::default("svc", "ins");
{
// Generate an Entry Span when a request
// is received. An Entry Span is generated only once per context.
let span = ctx.create_entry_span("operation1").unwrap();
// Something...
{
// Generates an Exit Span when executing an RPC.
let span2 = ctx.create_exit_span("operation2").unwrap();
// Something...
ctx.finalize_span(span2);
}
ctx.finalize_span(span);
}
reporter.send(context).await;
}
#[tokio::main]
async fn main() {
let tx = Reporter::start("http://0.0.0.0:11800").await;
// Start server...
}
许可协议
Apache 2.0
依赖项
~7–15MB
~169K SLoC