Topik ini menjelaskan cara mengimpor data jejak dari aplikasi Rust ke Layanan Log Sederhana menggunakan OpenTelemetry SDK untuk Rust.
Prasyarat
Instans jejak telah dibuat. Untuk informasi lebih lanjut, lihat Buat Instans Jejak.
Lingkungan pengembangan Rust telah disiapkan dengan versi Rust 1.46 atau yang lebih baru.
Prosedur
Tambahkan dependensi.
[package] name = "test" version = "0.1.0" authors = [""] edition = "2018" # Lihat lebih banyak kunci dan definisi mereka di Format Manifest. [dependencies] futures = "0.3" lazy_static = "1.4" opentelemetry = { version = "0.16.0", features = ["tokio-support", "metrics", "serialize"] } opentelemetry-otlp = { version = "0.9.0", features = ["tonic", "metrics", "tls", "tls-roots"] } serde_json = "1.0" tokio = { version = "1.0", features = ["full"] } tonic="0.4.0" url = "2.2.0"Jalankan kode.
Ganti variabel dalam kode berikut dengan nilai sebenarnya. Untuk informasi lebih lanjut tentang variabel, lihat Variabel.
use opentelemetry::global::shutdown_tracer_provider; use opentelemetry::sdk::Resource; use opentelemetry::trace::TraceError; use opentelemetry::{ baggage::BaggageExt, trace::{TraceContextExt, Tracer}, Context, Key, KeyValue, }; use opentelemetry::{global, sdk::trace as sdktrace}; use opentelemetry_otlp::WithExportConfig; use std::error::Error; use std::time::Duration; use tonic::metadata::MetadataMap; use tonic::transport::ClientTlsConfig; use url::Url; static ENDPOINT: &str = "https://${endpoint}"; static PROJECT: &str = "${project}"; static INSTANCE_ID: &str = "${instance}"; static AK_ID: &str = "${access-key-id}"; static AK_SECRET: &str = "${access-key-secret}"; static SERVICE_VERSION: &str = "${version}"; static SERVICE_NAME: &str = "${service}"; static SERVICE_NAMESPACE: &str = "${service.namespace}"; static HOST_NAME: &str = "${host}"; static SLS_PROJECT_HEADER: &str = "x-sls-otel-project"; static SLS_INSTANCE_ID_HEADER: &str = "x-sls-otel-instance-id"; static SLS_AK_ID_HEADER: &str = "x-sls-otel-ak-id"; static SLS_AK_SECRET_HEADER: &str = "x-sls-otel-ak-secret"; static SLS_SERVICE_VERSION: &str = "service.version"; static SLS_SERVICE_NAME: &str = "service.name"; static SLS_SERVICE_NAMESPACE: &str = "service.namespace"; static SLS_HOST_NAME: &str = "host.name"; fn init_tracer() -> Result<sdktrace::Tracer, TraceError> { let mut metadata_map = MetadataMap::with_capacity(4); metadata_map.insert(SLS_PROJECT_HEADER, PROJECT.parse().unwrap()); metadata_map.insert(SLS_INSTANCE_ID_HEADER, INSTANCE_ID.parse().unwrap()); metadata_map.insert(SLS_AK_ID_HEADER, AK_ID.parse().unwrap()); metadata_map.insert(SLS_AK_SECRET_HEADER, AK_SECRET.parse().unwrap()); let endpoint = ENDPOINT; let endpoint = Url::parse(&endpoint).expect("endpoint is not a valid url"); let resource = vec![ KeyValue::new(SLS_SERVICE_VERSION, SERVICE_VERSION), KeyValue::new(SLS_HOST_NAME, HOST_NAME), KeyValue::new(SLS_SERVICE_NAMESPACE, SERVICE_NAMESPACE), KeyValue::new(SLS_SERVICE_NAME, SERVICE_NAME), ]; opentelemetry_otlp::new_pipeline() .tracing() .with_exporter( opentelemetry_otlp::new_exporter() .tonic() .with_endpoint(endpoint.as_str()) .with_metadata(dbg!(metadata_map)) .with_tls_config( ClientTlsConfig::new().domain_name( endpoint .host_str() .expect("the specified endpoint should have a valid host"), ), ), ) .with_trace_config(sdktrace::config().with_resource(Resource::new(resource))) .install_batch(opentelemetry::runtime::Tokio) } const FOO_KEY: Key = Key::from_static_str("ex.com/foo"); const BAR_KEY: Key = Key::from_static_str("ex.com/bar"); const LEMONS_KEY: Key = Key::from_static_str("lemons"); const ANOTHER_KEY: Key = Key::from_static_str("ex.com/another"); lazy_static::lazy_static! { static ref COMMON_ATTRIBUTES: [KeyValue; 4] = [ LEMONS_KEY.i64(10), KeyValue::new("A", "1"), KeyValue::new("B", "2"), KeyValue::new("C", "3"), ]; } #[tokio::main] async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> { let _ = init_tracer()?; let tracer = global::tracer("ex.com/basic"); let _baggage = Context::current_with_baggage(vec![FOO_KEY.string("foo1"), BAR_KEY.string("bar1")]) .attach(); tracer.in_span("operation", cx { let span = cx.span(); span.add_event( "Operasi bagus!".to_string(), vec![Key::new("bogons").i64(100)], ); span.set_attribute(ANOTHER_KEY.string("ya")); tracer.in_span("Sub operasi...", cx { let span = cx.span(); span.set_attribute(LEMONS_KEY.string("lima")); span.add_event("Peristiwa sub rentang".to_string(), vec![]); }); }); tokio::time::sleep(Duration::from_secs(60)).await; shutdown_tracer_provider(); Ok(()) }Tabel 1. Variabel
Variabel
Deskripsi
Contoh
${service}
Nama layanan. Tentukan nilainya berdasarkan skenario bisnis Anda.
pembayaran
${version}
Versi layanan. Kami sarankan Anda menentukan versi dalam format va.b.c.
v0.1.2
${service.namespace}
Namespace tempat layanan berada.
pesanan
${host}
Nama host.
localhost
${endpoint}
Titik akhir proyek Layanan Log Sederhana. Format: ${project}.${region-endpoint}:Port.
${project}: nama proyek Layanan Log Sederhana.
${region-endpoint}: titik akhir Layanan Log Sederhana untuk wilayah tempat proyek berada. Anda dapat mengakses Layanan Log Sederhana menggunakan titik akhir internal atau publik. Titik akhir internal dapat diakses melalui jaringan klasik atau virtual private cloud (VPC). Titik akhir publik dapat diakses melalui Internet. Untuk informasi lebih lanjut, lihat Titik Akhir.
Port: nomor port. Nilainya tetap sebagai 10010.
test-project.cn-hangzhou.log.aliyuncs.com:10010
${project}
Nama proyek Layanan Log Sederhana.
test-project
${instance}
ID instans jejak. Untuk informasi lebih lanjut, lihat Buat instans jejak.
test-traces
${access-key-id}
ID AccessKey akun Alibaba Cloud Anda.
Kami sarankan Anda menggunakan pasangan AccessKey dari pengguna RAM yang hanya memiliki izin tulis pada proyek Layanan Log Sederhana. Pasangan AccessKey terdiri dari ID AccessKey dan Rahasia AccessKey. Untuk informasi lebih lanjut tentang cara memberikan izin tulis pada proyek tertentu kepada pengguna RAM, lihat Gunakan kebijakan kustom untuk memberikan izin kepada pengguna RAM. Untuk informasi lebih lanjut tentang cara mendapatkan pasangan AccessKey, lihat Pasangan AccessKey.
Tidak ada
${access-key-secret}
Rahasia AccessKey akun Alibaba Cloud Anda.
Kami sarankan Anda menggunakan pasangan AccessKey dari pengguna RAM yang hanya memiliki izin tulis pada proyek Layanan Log Sederhana.
Tidak ada