مجموعة المقاييس المخصصة في .NET و.NET Core

تحتوي Azure Monitor Application Insights .NET و.NET Core SDKs على طريقتين مختلفتين لجمع المقاييس المخصصة: TrackMetric() و GetMetric(). الفرق الرئيسي بين هاتين الطريقتين هو التجميع المحلي. TrackMetric() يفتقر الأسلوب إلى التجميع المسبق. يحتوي GetMetric() الأسلوب على تجميع مسبق. نوصي باستخدام التجميع، لذلك TrackMetric() لم تعد الطريقة المفضلة لجمع المقاييس المخصصة. ترشدك هذه المقالة باستخدام GetMetric() الأسلوب وبعض الأساس المنطقي وراء كيفية عمله.

إشعار

تعتمد الوثائق التالية على واجهة برمجة تطبيقات Application Insights الكلاسيكية. الخطة طويلة الأجل ل Application Insights هي جمع البيانات باستخدام OpenTelemetry. لمزيد من المعلومات، راجع تمكين Azure Monitor OpenTelemetry لتطبيقات .NET Node.js وPython وJava.

التجميع المسبق مقابل واجهة برمجة التطبيقات غير المجمعة مسبقا

TrackMetric() يرسل الأسلوب بيانات تتبع الاستخدام الأولية التي تدل على مقياس. من الغير مجدي إرسال عنصر بيانات تتبع الاستخدام مفرد لكل قيمة. الأسلوب TrackMetric() غير فعال أيضا من حيث الأداء لأن كل TrackMetric(item) يمر عبر البنية الأساسية لبرنامج ربط العمليات التجارية SDK الكاملة من مهيئات القياس عن بعد والمعالجات.

بخلاف TrackMetric()، فإن GetMetric() يقوم بمعالجة التجميع المسبق المحلي نيابة عنك ثم يرسل فقط مقياس ملخص مجمّع عند فاصل زمني ثابت مدته دقيقة واحدة. إذا كنت بحاجة إلى مراقبة بعض المقاييس المخصصة عن كثب على المستوى الثاني أو حتى الملي ثانية، يمكنك القيام بذلك مع تكبد تكلفة التخزين وحركة مرور الشبكة فقط للمراقبة كل دقيقة. كما يقلل ذلك الأمر أيضًا بشكل كبير من خطر التحكم بالنطاق الترددي لأن تقليل العدد الإجمالي لعناصر بيانات تتبع الاستخدام التي يجب إرسالها لمقياس مجمع بشكل كبير.

لا تخضع المقاييس المخصصة التي تم جمعها في Application Insights عبرTrackMetric() وGetMetric()لأخذ العينات. يمكن أن يؤدي أخذ العينات من المقاييس المهمة إلى سيناريوهات حيث قد يصبح التنبيه الذي قمت ببنائه حول هذه المقاييس غير موثوق به. من خلال عدم أخذ عينات من مقاييسك المخصصة مطلقا، يمكنك أن تكون واثقا بشكل عام من أنه عند اختراق حدود التنبيه، يتم إطلاق تنبيه. نظرا لعدم أخذ عينات من المقاييس المخصصة، فهناك بعض المخاوف المحتملة.

يمكن أن يؤدي تعقب الاتجاه في مقياس كل ثانية، أو في فاصل زمني أكثر دقة، إلى:

  • زيادة تكاليف تخزين البيانات. توجد تكلفة مقترنة بكمية البيانات التي ترسلها إلى Azure Monitor. كلما قمت بإرسال المزيد من البيانات، زادت التكلفة الإجمالية للمراقبة.
  • زيادة نسبة استخدام الشبكة أو حمل الأداء. في بعض السيناريوهات، يمكن أن يكون لهذا الحمل تكلفة نقدية وتكلفة أداء تطبيق.
  • خطر تقييد الاستيعاب. يسقط Azure Monitor ("تقييد") نقاط البيانات عندما يرسل تطبيقك معدلا عاليا من بيانات تتبع الاستخدام في فترة زمنية قصيرة.

