مراقبة تطبيق Azure BatchNET. وتصحيح أخطائه باستخدام Application Insights
يوفر Application Insights طريقة أنيقة وفعالة للمطورين لمراقبة التطبيقات التي تم توزيعها في خدمات Azure وتصحيحها. استخدم Application Insights لمراقبة عدادات الأداء والاستثناءات وكذلك صك التعليمات البرمجية الخاصة بك باستخدام القياسات المخصصة والتتبع. يتيح لك تكامل Application Insights مع تطبيق Azure Batch الخاص بك اكتساب رؤى عميقة للسلوكيات والتحقيق في المشكلات في الوقت الحقيقي تقريباً.
توضح هذه المقالة كيفية إضافة مكتبة Application Insights وتكوينها في حل Azure Batch .NET الخاص بك ووضع علامة على التعليمة البرمجية للتطبيق الخاص بك. يعرض أيضاً طرقاً لمراقبة تطبيقك عبر مدخل Microsoft Azure وإنشاء لوحات معلومات مخصصة. للحصول على دعم Application Insights بلغات أخرى، راجع وثائق اللغات والأنظمة الأساسية وعمليات التكامل.
يتوفر نموذج حل C# مع التعليمات البرمجية لمرافقة هذه المقالة على GitHub. يضيف هذا المثال شفرة أدوات Application Insights إلى مثال TopNWords. إذا لم تكن معتاداً على هذا المثال، فحاول إنشاء TopNWords وتشغيله أولاً. سيساعدك القيام بذلك على فهم سير عمل الدُفعات الأساسي لمعالجة مجموعة من نقاط الإدخال بشكل متوازٍ على عُقد حوسبة متعددة.
المتطلبات الأساسية
Visual Studio 2017 أو إصدار أحدث
مورد Application Insights. استخدم مدخل Microsoft Azure لإنشاء موردApplication Insights. حدد GeneralApplication type.
انسخ instrumentation key من مدخل Microsoft Azure. ستحتاج هذه القيمة لاحقاً.
إشعار
قد يتم تحصيل رسوم منك مقابل البيانات المخزنة في Application Insights. يتضمن هذا بيانات التشخيص والمراقبة التي تمت مناقشتها في هذه المقالة.
إضافة Application Insights إلى مشروعك
حزمة Microsoft.ApplicationInsights.WindowsServer NuGet وتبعياتها مطلوبة لمشروعك. قم بإضافتها أو استعادتها إلى مشروع التطبيق الخاص بك. لتثبيت الحزمة، استخدم الأمر Install-Package
أو NuGet Package Manager.
Install-Package Microsoft.ApplicationInsights.WindowsServer
يمكنك الرجوع إلى Application Insights من تطبيق NET. الخاص بك باستخدام مساحة الاسم Microsoft.ApplicationInsights.
صك التعليمة البرمجية الخاص بك
لأداة التعليمات البرمجية الخاصة بك، يحتاج الحل الخاص بك إلى إنشاء Application Insights TelemetryClient. في المثال، يقوم TelemetryClient بتحميل تهيئته من ملف ApplicationInsights.config. تأكد من تحديث ApplicationInsights.config في المشاريع التالية باستخدام مفتاح أدوات Application Insights الخاص بك: Microsoft.Azure.Batch.Samples.TelemetryStartTask وTopNWordsSample.
<InstrumentationKey>YOUR-IKEY-GOES-HERE</InstrumentationKey>
أضف أيضاً مفتاح الأجهزة في الملف TopNWords.cs.
يستخدم المثال في TopNWords.cs استدعاءات الأجهزة التالية من Application Insights API:
TrackMetric()
- يتتبع متوسط الوقت الذي تستغرقه عقدة الحساب لتنزيل الملف النصي المطلوب.TrackTrace()
- يضيف مكالمات تصحيح الأخطاء إلى شفرتك.TrackEvent()
- تتبع الأحداث الشائقة لالتقاطها.
هذا المثال يتجاهل عن قصد معالجة الاستثناءات. بدلاً من ذلك، يقوم Application Insights بالإبلاغ تلقائياً عن الاستثناءات التي لم تتم معالجتها، ما يؤدي إلى تحسين تجربة تصحيح الأخطاء بشكل ملحوظ.
يوضح القصاصة البرمجية التالية كيفية استخدام هذه الطرق.
public void CountWords(string blobName, int numTopN, string storageAccountName, string storageAccountKey)
{
// simulate exception for some set of tasks
Random rand = new Random();
if (rand.Next(0, 10) % 10 == 0)
{
blobName += ".badUrl";
}
// log the url we are downloading the file from
insightsClient.TrackTrace(new TraceTelemetry(string.Format("Task {0}: Download file from: {1}", this.taskId, blobName), SeverityLevel.Verbose));
// open the cloud blob that contains the book
var storageCred = new StorageCredentials(storageAccountName, storageAccountKey);
CloudBlockBlob blob = new CloudBlockBlob(new Uri(blobName), storageCred);
using (Stream memoryStream = new MemoryStream())
{
// calculate blob download time
DateTime start = DateTime.Now;
blob.DownloadToStream(memoryStream);
TimeSpan downloadTime = DateTime.Now.Subtract(start);
// track how long the blob takes to download on this node
// this will help debug timing issues or identify poorly performing nodes
insightsClient.TrackMetric("Blob download in seconds", downloadTime.TotalSeconds, this.CommonProperties);
memoryStream.Position = 0; //Reset the stream
var sr = new StreamReader(memoryStream);
var myStr = sr.ReadToEnd();
string[] words = myStr.Split(' ');
// log how many words were found in the text file
insightsClient.TrackTrace(new TraceTelemetry(string.Format("Task {0}: Found {1} words", this.taskId, words.Length), SeverityLevel.Verbose));
var topNWords =
words.
Where(word => word.Length > 0).
GroupBy(word => word, (key, group) => new KeyValuePair<String, long>(key, group.LongCount())).
OrderByDescending(x => x.Value).
Take(numTopN).
ToList();
foreach (var pair in topNWords)
{
Console.WriteLine("{0} {1}", pair.Key, pair.Value);
}
// emit an event to track the completion of the task
insightsClient.TrackEvent("Done counting words");
}
}
مساعد مهيئ القياس عن بُعد Azure Batch
عند الإبلاغ عن التتبع عن بُعد لخادم ومثيل معين، تستخدم Application Insights دور جهاز Azure الظاهري واسم الجهاز الظاهري للقيم الافتراضية. في سياق Azure Batch، يوضح المثال كيفية استخدام اسم التجمع واحتساب اسم العقدة بدلاً من ذلك. استخدم telemetry initializer لتجاوز القيم الافتراضية.
using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.Extensibility;
using System;
using System.Threading;
namespace Microsoft.Azure.Batch.Samples.TelemetryInitializer
{
public class AzureBatchNodeTelemetryInitializer : ITelemetryInitializer
{
// Azure Batch environment variables
private const string PoolIdEnvironmentVariable = "AZ_BATCH_POOL_ID";
private const string NodeIdEnvironmentVariable = "AZ_BATCH_NODE_ID";
private string roleInstanceName;
private string roleName;
public void Initialize(ITelemetry telemetry)
{
if (string.IsNullOrEmpty(telemetry.Context.Cloud.RoleName))
{
// override the role name with the Azure Batch Pool name
string name = LazyInitializer.EnsureInitialized(ref this.roleName, this.GetPoolName);
telemetry.Context.Cloud.RoleName = name;
}
if (string.IsNullOrEmpty(telemetry.Context.Cloud.RoleInstance))
{
// override the role instance with the Azure Batch Compute Node name
string name = LazyInitializer.EnsureInitialized(ref this.roleInstanceName, this.GetNodeName);
telemetry.Context.Cloud.RoleInstance = name;
}
}
private string GetPoolName()
{
return Environment.GetEnvironmentVariable(PoolIdEnvironmentVariable) ?? string.Empty;
}
private string GetNodeName()
{
return Environment.GetEnvironmentVariable(NodeIdEnvironmentVariable) ?? string.Empty;
}
}
}
لتمكين مُهيئ القياس عن بُعد، يتضمن ملف ApplicationInsights.config في مشروع TopNWordsSample ما يلي:
<TelemetryInitializers>
<Add Type="Microsoft.Azure.Batch.Samples.TelemetryInitializer.AzureBatchNodeTelemetryInitializer, Microsoft.Azure.Batch.Samples.TelemetryInitializer"/>
</TelemetryInitializers>
قم بتحديث الوظيفة والمهام لتضمين ثنائيات Application Insights
من أجل تشغيل Application Insights بشكل صحيح على عُقد الحوسبة، تأكد من وضع الثنائيات بشكل صحيح. أضف الثنائيات المطلوبة إلى مجموعة ملفات موارد المهمة الخاصة بك حتى يتم تنزيلها في الوقت الذي يتم فيه تنفيذ مهمتك. المقتطفات التالية تشبه التعليمات البرمجية الموجودة في Job.cs.
أولاً، أنشئ قائمة ثابتة لملفات Application Insights لتحميلها.
private static readonly List<string> AIFilesToUpload = new List<string>()
{
// Application Insights config and assemblies
"ApplicationInsights.config",
"Microsoft.ApplicationInsights.dll",
"Microsoft.AI.Agent.Intercept.dll",
"Microsoft.AI.DependencyCollector.dll",
"Microsoft.AI.PerfCounterCollector.dll",
"Microsoft.AI.ServerTelemetryChannel.dll",
"Microsoft.AI.WindowsServer.dll",
// custom telemetry initializer assemblies
"Microsoft.Azure.Batch.Samples.TelemetryInitializer.dll",
};
...
بعد ذلك، قم بإنشاء ملفات التدريج التي تستخدمها المهمة.
...
// create file staging objects that represent the executable and its dependent assembly to run as the task.
// These files are copied to every node before the corresponding task is scheduled to run on that node.
FileToStage topNWordExe = new FileToStage(TopNWordsExeName, stagingStorageAccount);
FileToStage storageDll = new FileToStage(StorageClientDllName, stagingStorageAccount);
// Upload Application Insights assemblies
List<FileToStage> aiStagedFiles = new List<FileToStage>();
foreach (string aiFile in AIFilesToUpload)
{
aiStagedFiles.Add(new FileToStage(aiFile, stagingStorageAccount));
}
...
الطريقة FileToStage
هي وظيفة مساعدة في نموذج التعليمات البرمجية تسمح لك بتحميل ملف بسهولة من قرص محلي إلى كائن تخزين ثنائي Azure blob. يتم تنزيل كل ملف لاحقاً إلى عقدة حسابية وتتم الإشارة إليه بواسطة مهمة.
أخيراً، أضف المهام إلى الوظيفة وقم بتضمين الثنائيات الضرورية لتطبيق "Application Insights".
...
// initialize a collection to hold the tasks that will be submitted in their entirety
List<CloudTask> tasksToRun = new List<CloudTask>(topNWordsConfiguration.NumberOfTasks);
for (int i = 1; i <= topNWordsConfiguration.NumberOfTasks; i++)
{
CloudTask task = new CloudTask("task_no_" + i, String.Format("{0} --Task {1} {2} {3} {4}",
TopNWordsExeName,
string.Format("https://{0}.blob.core.windows.net/{1}",
accountSettings.StorageAccountName,
documents[i]),
topNWordsConfiguration.TopWordCount,
accountSettings.StorageAccountName,
accountSettings.StorageAccountKey));
//This is the list of files to stage to a container -- for each job, one container is created and
//files all resolve to Azure Blobs by their name (so two tasks with the same named file will create just 1 blob in
//the container).
task.FilesToStage = new List<IFileStagingProvider>
{
// required application binaries
topNWordExe,
storageDll,
};
foreach (FileToStage stagedFile in aiStagedFiles)
{
task.FilesToStage.Add(stagedFile);
}
task.RunElevated = false;
tasksToRun.Add(task);
}
عرض البيانات في مدخل Azure
الآن بعد أن قمت بتكوين الوظيفة والمهام لاستخدام Application Insights، قم بتشغيل مثال الوظيفة في مجموعتك. انتقل إلى مدخل Microsoft Azure وافتح مورد Application Insights الذي قمت بتوفيره. بعد توفير التجمع، يجب أن تبدأ في رؤية تدفق البيانات وتسجيلها. تتطرق بقية هذه المقالة إلى عدد قليل من ميزات Application Insights، ولكن لا تتردد في استكشاف مجموعة الميزات الكاملة.
عرض بيانات البث المباشر
لعرض سجلات التتبع في مورد Applications Insights، انقر على Live Stream. توضح لقطة الشاشة التالية كيفية عرض البيانات الحية القادمة من عُقد الحوسبة في التجمع، على سبيل المثال استخدام وحدة المعالجة المركزية لكل عقدة حسابية.
عرض سجلات التتبع
لعرض سجلات التتبع في مورد Applications Insights، انقر فوق Search. تُظهر طريقة العرض هذه قائمة ببيانات التشخيص التي تم التقاطها بواسطة Application Insights بما في ذلك عمليات التتبع والأحداث والاستثناءات.
توضح لقطة الشاشة التالية كيف يتم تسجيل تتبع واحد لمهمة ما ثم الاستعلام عنه لاحقاً لأغراض التصحيح.
عرض الاستثناءات التي لم تتم معالجتها
تسجل Application Insights الاستثناءات التي تم إلقاؤها من تطبيقك. في هذه الحالة، في غضون ثوانٍ من طرح التطبيق للاستثناء، يمكنك البحث في استثناء معين وتشخيص المشكلة.
قياس وقت تنزيل blob
تعتبر القياسات المخصصة أيضاً أداة قيمة في المدخل. على سبيل المثال، يمكنك عرض متوسط الوقت الذي استغرقته كل عقدة حسابية لتنزيل الملف النصي المطلوب الذي كانت تقوم بمعالجته.
لإنشاء مخطط عينة:
- في مورد Application Insights، انقر على Metrics Explorer>Add chart.
- انقر فوق Edit على الرسم البياني الذي تمت إضافته.
- تحديث تفاصيل المخطط كما يلي:
- عيّن Chart type على Grid.
- عيّن Aggregation على Average .
- عيّن Group by إلى NodeId.
- في Metrics، حدد Custom>Blob download in seconds.
- اضبط طريقة عرض Color palette وفقاً لاختيارك.
مراقبة عُقد الحساب بشكل مستمر
ربما لاحظت أن جميع القياسات، بما في ذلك عدادات الأداء، يتم تسجيلها فقط عند تشغيل المهام. هذا السلوك مفيد لأنه يحد من كمية البيانات التي تسجلها Application Insights. ومع ذلك، هناك حالات ترغب فيها دائماً في مراقبة عُقد الحوسبة. على سبيل المثال، قد يقومون بتشغيل عمل في الخلفية لم تتم جدولته عبر خدمة Batch. في هذه الحالة، قم بإعداد عملية مراقبة للتشغيل طوال عمر عقدة الحساب.
تتمثل إحدى طرق تحقيق هذا السلوك في إنتاج عملية تقوم بتحميل مكتبة Application Insights وتشغيلها في الخلفية. في المثال، تقوم مهمة البدء بتحميل الثنائيات على الجهاز وتحافظ على تشغيل العملية إلى أجل غير مسمى. قم بتكوين ملف تكوين Application Insights لهذه العملية لإرسال بيانات إضافية تهتم بها، مثل عدادات الأداء.
...
// Batch start task telemetry runner
private const string BatchStartTaskFolderName = "StartTask";
private const string BatchStartTaskTelemetryRunnerName = "Microsoft.Azure.Batch.Samples.TelemetryStartTask.exe";
private const string BatchStartTaskTelemetryRunnerAIConfig = "ApplicationInsights.config";
...
CloudPool pool = client.PoolOperations.CreatePool(
topNWordsConfiguration.PoolId,
targetDedicated: topNWordsConfiguration.PoolNodeCount,
virtualMachineSize: "standard_d1_v2",
VirtualMachineConfiguration: new VirtualMachineConfiguration(
imageReference: new ImageReference(
publisher: "MicrosoftWindowsServer",
offer: "WindowsServer",
sku: "2019-datacenter-core",
version: "latest"),
nodeAgentSkuId: "batch.node.windows amd64");
...
// Create a start task which will run a dummy exe in background that simply emits performance
// counter data as defined in the relevant ApplicationInsights.config.
// Note that the waitForSuccess on the start task was not set so the Compute Node will be
// available immediately after this command is run.
pool.StartTask = new StartTask()
{
CommandLine = string.Format("cmd /c {0}", BatchStartTaskTelemetryRunnerName),
ResourceFiles = resourceFiles
};
...
تلميح
لزيادة إمكانية إدارة الحل الخاص بك، يمكنك تجميع التجميع في حزمة التطبيق. بعد ذلك، لنشر حزمة التطبيق تلقائياً في مجموعاتك، أضف مرجع حزمة التطبيق إلى تكوين التجمع.
التقييد ونموذج البيانات
نظراً لطبيعة النطاق الواسع لتطبيقات Azure Batch التي تعمل في الإنتاج، فقد ترغب في تحديد كمية البيانات التي يتم جمعها بواسطة Application Insights لإدارة التكاليف. راجع أخذ العينات في Application Insights للتعرّف على بعض الآليات لتحقيق ذلك.
الخطوات التالية
- تعرّف على المزيد حول Application Insights.
- للحصول على دعم Application Insights بلغات أخرى، راجع وثائق اللغات والأنظمة الأساسية وعمليات التكامل.