هناك طريقة أخرى لقياس أداء أساليب تطبيق .NET


غالبًا ما يكون من الضروري جمع إحصائيات حول أداء طرق التطبيق في الوقت الفعلي (عندما يكون التطبيق قيد التشغيل بالفعل) لتحديد اختناقاته ومعرفة أي جزء من التطبيق يتباطأ.


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


حسنًا ، يمكن اعتبار "الكرز على الكعكة" راحة وبساطة الأداة المستخدمة ، وهو أمر مهم أيضًا.


لحل هذه المشكلات ، تم تطوير مكتبة .NET مفتوحة المصدر عبر النظام الأساسي Unchase.FluentPerformanceMeter .


مقدمة


لذلك ، هذه المقالة هي وصف للعمل مع Unchase Fluent Performance Meter ، وهي مكتبة مفتوحة المصدر مفتوحة المصدر .Net Standard 2.0 مصممة لحساب أداء الطرق.


يمكن استخدام المكتبة في تطبيقات .NET Core و .NET Framework التي تدعم .Net Standard 2.0 ، وتتيح:


  • إجراء قياسات دقيقة لأداء الطرق العامة للفئات العامة لكل من الكود الخاص بك ورمز المكتبات المستخدمة (مع تحديد الوقت المحدد لبداية ونهاية القياس) ؛
  • أضف بيانات إضافية (بيانات مخصصة) لنتائج القياس. على سبيل المثال ، قيم معلمات الإدخال للطريقة والنتيجة ؛ أو بيانات سياق تنفيذ الأسلوب ؛ أو corellationId ، حيث سيكون من الممكن ربط عدة قياسات لأداء الطرق ؛
  • قسّم قياس أداء الطريقة إلى خطوات منفصلة (خطوات) مع تحديد البيانات الخاصة بكل خطوة. بالإضافة إلى ذلك ، يمكنك تعيين الحد الأدنى لوقت التشغيل ، الذي ستؤخذ منه الخطوة في الاعتبار في القياس (إذا اكتملت الخطوة بشكل أسرع ، فلن يتم قياسها) ؛
  • استبعاد الأجزاء الفردية من الشفرة من قياس الأداء (على سبيل المثال ، المكالمات إلى الأساليب الفردية التي لا يلزم أن يؤخذ وقت تنفيذها في الاعتبار عند القياس) ؛
  • أضف الأوامر (الأوامر) الخاصة بك ، والتي يُضمن تنفيذها فورًا بعد نهاية قياس أداء الطريقة (على سبيل المثال ، لإضافة معالجة إضافية للنتائج التي تم الحصول عليها ، مثل تسجيل البيانات أو كتابتها إلى وحدة التخزين) ؛
  • أضف معالج الاستثناء الخاص بك للرمز الذي تم تنفيذه في سياق قياس أداء الطريقة (كلاهما شائع لجميع القياسات ، ولكل قياس على حدة) ؛
  • ضبط الوقت لتخزين نتائج قياسات إنتاجية الطرق ، وبعد ذلك سيتم حذف النتائج ؛
  • أضف بيانات حول من الذي يتصل بالطريقة (المتصل) عبر وظيفة IHttpContextAccesor أو Caller في الكود إلى نتائج القياس (على سبيل المثال ، يمكنك تحديد اسم الخدمة الخارجية التي تسمى الطريقة) ؛
  • إضافة إلى بيانات نتائج القياس في المكان الذي بدأ فيه قياس الأداء (اسم الملف ورقم السطر مع موقع الاتصال في الكود) ؛
  • مقاطعة قياس أداء الأسلوب قبل نهاية تنفيذه .

يمكن استخدام البيانات التي تم الحصول عليها نتيجة لقياس أداء الطرق لتحليل أداء التطبيق (أجزائه الفردية ، سواء الداخلية - الكود الخاص بها ، أو الخارجية - رمز المكتبات المستخدمة) وعرضها في شكل رسومي مناسب لك.


محتوى



الابتداء