يعد التحكم بالنطاق الترددي مصدر قلق، لأنه يمكن أن يؤدي إلى تنبيهات فائتة. يمكن أن يحدث شرط تشغيل تنبيه محليا ثم يتم إسقاطه عند نقطة نهاية الاستيعاب بسبب إرسال الكثير من البيانات. لا نوصي باستخدام TrackMetric() لـ .NET و.NET Core إلا إذا قمت بتطبيق منطق التجميع المحلي الخاص بك. إذا كنت تحاول تعقب كل مثيل يقع فيه حدث على مدى فترة زمنية معينة، فقد تجد أن هذا TrackEvent() مناسب بشكل أفضل. ضع في اعتبارك في أنه على عكس المقاييس المخصصة، فإن الأحداث المخصصة تخضع لأخذ العينات. لا يزال بإمكانك استخدام TrackMetric() حتى دون كتابة التجميع المسبق المحلي الخاص بك. ولكن إذا قمت بذلك، كن على دراية بالمزالق.

باختصار، نوصي GetMetric() لأنه يقوم بالتجميع المسبق، فإنه يجمع القيم من جميع Track() الاستدعاءات، ويرسل ملخصا/تجميعا مرة واحدة كل دقيقة. GetMetric() يمكن أن يقلل الأسلوب بشكل كبير من التكلفة والنفقات العامة للأداء عن طريق إرسال عدد أقل من نقاط البيانات مع الاستمرار في جمع جميع المعلومات ذات الصلة.

إشعار

تحتوي فقط .NET و.NET Core SDKs على GetMetric() أسلوب . إذا كنت تستخدم Java، فشاهد إرسال مقاييس مخصصة باستخدام ميكرومتر. بالنسبة إلى JavaScript و Node.js، ستظل تستخدم TrackMetric()، ولكن ضع في اعتبارك المحاذير التي تم توضيحها في القسم السابق. بالنسبة إلى Python، يمكنك استخدام OpenCensus.stats لإرسال مقاييس مخصصة، ولكن تنفيذ المقاييس مختلف.

بدء استخدام GetMetric

من أجل الحصول على أمثلة، سنستخدم تطبيق خدمة العمال الأساسية .NET Core 3.1. إذا كنت تريد نسخ بيئة الاختبار المستخدمة مع هذه الأمثلة، فاتبع الخطوات من 1 إلى 6 في مقالة خدمة عامل المراقبة. تضيف هذه الخطوات Application Insights إلى قالب مشروع خدمة العامل الأساسي. تنطبق المفاهيم على أي تطبيق عام حيث يمكن استخدام SDK، بما في ذلك تطبيقات الويب وتطبيقات وحدة التحكم.

إرسال المقاييس

استبدل محتويات ملف worker.cs بالآتي:

using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.ApplicationInsights;

namespace WorkerService3
{
    public class Worker : BackgroundService
    {
        private readonly ILogger<Worker> _logger;
        private TelemetryClient _telemetryClient;

        public Worker(ILogger<Worker> logger, TelemetryClient tc)
        {
            _logger = logger;
            _telemetryClient = tc;
        }

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {   // The following line demonstrates usages of GetMetric API.
            // Here "computersSold", a custom metric name, is being tracked with a value of 42 every second.
            while (!stoppingToken.IsCancellationRequested)
            {
                _telemetryClient.GetMetric("ComputersSold").TrackValue(42);

                _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
                await Task.Delay(1000, stoppingToken);
            }
        }
    }
}

عند تشغيل نموذج التعليمات البرمجية، ترى while الحلقة تنفذ بشكل متكرر دون إرسال بيانات تتبع الاستخدام في نافذة إخراج Visual Studio. يتم إرسال عنصر بيانات تتبع الاستخدام واحد من خلال حوالي علامة 60 ثانية، والتي في اختبارنا يبدو كما يلي:

Application Insights Telemetry: {"name":"Microsoft.ApplicationInsights.Dev.00000000-0000-0000-0000-000000000000.Metric", "time":"2019-12-28T00:54:19.0000000Z",
"ikey":"00000000-0000-0000-0000-000000000000",
"tags":{"ai.application.ver":"1.0.0.0",
"ai.cloud.roleInstance":"Test-Computer-Name",
"ai.internal.sdkVersion":"m-agg2c:2.12.0-21496",
"ai.internal.nodeName":"Test-Computer-Name"},
"data":{"baseType":"MetricData",
"baseData":{"ver":2,"metrics":[{"name":"ComputersSold",
"kind":"Aggregation",
"value":1722,
"count":41,
"min":42,
"max":42,
"stdDev":0}],
"properties":{"_MS.AggregationIntervalMs":"42000",
"DeveloperMode":"true"}}}}

يمثل عنصر بيانات تتبع الاستخدام المفرد إجمالي 41 قياسًا متريًا متميزًا. نظرا لأننا كنا نرسل نفس القيمة مرارا وتكرارا، لدينا انحراف معياري (stDev) بالقيم 0 القصوى (max) والحد الأدنى (min) المتطابقة. value تمثل الخاصية مجموع كافة القيم الفردية التي تم تجميعها.

إشعار

GetMetric لا يدعم الأسلوب تعقب القيمة الأخيرة (على سبيل المثال، gauge) أو تعقب المدرجات التكرارية أو التوزيعات.

إذا فحصنا مورد Application Insights في تجربة السجلات (Analytics)، فسيبدو عنصر بيانات تتبع الاستخدام الفردي مثل لقطة الشاشة التالية.

Screenshot that shows the Log Analytics query view.

إشعار

في حين أن عنصر بيانات تتبع الاستخدام الخام لم يحتوي على خاصية/حقل مجموع صريح بمجرد استيعابه، فإننا ننشئ واحدا لك. في هذه الحالة، تمثل الخاصية value و valueSum نفس الشيء.

يمكنك أيضا الوصول إلى القياس عن بعد القياسي المخصص في قسم Metrics في المدخل كمقياس يستند إلى السجل ومقياس مخصص. لقطة الشاشة التالية هي مثال على مقياس يستند إلى السجل.

Screenshot that shows the Metrics explorer view.

مرجع قياس ذاكرة التخزين المؤقت للاستخدام عالي الإنتاجية

قد تتم ملاحظة قيم القياس بشكل متكرر في بعض الحالات. على سبيل المثال، قد ترغب خدمة عالية الإنتاجية تعالج 500 طلب في الثانية في إصدار 20 مقياسا لبيانات تتبع الاستخدام لكل طلب. هذا يعني تعقب 10000 قيمة في الثانية. في مثل هذه السيناريوهات عالية الإنتاجية، قد يحتاج المستخدمون إلى مساعدة SDK عن طريق تجنب بعض عمليات البحث.

على سبيل المثال، قام المثال السابق بإجراء بحث عن مقبض للمقياس ComputersSold ثم تعقب قيمة تمت ملاحظتها ل 42. بدلا من ذلك، قد يتم تخزين المقبض مؤقتا لادعاءات المسار المتعددة:

//...

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            // This is where the cache is stored to handle faster lookup
            Metric computersSold = _telemetryClient.GetMetric("ComputersSold");
            while (!stoppingToken.IsCancellationRequested)
            {

                computersSold.TrackValue(42);

                computersSold.TrackValue(142);

                _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
                await Task.Delay(50, stoppingToken);
            }
        }

بالإضافة إلى التخزين المؤقت لمقبض القياس، تم Task.Delay أيضا تقليل المثال السابق إلى 50 مللي ثانية بحيث يتم تنفيذ الحلقة بشكل متكرر. والنتيجة هي 772 TrackValue() استدعاء.

مقاييس متعددة الأبعاد

تعرض الأمثلة في القسم السابق مقاييس الأبعاد الصفرية. يمكن أن تكون القياسات متعددة الأبعاد. ندعم حاليًا ما يصل إلى 10 أبعاد.

فيما يلي مثال على كيفية إنشاء قياس أحادي البعد:

//...

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            // This is an example of a metric with a single dimension.
            // FormFactor is the name of the dimension.
            Metric computersSold= _telemetryClient.GetMetric("ComputersSold", "FormFactor");

            while (!stoppingToken.IsCancellationRequested)
            {
                // The number of arguments (dimension values)
                // must match the number of dimensions specified while GetMetric.
                // Laptop, Tablet, etc are values for the dimension "FormFactor"
                computersSold.TrackValue(42, "Laptop");
                computersSold.TrackValue(20, "Tablet");
                computersSold.TrackValue(126, "Desktop");


                _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
                await Task.Delay(50, stoppingToken);
            }
        }

