1 个不稳定版本

0.1.0 2022年2月17日

#777调试

Apache-2.0

45KB
559

Apache SkyWalking Rust 代理

Sky Walking logo

Twitter Follow

CI

SkyWalking Rust 代理为Rust应用程序和库提供可观察性能力,包括跟踪、指标、分布式系统的拓扑图和警报。它使用SkyWalking原生格式和核心概念以保持最佳兼容性和性能。

概念

所有概念均来自官方SkyWalking定义。

跨度

跨度是分布式跟踪系统中的一个重要且常见的概念。从Google Dapper论文中学习跨度。为了提高性能,我们将跨度扩展为3种类型。

  1. EntrySpan EntrySpan表示服务提供者,也是服务器端端点。作为一个APM系统,我们针对应用程序服务器。因此,几乎所有服务和MQ消费者都是EntrySpan。
  2. LocalSpan LocalSpan表示一个普通的Java方法,它不涉及远程服务,也不是MQ生产者/消费者或服务(例如HTTP服务)提供者/消费者。
  3. 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