مراقبة تطبيقات C# (.NET): دليل كامل لـ OpenTelemetry وPrometheus
تتطلب تطبيقات .NET الحديثة مراقبة مستمرة للأداء والأخطاء والحالة. بدون مراقبة، فإنك تخاطر بفقدان السيطرة على بيئة الإنتاج. في هذه المقالة، سنشرح كيفية إعداد مراقبة فعالة لتطبيقات C# (.NET) باستخدام مزيج من OpenTelemetry (جمع القياسات عن بُعد) وPrometheus + Grafana (التصور والتنبيهات).
لماذا OpenTelemetry تحديدًا؟
OpenTelemetry (OTel) هو المعيار الصناعي لجمع المقاييس والتتبعات (التتبع) والسجلات. بالنسبة لـ .NET، يوفر حزم SDK رسمية وأدوات آلية للمكتبات الشائعة (ASP.NET Core، gRPC، Entity Framework).
تثبيت وإعداد OpenTelemetry في مشروع C#
أضف حزم NuGet إلى مشروعك:
dotnet add package OpenTelemetrydotnet add package OpenTelemetry.Extensions.Hostingdotnet add package OpenTelemetry.Instrumentation.AspNetCoredotnet add package OpenTelemetry.Exporter.Prometheus.AspNetCoreالإعداد الأساسي في Program.cs
قم بإعداد جمع المقاييس والتصدير إلى Prometheus:
using OpenTelemetry.Metrics;using OpenTelemetry.Resources;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddOpenTelemetry() .ConfigureResource(resource => resource .AddService("MyApp", serviceVersion: "1.0.0")) .WithMetrics(metrics => metrics .AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() .AddMeter("Microsoft.AspNetCore.Hosting") .AddMeter("Microsoft.AspNetCore.Server.Kestrel") .AddPrometheusExporter());
var app = builder.Build();
// نقطة نهاية لـ Prometheus (الافتراضي /metrics)app.MapPrometheusScrapingEndpoint();
app.Run();إنشاء مقاييس مخصصة
يمكنك إضافة عدادات ومدرجات ترددية وأجهزة استشعار خاصة بك:
using System.Diagnostics.Metrics;
public class OrderMetrics{ private readonly Counter<int> _ordersCreated; private readonly Histogram<double> _orderProcessingTime;
public OrderMetrics(IMeterFactory meterFactory) { var meter = meterFactory.Create("MyApp.Orders"); _ordersCreated = meter.CreateCounter<int>("orders.created", description: "عدد الطلبات المنشأة"); _orderProcessingTime = meter.CreateHistogram<double>("orders.processing_time", unit: "ms"); }
public void RecordOrderCreated() => _ordersCreated.Add(1); public void RecordProcessingTime(double ms) => _orderProcessingTime.Record(ms);}تتبع الطلبات (التتبع الموزع)
لتتبع سلاسل الاستدعاءات، أضف التتبع:
using OpenTelemetry.Trace;
builder.Services.AddOpenTelemetry() .WithTracing(tracing => tracing .AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() .AddEntityFrameworkCoreInstrumentation() .AddConsoleExporter()); // للتصحيح، في الإنتاج استخدم Jaeger أو Zipkinالتسجيل عبر OpenTelemetry
قم بتوصيل المسجل بـ OTel:
using OpenTelemetry.Logs;
builder.Logging.AddOpenTelemetry(logging => logging .AddConsoleExporter() .AddOtlpExporter(options => options.Endpoint = new Uri("http://localhost:4317")));إعداد Prometheus لجمع المقاييس
في ملف prometheus.yml، حدد نقطة النهاية الخاصة بك:
scrape_configs: - job_name: 'dotnet-app' scrape_interval: 5s static_configs: - targets: ['localhost:5000'] # منفذ تطبيقكالتصور في Grafana
بعد توصيل Prometheus بـ Grafana، أنشئ لوحة تحكم بالمقاييس الرئيسية:
- http_server_duration_ms — زمن استجابة الخادم
أيضاً في المكتبة
توصيات