يؤدي تشغيل نموذج التعليمات البرمجية لمدة 60 ثانية على الأقل إلى إرسال ثلاثة عناصر مميزة لبيانات تتبع الاستخدام إلى Azure. يمثل كل عنصر تجميع أحد عوامل النموذج الثلاثة. كما كان الحال من قبل، يمكنك إجراء مزيد من الفحص في طريقة عرض السجلات (Analytics ).

Screenshot that shows the Log Analytics view of multidimensional metric.

في مستكشف المقاييس:

Screenshot that shows Custom metrics.

لاحظ أنه لا يمكنك تقسيم المقياس حسب بعدك المخصص الجديد أو عرض بعدك المخصص باستخدام طريقة عرض المقاييس.

Screenshot that shows splitting support.

بشكل افتراضي، لا يتم تشغيل المقاييس متعددة الأبعاد داخل مستكشف المقاييس في موارد Application Insights.

تمكين المقاييس متعددة الأبعاد

لتمكين المقاييس متعددة الأبعاد لمورد Application Insights، حدد Usage and estimated costs>Custom Metrics>Enable alerting on custom metric dimensions>OK. لمزيد من المعلومات، راجع أبعاد المقاييس المخصصة والتجميع المسبق.

بعد إجراء هذا التغيير وإرسال بيانات تتبع الاستخدام الجديدة متعددة الأبعاد، يمكنك تحديد تطبيق التقسيم.

إشعار

ولن تكون للمقاييس المرسلة حديثًا أبعاد مخزنة إلا بعد تشغيل الميزة في المدخل.

Screenshot that shows applying splitting.

عرض تجميعات المقاييس الخاصة بك لكل FormFactor بعد.

Screenshot that shows form factors.

استخدام MetricIdentifier عندما يكون هناك أكثر من ثلاثة أبعاد

حاليا، يتم دعم 10 أبعاد. يتطلب أكثر من ثلاثة أبعاد استخدام MetricIdentifier:

// Add "using Microsoft.ApplicationInsights.Metrics;" to use MetricIdentifier
// MetricIdentifier id = new MetricIdentifier("[metricNamespace]","[metricId],"[dim1]","[dim2]","[dim3]","[dim4]","[dim5]");
MetricIdentifier id = new MetricIdentifier("CustomMetricNamespace","ComputerSold", "FormFactor", "GraphicsCard", "MemorySpeed", "BatteryCapacity", "StorageCapacity");
Metric computersSold  = _telemetryClient.GetMetric(id);
computersSold.TrackValue(110,"Laptop", "Nvidia", "DDR4", "39Wh", "1TB");

تكوين قياس مخصص

إذا كنت ترغب في تغيير تكوين المقياس، يجب إجراء تعديلات في المكان الذي تتم فيه تهيئة المقياس.

أسماء الأبعاد الخاصة

لا تستخدم المقاييس سياق بيانات تتبع الاستخدام المستخدم TelemetryClient للوصول إليها. استخدام أسماء الأبعاد الخاصة المتوفرة كثوابت في MetricDimensionNames الفئة هو أفضل حل بديل لهذا القيد.

لن يتم Context.Operation.Name تعيين تجميعات المقاييس المرسلة بواسطة المقياس التالي Special Operation Request Size إلى Special Operation. TrackMetric() سيتم OperationName تعيين الأسلوب أو أي أسلوب آخر TrackXXX() بشكل صحيح إلى Special Operation.

        //...
        TelemetryClient specialClient;
        private static int GetCurrentRequestSize()
        {
            // Do stuff
            return 1100;
        }
        int requestSize = GetCurrentRequestSize()

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                //...
                specialClient.Context.Operation.Name = "Special Operation";
                specialClient.GetMetric("Special Operation Request Size").TrackValue(requestSize);
                //...
            }
                   
        }