لاستخدام المكتبة ، قم بتثبيت حزمة NuGet في مشروعك:


استخدام مدير حزمة NuGet يدويًا:


Install-Package Unchase.FluentPerformanceMeter 

باستخدام .NET CLI:


 dotnet add package Unchase.FluentPerformanceMeter --version {version} 

حيث {version} هو إصدار الحزمة التي تريد تثبيتها.
على سبيل المثال ، dotnet add package Unchase.FluentPerformanceMeter --version 1.0.0

أمثلة الاستخدام


طريقة قياس الأداء


فيما يلي مثال بسيط على استخدام المكتبة (بدون التكوين والإعدادات الإضافية) لقياس أداء SimpleWatchingMethodStart (الإجراء) SimpleWatchingMethodStart تحكم SimpleWatchingMethodStart (المراقب) PerformanceMeterController Asp.Net Core 2.2 WebAPI . للقيام بذلك ، يمكنك استخدام طريقة التمديد .WatchingMethod().Start() أو وظيفة مشابهة .StartWatching() .
منذ الإصدار 1.0 ، يمكنك أيضًا استخدام .WatchingMethod().Start(SimpleWatchingMethodStart) أو .StartWatching(SimpleWatchingMethodStart) مع اسم الطريقة.


يمكن العثور على جميع أمثلة استخدام المكتبة في مشاريع Unchase.FluentPerformanceMeter.Test* الخاصة بهذا المستودع .

 /// <summary> /// Test GET method with simple performance watching. /// </summary> [HttpGet("SimpleWatchingMethodStart")] public ActionResult SimpleWatchingMethodStart() { // for C# 8 you can use: //using var pm = PerformanceMeter<PerformanceMeterController>.StartWatching(); using (PerformanceMeter<PerformanceMeterController>.WatchingMethod().Start()) { // put your code with some logic here return Ok(); } } 

للحصول على نتائج قياسات الأداء من الأساليب العامة لفئة تحكم PerformanceMeterController ، يمكنك استدعاء الأسلوب التالي:


 /// <summary> /// Get methods performance info for this controller. /// </summary> /// <returns>Returns methods performance info.</returns> [HttpGet("GetPerformanceInfo")] [IgnoreMethodPerformance] public ActionResult<IPerformanceInfo> GetPerformanceInfo() { return Ok(PerformanceMeter<PerformanceMeterController>.PerformanceInfo); } 

بعد استدعاء أسلوب SimpleWatchingMethodStart عند استدعاء GetPerformanceInfo نحصل على:


 { "methodCalls": [ { "methodName": "SimpleWatchingMethodStart", "elapsed": "00:00:00.0016350", "caller": "unknown", "startTime": "2019-12-06T10:27:27.3385385Z", "endTime": "2019-12-06T10:27:27.3401735Z", "customData": {}, "steps": [] } ], "totalActivity": [ { "methodName": "SimpleWatchingMethodStart", "callsCount": 1 } ], "currentActivity": [ { "methodName": "SimpleWatchingMethodStart", "callsCount": 0 } ], "uptimeSince": "2019-12-06T10:27:27.3370183Z", "className": "Unchase.FluentPerformanceMeter.TestWebAPI.Controllers.PerformanceMeterController", "methodNames": [ "SimpleWatchingMethodStart" ], "customData": {}, "timerFrequency": 10000000 } 

طريقة قياس الأداء باستخدام DiagnosticSource


