通过SkyWalking上报Rust应用数据

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

前提条件

  • 已安装protobuf。

    macOS

    brew install protobuf

    Debian-base

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

    新版控制台

    1. 登录可观测链路 OpenTelemetry 版控制台,在左侧导航栏单击接入中心

    2. 开源框架区域单击SkyWalking卡片。

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

      说明

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

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

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

      image.png

    旧版控制台

    1. 登录可观测链路 OpenTelemetry 版控制台

    2. 在左侧导航栏单击集群配置,然后在右侧页面单击接入点信息页签。

    3. 在页面顶部选择需要接入的地域,然后在集群信息区域打开显示Token开关。

    4. 客户端采集工具区域单击SkyWalking

      相关信息列中,获取接入点信息。

      SkyWalking接入点信息

      说明

      如果应用部署于阿里云生产环境,则选择阿里云VPC网络接入点,否则选择公网接入点。

背景信息

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

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

示例Demo

示例Demo仓库地址:SkyWalking Demo

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

用SkyWalking为Rust应用手动埋点

  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,服务端使用EntrySpan从Http请求中拿到链路追踪上下文。
    // LocalSpan: 本地Span,同一进程内可使用该Span埋点。
    // ExitSpan: 出口Span,客户端使用ExitSpan向Http请求中注入链路追踪上下文。
    
    // 跨进程的调用链,可以参照下面:
    
    // 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官网