في هذه الحالة، استخدم أسماء الأبعاد الخاصة المدرجة في MetricDimensionNames الفئة لتحديد TelemetryContext القيم.

على سبيل المثال، عند إرسال التجميع القياسي الناتج عن العبارة التالية إلى نقطة نهاية سحابة Application Insights، سيتم تعيين حقل البيانات الخاص به Context.Operation.Name إلى Special Operation:

_telemetryClient.GetMetric("Request Size", MetricDimensionNames.TelemetryContext.Operation.Name).TrackValue(requestSize, "Special Operation");

سيتم نسخ قيم هذا البعد الخاص في TelemetryContext ولن يتم استخدامها كبعد عادي . إذا كنت تريد أيضًا الاحتفاظ بأحد أبعاد العملية لاستكشاف المقاييس العادية، فإنك بحاجة إلى إنشاء بُعد منفصل لهذا الغرض:

_telemetryClient.GetMetric("Request Size", "Operation Name", MetricDimensionNames.TelemetryContext.Operation.Name).TrackValue(requestSize, "Special Operation", "Special Operation");

وضع حد أقصى للبعد والسلسلة الزمنية

لمنع النظام الفرعي لبيانات تتبع الاستخدام من استخدام مواردك عن طريق الخطأ، يمكنك التحكم في الحد الأقصى لعدد سلاسل البيانات لكل مقياس. لا تزيد الحدود الافتراضية عن 1000 سلسلة بيانات إجمالية لكل مقياس، ولا تزيد عن 100 قيمة مختلفة لكل بعد.

هام

استخدم القيم الأساسية المنخفضة للأبعاد من أجل تجنب التحكم بالنطاق الترددي.

نستخدم في سياق تحديد الأبعاد والسلاسل الزمنية Metric.TrackValue(..) للتأكد من مراعاة الحدود. إذا تم الوصول إلى الحدود بالفعل، Metric.TrackValue(..) فلن يتم تعقب الإرجاع False والقيمة. وإلا، فإنه يرجع True. يكون هذا مفيدًا إذا كانت بيانات القياس تنشأ من إدخال المستخدم.

يأخذ مُنشئ MetricConfiguration بعض الخيارات حول كيفية إدارة سلاسل مختلفة داخل المقياس المعني وكائن من فئة تنفذ IMetricSeriesConfiguration، والتي تحدد سلوك التجميع لكل سلسلة فردية من المقياس:

var metConfig = new MetricConfiguration(seriesCountLimit: 100, valuesPerDimensionLimit:2,
                new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: false));

Metric computersSold = _telemetryClient.GetMetric("ComputersSold", "Dimension1", "Dimension2", metConfig);

// Start tracking.
computersSold.TrackValue(100, "Dim1Value1", "Dim2Value1");
computersSold.TrackValue(100, "Dim1Value1", "Dim2Value2");

// The following call gives 3rd unique value for dimension2, which is above the limit of 2.
computersSold.TrackValue(100, "Dim1Value1", "Dim2Value3");
// The above call does not track the metric, and returns false.
  • seriesCountLimit هو الحد الأقصى لعدد سلاسل البيانات الزمنية التي يمكن أن يحتوي عليها المقياس. عند الوصول إلى هذا الحد، ستؤدي المكالمات إلى ذلك عادة إلى TrackValue() إرجاع falseسلسلة جديدة .
  • تحدد القيمة valuesPerDimensionLimit عدد القيم المميزة لكل بُعد بطريقة مماثلة.
  • تحدد القيم restrictToUInt32Values ما إذا كان يجب تتبع قيم الأعداد الصحيحة غير السالبة فقط أم لا.

فيما يلي مثال على كيفية إرسال رسالة لمعرفة ما إذا تم تجاوز نقطة الارتكاز القصوى أم لا:

if (! computersSold.TrackValue(100, "Dim1Value1", "Dim2Value3"))
{
// Add "using Microsoft.ApplicationInsights.DataContract;" to use SeverityLevel.Error
_telemetryClient.TrackTrace("Metric value not tracked as value of one of the dimension exceeded the cap. Revisit the dimensions to ensure they are within the limits",
SeverityLevel.Error);
}

الخطوات التالية