通过SkyWalking上报Rust应用数据

通过SkyWalking为应用埋点并上报链路数据至可观测链路 OpenTelemetry 版后,可观测链路 OpenTelemetry 版即可开始监控应用,您可以查看应用拓扑、调用链路、异常事务、慢事务和SQL分析等一系列监控数据。本文介绍如何使用SkyWalking Rust Agent埋点并上报应用数据。

前提条件

  • 已安装protobuf。

    macOS

    brew install protobuf

    Debian-base

    sudo apt install protobuf-compiler
  • 获取接入点信息

    1. 登录ARMS控制台,在左侧导航栏单击接入中心

    2. 服务端应用区域单击SkyWalking卡片。

    3. 在弹出的SkyWalking面板中选择数据需要上报的地域。

      说明

      初次接入的地域将会自动进行资源初始化。

    4. 选择连接方式,然后复制接入点信息。

      若您的服务部署在阿里云上,且所属地域与选择的接入地域一致,推荐使用阿里云内网方式,否则选择公网方式。

      image.png

背景信息

SkyWalking是一款广受欢迎的国产APM(Application Performance Monitoring,应用性能监控)产品,主要针对微服务、Cloud Native和容器化(Docker、Kubernetes、Mesos)架构的应用。SkyWalking的核心是一个分布式追踪系统。

Skywalking-rustSkyWalkingRust Agent官方库,可以通过接入skywalking-rust实现对Rust应用的监控,skywalking-rust目前对Rust应用的自动埋点支持较差,需要使用者手动添加埋点。

示例Demo

示例Demo仓库地址:SkyWalking Demo

Demo基于RustWeb框架hyper实现了一个简单的HTTP Server,并使用skywalking-rust手动添加埋点,向可观测链路 OpenTelemetry 版控制台上报数据。

SkyWalkingRust应用手动埋点

  1. Rust项目引入SkyWalking依赖。

    说明

    本文中以SkyWalking 0.8.0版本为例。

    方法一:直接在cargo.toml中添加依赖

    # 在[dependency]下添加
    skywalking = { version = "0.8.0", features = ["vendored"] }

    方法二:在终端执行命令

    cargo add skywalking --features vendored
  2. 在源代码中导入SkyWalking模块。

    # 在需要埋点的源代码中导入模块
    use skywalking::{reporter::grpc::GrpcReporter, trace::tracer::Tracer};

  3. 手动埋点。

    // 使用EntrySpan、LocalSpan、ExitSpan完成调用链手动埋点,使用这三种Span,可以完成全链路追踪。
    // EntrySpan: 入口Span,服务端使用EntrySpanHttp请求中拿到链路追踪上下文。
    // LocalSpan: 本地Span,同一进程内可使用该Span埋点。
    // ExitSpan: 出口Span,客户端使用ExitSpanHttp请求中注入链路追踪上下文。
    
    // 跨进程的调用链,可以参照下面:
    
    // client.rs:
        
    let mut ctx = tracer.create_trace_context();
    {
        do something...
        let span = ctx.create_exit_span("operation1", "remote_peer");
    }
    
    // server.rs:
    
    let mut ctx = tracer.create_trace_context();
    {
        let span = ctx.create_entry_span("operation1");
        do something...
    }
  4. 配置接入点和令牌。

    您可以通过前提条件获取接入点地址和鉴权Token。

    // <endpoint>是接入点地址,<token>是接入点鉴权Token,<service_name>是应用名称。
    
    let endpoint = "<endpoint>";
    let token = "<token>";
    let service_name = "<service_name>";
    let instance_name = "<instance_name>";
    
    let reporter = GrpcReporter::connect(endpoint).await?;
    let reporter = reporter.with_authentication(token);
    let tracer = Tracer::new(service_name, instance_name, reporter.clone());
  5. 重启应用。

常见问题

构建Rust项目时报错如下:image.png

问题原因:缺少protobuf,您可以参考前提条件安装protobuf。

相关文档

SkyWalking官网