通過SkyWalking為應用埋點并上報鏈路數據至可觀測鏈路 OpenTelemetry 版后,可觀測鏈路 OpenTelemetry 版即可開始監控應用,您可以查看應用拓撲、調用鏈路、異常事務、慢事務和SQL分析等一系列監控數據。本文介紹如何使用SkyWalking Rust Agent埋點并上報應用數據。
前提條件
已安裝protobuf。
macOS
brew install protobuf
Debian-base
sudo apt install protobuf-compiler
新版控制臺
登錄可觀測鏈路 OpenTelemetry 版控制臺,在左側導航欄單擊接入中心。
在開源框架區域單擊SkyWalking卡片。
在彈出的SkyWalking面板中選擇數據需要上報的地域。
說明初次接入的地域將會自動進行資源初始化。
選擇連接方式,然后復制接入點信息。
若您的服務部署在阿里云上,且所屬地域與選擇的接入地域一致,推薦使用阿里云內網方式,否則選擇公網方式。
舊版控制臺
在左側導航欄單擊集群配置,然后在右側頁面單擊接入點信息頁簽。
在頁面頂部選擇需要接入的地域,然后在集群信息區域打開顯示Token開關。
在客戶端采集工具區域單擊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應用手動埋點
在Rust項目引入SkyWalking依賴。
說明本文中以SkyWalking 0.8.0版本為例。
方法一:直接在cargo.toml中添加依賴
# 在[dependency]下添加 skywalking = { version = "0.8.0", features = ["vendored"] }
方法二:在終端執行命令
cargo add skywalking --features vendored
在源代碼中導入SkyWalking模塊。
# 在需要埋點的源代碼中導入模塊 use skywalking::{reporter::grpc::GrpcReporter, trace::tracer::Tracer};
手動埋點。
// 使用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... }
配置接入點和令牌。
您可以通過前提條件獲取接入點地址和鑒權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());
重啟應用。
常見問題
構建Rust項目時報錯如下:
問題原因:缺少protobuf,您可以參考前提條件安裝protobuf。