全部产品
Search
文档中心

应用实时监控服务ARMS:通过SkyWalking上报Rust应用数据

更新时间:Oct 13, 2023

在追踪应用的链路数据之前,您需要通过客户端将应用数据上报至可观测链路 OpenTelemetry 版服务端。本文介绍如何通过SkyWalking Rust Agent上报Rust应用数据。

前提条件

  • 已安装protobuf。

    macOS

    brew install protobuf

    Debian-base

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

    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官网