مراقبة تطبيقات Rust: نظرة عامة على الأدوات والمكتبات الرئيسية
Rust هي لغة برمجة أنظمة تُستخدم بشكل متزايد لإنشاء خدمات عالية التحميل وحرجة. ومع ذلك، حتى أكثر الأكواد موثوقية قد تتعطل في بيئة الإنتاج. تتيح المراقبة الفعالة اكتشاف المشكلات في الوقت المناسب، وفهم سببها، وضمان تشغيل مستقر للتطبيق. في هذه المقالة، سنستعرض المكتبات والأدوات الرئيسية لمراقبة تطبيقات Rust: من جمع المقاييس إلى التتبع الموزع.
1. جمع وتصدير المقاييس
المقاييس هي مؤشرات رقمية لحالة التطبيق (عدد الطلبات، وقت الاستجابة، استخدام الذاكرة، إلخ). لجمعها في Rust، تُستخدم مكتبتان رئيسيتان.
1.1. metrics و metrics-exporter-prometheus
توفر بيئة metrics طريقة خفيفة ومرنة لتسجيل المقاييس. تدعم العدادات، الرسوم البيانية، أجهزة الاستشعار، وأنواع أخرى. للتصدير إلى Prometheus، يُستخدم كريت metrics-exporter-prometheus.
use metrics::{counter, histogram};use metrics_exporter_prometheus::PrometheusBuilder;use std::net::SocketAddr;
#[tokio::main]async fn main() -> Result<(), Box<dyn std::error::Error>> { // إعداد نقطة نهاية HTTP لـ Prometheus let addr: SocketAddr = "0.0.0.0:9000".parse()?; let builder = PrometheusBuilder::new().with_http_listener(addr); builder.install()?;
// تسجيل المقاييس counter!("http_requests_total", 1); histogram!("request_duration_seconds", 0.045);
// كتابة المقاييس في الخلفية loop { counter!("http_requests_total", 1); histogram!("request_duration_seconds", 0.023); tokio::time::sleep(tokio::time::Duration::from_secs(5)).await; }}المزايا: أداء عالٍ، استهلاك ضئيل للذاكرة، دعم المصدرين المخصصين.
1.2. opentelemetry (المقاييس)
OpenTelemetry هو معيار عالمي لجمع القياسات عن بُعد. يدعم كريت opentelemetry المقاييس، التتبعات، والسجلات. للتصدير إلى Prometheus، يُستخدم opentelemetry-prometheus.
use opentelemetry::{global, KeyValue};use opentelemetry::metrics::MeterProvider;use opentelemetry_prometheus::PrometheusExporter;
fn init_meter() { let exporter = PrometheusExporter::default(); let provider = opentelemetry::sdk::metrics::MeterProvider::builder() .with_reader(exporter) .build(); global::set_meter_provider(provider);}
fn main() { init_meter(); let meter = global::meter("my_app"); let counter = meter.u64_counter("requests").init();
counter.add(1, &[KeyValue::new("method", "GET")]);}المزايا: التوحيد القياسي، إمكانية التبديل بين الخلفيات (Prometheus، Datadog، InfluxDB).
2. التتبع الموزع
يساعد التتبع في تتبع مسار الطلب عبر عدة خدمات مصغرة. بالنسبة لـ Rust، أفضل خيار هو tracing.
2.1. كريت tracing و tracing-opentelemetry
توفر مكتبة tracing تسجيلاً منظمًا وتتبعًا. تتكامل مع OpenTelemetry عبر tracing-opentelemetry.
use tracing::{info, span, Level};use tracing_subscriber::fmt;use opentelemetry::global;use opentelemetry_otlp::WithExportConfig;
fn init_tracer() { let tracer = opentelemetry_otlp::new_pipeline() .tracing() .with_exporter(opentelemetry_otlp::new_exporter().tonic().with_endpoint("http://localhost:4317")) .install_simple() .expect("فشل تثبيت متتبع OTLP"); let telemetry = tracing_opentelemetry::layer().with_tracer(tracer); let subscriber = fmt::Subscriber::