بدءًا من الإصدار v1.1.0 ، أصبح من الممكن قياس أداء الطرق في تطبيق AspNetCore MVC باستخدام DiagnosticSource وسمة WatchingWithDiagnosticSourceAttribute الخاصة.
للقيام بذلك ، قم بإضافة حزمة Unchase.FluentPerformanceMeter.AspNetCore.Mvc إلى مشروع NuGet وإضافة التعليمة البرمجية التالية إلى Startap.cs :


 public void ConfigureServices(IServiceCollection services) { // ... // allows to measure methods performance for class "MeasurableClass" and "MeasurableSecondClass" services.AddPerformanceDiagnosticObserver<MeasurableClass>(); services.AddPerformanceDiagnosticObserver<MeasurableSecondClass>(); // ... the same for another classes services.AddMvc(); // ... } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { // ... app.UsePerformanceDiagnosticObserver(); app.UseMvc(); } 

ثم حدد باستخدام السمة WatchingWithDiagnosticSourceAttribute أو الطرق الفردية:


 [HttpGet("SimpleWatchingMethodStart")] [WatchingWithDiagnosticSource] public ActionResult SimpleWatchingMethodStart() { return Ok(); } 

أو الفصل بأكمله:


 [ApiController] [Route("api/v1/[controller]")] [Produces("application/json")] [SwaggerTag("Unchase.PerformanceMeter Test WebAPI Controller")] [WatchingWithDiagnosticSource] public class PerformanceMeterController : ControllerBase { // measurable methods } 

بدءًا من الإصدار v1.2.0 ، أصبح من الممكن إضافة وسائط استدعاء إلى بيانات قياس أداء طريقة المستخدم في تطبيق AspNetCore MVC باستخدام سمة AddMethodArgumentsToCustomDataAttribute الخاصة بالتزامن مع سمة WatchingWithDiagnosticSourceAttribute :


 [HttpPost("SimpleWatchingMethodStartWithArgs")] [WatchingWithDiagnosticSource] [AddMethodArgumentsToCustomData("actionArguments")] public ActionResult SimpleWatchingMethodStartWithArgs(DTOArgument arg) { return Ok(); } 

بعد استدعاء الأسلوب SimpleWatchingMethodStartWithArgs عند استدعاء GetPerformanceInfo نحصل على:


 { "methodCalls": [ { "methodName": "SimpleWatchingMethodStartWithArgs", "elapsed": "00:00:00.0016350", "caller": "unknown", "startTime": "2019-12-06T10:27:27.3385385Z", "endTime": "2019-12-06T10:27:27.3401735Z", "customData": { "actionArguments": { "arg": { "data": "<string_in_DTOArgument>" } } }, "steps": [] } ], "totalActivity": [ { "methodName": "SimpleWatchingMethodStartWithArgs", "callsCount": 1 } ], "currentActivity": [ { "methodName": "SimpleWatchingMethodStartWithArgs", "callsCount": 0 } ], "uptimeSince": "2019-12-06T10:27:27.3370183Z", "className": "Unchase.FluentPerformanceMeter.TestWebAPI.Controllers.PerformanceMeterController", "methodNames": [ "SimpleWatchingMethodStartWithArgs" ], "customData": {}, "timerFrequency": 10000000 } 

قياس أداء الطريقة التي تستخدمها المكتبة


لقياس أداء الطريقة العامة للفئة العامة لمكتبة الطرف الثالث المستخدمة ، يجب عليك تعيين الفئة نفسها بشكل واضح واسم طريقتها:


 [HttpGet("GetThreadSleepPerformance")] public ActionResult<string> GetThreadSleepPerformance() { using (PerformanceMeter<Thread>.WatchingMethod(nameof(Thread.Sleep)).Start()) { Thread.Sleep(1000); } return Ok(PerformanceMeter<Thread>.PerformanceInfo.MethodCalls.FirstOrDefault(ta => ta.MethodName == nameof(Thread.Sleep))?.Elapsed); } 

ستعود الطريقة المنفذة:


 "00:00:01.0033040" 

يمكنك الحصول على بيانات حول الاتصال بهذه الطريقة من خلال مكالمة:


 /// <summary> /// Get methods performance info for Thread class. /// </summary> /// <returns>Returns Thread methods performance info.</returns> [HttpGet("GetThreadPerformanceInfo")] [IgnoreMethodPerformance] public ActionResult<IPerformanceInfo> GetThreadPerformanceInfo() { return Ok(PerformanceMeter<Thread>.PerformanceInfo); } 

تم IgnoreMethodPerformance سمة IgnoreMethodPerformance بحيث لا تؤخذ الطريقة التي IgnoreMethodPerformance في الاعتبار عند قياس الأداء.

استجابةً للدعوة إلى هذه الطريقة ستكون:


 { "methodCalls": [ { "methodName": "Sleep", "elapsed": "00:00:01.0033040", "caller": "unknown", "startTime": "2019-12-06T13:08:09.336624Z", "endTime": "2019-12-06T13:08:10.339928Z", "customData": {}, "steps": [] } ], "totalActivity": [ { "methodName": "Abort", "callsCount": 0 }, // ... { "methodName": "Sleep", "callsCount": 1 } // ... ], "currentActivity": [ { "methodName": "Abort", "callsCount": 0 }, // ... { "methodName": "Sleep", "callsCount": 1 } // ... ], "uptimeSince": "2019-12-06T13:08:09.3357028Z", "className": "System.Threading.Thread", "methodNames": [ "Abort", // ... "Sleep", // ... ], "customData": {}, "timerFrequency": 10000000 } 

إضافة بيانات إضافية (بيانات مخصصة) وترقيم الصفحات (خطوات)


يمكنك إضافة بيانات إضافية (بيانات مخصصة) لجميع قياسات الأداء لطرق فئة معينة. على سبيل المثال ، في المنشئ الثابت لفئة تحكم PerformanceMeterController :


 [ApiController] [Route("api/v1/[controller]")] public class PerformanceMeterController : ControllerBase { /// <summary> /// Static constructor. /// </summary> static PerformanceMeterController() { // add common custom data (string) to class performance information PerformanceMeter<PerformanceMeterController>.AddCustomData("Tag", "CustomTag"); // add common custom data (anonymous class) to class performance information PerformanceMeter<PerformanceMeterController>.AddCustomData("Custom anonymous class", new { Name = "Custom Name", Value = 1 }); } // ... actions } 

بالإضافة إلى ذلك ، يمكنك إضافة بيانات إضافية (بيانات مخصصة) لقياس معين باستخدام طريقة التمديد .WithSettingData.CustomData("<key>", <value>) (بما في ذلك من خلال سمة خاصة لطريقة MethodCustomDataAttribute ) ولكل خطوة (الخطوة ) من هذا القياس ، تمت إضافته باستخدام .Step("<step_name>") ملحق .Step("<step_name>") ، باستخدام .AddCustomData("<key>", <value>) ملحق .AddCustomData("<key>", <value>) :


 /// <summary> /// Test GET method with simple performance watching (with steps). /// </summary> [HttpGet("SimpleStartWatchingWithSteps")] [MethodCustomData("Custom data from attribute", "Attr")] public ActionResult SimpleStartWatchingWithSteps() { using (var pm = PerformanceMeter<PerformanceMeterController> .WatchingMethod() .WithSettingData .CustomData("coins", 1) .CustomData("Coins sets", new { Gold = "Many", Silver = 5 }) .Start()) { // put your code with some logic here // add "Step 1" using (pm.Step("Step 1")) { Thread.Sleep(1000); } // add "Step 2" with custom data using (var pmStep = pm.Step("Step 2").AddCustomData("step2 custom data", "data!")) { // add "Step 3 in Step 2" using (pm.Step("Step 3 in Step 2")) { Thread.Sleep(1000); } // add custom data to "Step 2" pmStep.AddCustomData("step2 another custom data", "data2!"); // get and remove custom data from "Step 2" var customData = pmStep.GetAndRemoveCustomData<string>("step2 custom data"); // get custom data from "Step 2" (without removing) var anotherCustomData = pmStep.GetCustomData<string>("step2 another custom data"); // ... } } } 

نتيجة لذلك ، عند الاتصال بـ GetPerformanceInfo نحصل على:


 { "methodCalls": [ { "methodName": "SimpleStartWatchingWithSteps", "elapsed": "00:00:02.0083031", "caller": "unknown", "startTime": "2019-12-06T11:58:18.9006891Z", "endTime": "2019-12-06T11:58:20.9089922Z", "customData": { "Coins sets": { "gold": "Many", "silver": 5 }, "coins": 1, "Custom data from attribute": "Attr" }, "steps": [ { "stepName": "Step 1", "elapsed": "00:00:01.0009758", "startTime": "2019-12-06T11:58:18.9018272Z", "endTime": "2019-12-06T11:58:19.902803Z", "customData": {} }, { "stepName": "Step 3 in Step 2", "elapsed": "00:00:01.0004549", "startTime": "2019-12-06T11:58:19.9046523Z", "endTime": "2019-12-06T11:58:20.9051072Z", "customData": {} }, { "stepName": "Step 2", "elapsed": "00:00:01.0029596", "startTime": "2019-12-06T11:58:19.904534Z", "endTime": "2019-12-06T11:58:20.9074936Z", "customData": { "step2 another custom data": "data2!" } } ] } ], "totalActivity": [ { "methodName": "SimpleStartWatchingWithSteps", "callsCount": 1 } ], "currentActivity": [ { "methodName": "SimpleStartWatchingWithSteps", "callsCount": 0 } ], "uptimeSince": "2019-12-06T11:58:18.8801249Z", "className": "Unchase.FluentPerformanceMeter.TestWebAPI.Controllers.PerformanceMeterController", "methodNames": [ "SimpleStartWatchingWithSteps" ], "customData": { "Tag": "CustomTag", "Custom anonymous class": { "name": "Custom Name", "value": 1 } }, "timerFrequency": 10000000 } 

استثناء من القياس (تجاهل)


يمكنك تجاهل أجزاء فردية من الطريقة في قياس الأداء (باستخدام .Ignore() أو .Executing().WithoutWatching().Start(<Action>) ) ، وكذلك لا تقم بحفظ الخطوات الفردية (طريقة الامتداد .StepIf("<step_name>", <minSaveMs>) ) إذا كانت لا تفي بالشرط (سيتم أخذ وقت تنفيذ الخطوة في الاعتبار في وقت تنفيذ الطريقة):


 using (var pm = PerformanceMeter<PerformanceMeterController>.WatchingMethod().Start()) { // put your code with some logic here // sleep 1 sec Thread.Sleep(1000); // ignore this block in performance watching using (pm.Ignore()) { Thread.Sleep(5000); } // skip this step with minSaveMs (not save, but consider duration in method performance watching) using (pm.StepIf("Skipped step", minSaveMs: 1000)) { Thread.Sleep(500); } // execute action without performance watching pm.Executing().WithoutWatching().Start(() => { Thread.Sleep(2000); }); return Ok(); } 

نتيجة لذلك ، نحصل على:


 { "methodCalls": [ { "methodName": "SimpleStartWatchingWithIgnored", "elapsed": "00:00:01.5080227", "caller": "unknown", "startTime": "2019-12-06T12:34:36.9187359Z", "endTime": "2019-12-06T12:34:38.4267586Z", "customData": {}, "steps": [] } ], "totalActivity": [ { "methodName": "SimpleStartWatchingWithIgnored", "callsCount": 1 } ], "currentActivity": [ { "methodName": "SimpleStartWatchingWithIgnored", "callsCount": 0 } ], "uptimeSince": "2019-12-06T12:34:36.9035129Z", "className": "Unchase.FluentPerformanceMeter.TestWebAPI.Controllers.PerformanceMeterController", "methodNames": [ "SimpleStartWatchingWithIgnored" ], "customData": { }, "timerFrequency": 10000000 } 

مضيفا الأوامر والإجراءات


لإضافة أمر سيتم ضمان تنفيذه عند الانتهاء من قياس أداء إحدى الطرق ، يجب عليك إنشاء فئة أوامر ستقوم بتنفيذ واجهة IPerformanceCommand .
في الوقت نفسه ، يمكنك نقل البيانات التعسفية من خلال مُنشئ الأمر الذي تم إنشاؤه والذي سيتم استخدامه أثناء تنفيذه. على سبيل المثال:


 /// <summary> /// Custom executed command. /// </summary> public class ExecutedCommand : IPerformanceCommand { /// <summary> /// Executed commad name. /// </summary> public string CommandName => this.GetType().Name; private string _customString { get; } internal bool IsCommandExecuted { get; private set; } /// <summary> /// Constructor. /// </summary> /// <remarks> /// You can pass any data through the command constructor. /// </remarks> /// <param name="customString"></param> public ExecutedCommand(string customString) { this._customString = customString; } /// <summary> /// Execute command. /// </summary> /// <param name="performanceInfo"><see cref="IPerformanceInfo"/>.</param> public void Execute(IPerformanceInfo performanceInfo) { // for example, write to the debug console some information Debug.WriteLine(this.CommandName); Debug.WriteLine(this._customString); Debug.WriteLine($"Method names count: {performanceInfo.MethodNames.Count}"); this.IsCommandExecuted = true; } } 

يمكنك إضافة أمر (IPerformanceCommand) وإجراء (Action) بحيث يتم تنفيذهما في نهاية القياس ، بالطريقة التالية:


 // custom "ExecutedCommand" will be executed after performance watching is completed using (PerformanceMeter<PerformanceMeterController> .WatchingMethod() .WithExecutingOnComplete .Command(new ExecutedCommand("bla-bla-bla")) .Action((pi) => { Debug.WriteLine($"Class name: {pi.ClassName}"); }) .Start()) { return Ok(); } 

نتيجة لذلك ، في نهاية قياس أداء الطريقة في وحدة التحكم Debug ، ستعرض:


 ExecutedCommand bla-bla-bla Method names count: 13 Class name: Unchase.FluentPerformanceMeter.TestWebAPI.Controllers.PerformanceMeterController 

مضيفا معالجات الاستثناءات


إذا كنت بحاجة إلى معالجة الاستثناءات التي قد تحدث أثناء تنفيذ جزء من الطريقة التي يتم بها مراقبة الأداء ، فستحتاج إلى إضافة معالج استثناء كما يلي:


 using (var pm = PerformanceMeter<PerformanceMeterController>.StartWatching()) { // execute action throws Exception with exception handler pm.Executing() .WithExceptionHandler((ex) => Debug.WriteLine(ex.Message)) .Start(() => throw new Exception("Exception")); // execute action throws custom Exception with exception handler pm.Executing<CustomException>() .WithExceptionHandler((ex) => { Debug.WriteLine(ex.Message); }) .Start(() => { throw new CustomException("Custom exception was occured!"); }); return Ok(); } 

أين CustomException فئة CustomException ، على سبيل المثال:


 /// <summary> /// Custom exception. /// </summary> public class CustomException : Exception { public CustomException(string message) : base(message) { } public CustomException(string message, Exception innerException) : base(message, innerException) { } public CustomException() { } } 

نتيجة لذلك ، سيتم عرض وحدة التحكم Debug :


 Exception Custom exception was occured! 

بالإضافة إلى ذلك ، يمكنك تحديد معالج استثناء سيتم استخدامه بشكل افتراضي لقياس أداء أي طريقة من هذه الفئة ، على سبيل المثال ، من خلال المنشئ الثابت لفئة تحكم PerformanceMeterController :


 [ApiController] [Route("api/v1/[controller]")] public class PerformanceMeterController : ControllerBase { /// <summary> /// Static constructor. /// </summary> static PerformanceMeterController() { // set default exception handler for PerformanceMeterController class PerformanceMeter<PerformanceMeterController>.SetDefaultExceptionHandler((ex) => Debug.WriteLine(ex.Message)); } // ... actions } 

ضبط وقت تخزين البيانات (ضبط وقت التخزين المؤقت)


يمكنك ضبط وقت التخزين لبيانات قياسات أداء الطرق ، وبعد ذلك سيتم حذف هذه البيانات. لكل فئة تم إجراء القياس عليها ، يتم ضبط هذه المرة بشكل منفصل. على سبيل المثال ، يمكن ضبط الوقت من خلال المنشئ الثابت لفئة تحكم PerformanceMeterController :


 [ApiController] [Route("api/v1/[controller]")] public class PerformanceMeterController : ControllerBase { /// <summary> /// Static constructor. /// </summary> static PerformanceMeterController() { // set cache time for PerformanceMeterController class PerformanceMeter<PerformanceMeterController>.SetMethodCallsCacheTime(5); } // ... actions } 

إضافة بيانات حول طريقة الاتصال ومكان المكالمة (وانقطاع قياس الأداء)


  • يمكنك تحديد من يقوم باستدعاء الطريقة باستخدام طريقة الامتداد .CallerFrom("<caller_name>") (إما يتم تمرير سلسلة أو IHttpContextAccessor إليها ) أو سمة خاصة للطريقة [MethodCaller("<caller_name>")] . علاوة على ذلك ، إذا تم استخدام كل من السمة وطريقة الامتداد ، فستؤخذ القيمة من الأخيرة.


  • يتم استخدام طريقة التمديد .WithSettingData.CallerSourceData() لإضافة نقطة اتصال لقياس الأداء.


  • لإيقاف قياس الأداء داخل كتلة الاستخدام ، استخدم طريقة امتداد .StopWatching() أو طريقة Dispose() مباشرة:



 [HttpPost("StartWatchingWithCallerName")] [MethodCaller("testCaller")] public ActionResult<string> StartWatchingWithCallerName([FromBody] string value) { // method performance info will reach with caller name (if internal HttpContextAccessor is null) using (var pm = PerformanceMeter<PerformanceMeterController> .WatchingMethod() .WithSettingData .CallerSourceData() .CallerFrom("Test caller") .Start()) { pm.StopWatching(); // stop watching here (or you can use "pm.Dispose();") Thread.Sleep(2000); return Ok(value); } } 

نتيجة GetPerformanceInfo أسلوب GetPerformanceInfo ، ستحصل على:


 { "methodCalls": [ { "methodName": "StartWatchingWithCallerName", "elapsed": "00:00:00.0019172", "caller": "Test caller", "startTime": "2019-12-06T13:35:45.3164507Z", "endTime": "2019-12-06T13:35:45.3183679Z", "customData": { "customData123": 123, "callerSourceLineNumber": 525, "callerSource": "D:\\GitHub\\Unchase.FluentPerformanceMeter\\Unchase.FluentPerformanceMeter.TestWebAPI\\Controllers\\PerformanceMeterController.cs" }, "steps": [] } ], "totalActivity": [ { "methodName": "StartWatchingWithCallerName", "callsCount": 1 } ], "currentActivity": [ { "methodName": "StartWatchingWithCallerName", "callsCount": 0 } ], "uptimeSince": "2019-12-06T13:35:45.2601668Z", "className": "Unchase.FluentPerformanceMeter.TestWebAPI.Controllers.PerformanceMeterController", "methodNames": [ "StartWatchingWithCallerName" ], "customData": { }, "timerFrequency": 10000000 } 

استنتاج


وبالتالي ، يتيح لنا الحل المقدم أتمتة جزئيًا لجمع المعلومات حول أداء أساليب تطبيق .NET بطريقة مريحة إلى حد ما. يمكن تصور البيانات التي تم جمعها بطريقة أكثر ملاءمة لكل مطور معين.


بالطبع ، لا تحل المكتبة جميع المشكلات المرتبطة بجمع البيانات حول أداء الطرق ، ولكنها تسعى إلى تبسيط أكثرها شيوعًا.


تعتبر المكتبة حلاً مفتوح المصدر ، وأي اقتراحات واقتراحات لتطويرها هي موضع ترحيب فقط ، وكذلك تقارير الأخطاء (يمكن للجميع متابعة الرابط ؛ وسيكون المؤلف ممتنًا لأي مساعدة!).

Source: https://habr.com/ru/post/ar485198/


All Articles