از EventCounters در NET Core استفاده کنید تا در زمان واقعی از عملکرد برنامه خود اطلاعاتی کسب کنید.
هنگامی که در برنامههای NET یا NET Core کار میکنید، اغلب میخواهید عملکرد برنامه خود را نمایه کنید تا قبل از استقرار برنامه در محیط تولید، از تنگناهای احتمالی آگاه شوید. EventCounters مجموعهای از معیارهای عملکرد را ارائه میکند که میتوانید برای این کار استفاده کنید.
این مقاله نحوه کار با EventCounters در NET Core را مورد بحث قرار میدهد و نمونههایی از کدها را برای کمک به شما در شروع کار ارائه میکند. برای کار با نمونه کدهای ارائه شده در این مقاله، باید Visual Studio 2022 را در سیستم خود نصب کنید. اگر قبلاً نسخهای ندارید، میتوانید Visual Studio 2022 را از اینجا بارگیری کنید.
یک پروژه برنامه کاربردی کنسول در ویژوال استودیو ایجاد کنید
ابتدا، اجازه دهید یک پروژه برنامه کاربردی کنسول NET Core در ویژوال استودیو ایجاد کنیم. با فرض اینکه Visual Studio 2022 در سیستم شما نصب شده است، مراحل ذکر شده در زیر را دنبال کنید تا یک پروژه برنامه کاربردی کنسول NET Core جدید در Visual Studio ایجاد کنید.
- Visual Studio IDE را راه اندازی کنید.
- روی “ایجاد پروژه جدید” کلیک کنید.
- در پنجره “ایجاد پروژه جدید”، “Console App (.NET Core)” را از لیست الگوهای نمایش داده شده انتخاب کنید.
- بعدی را کلیک کنید.
- در پنجره “پیکربندی پروژه جدید خود”، نام و مکان پروژه جدید را مشخص کنید.
- بعدی را کلیک کنید.
- در پنجره «اطلاعات اضافی» که در ادامه نشان داده شده است، «NET 7.0 (Standard Term Support)» را به عنوان نسخه چارچوبی که می خواهید استفاده کنید انتخاب کنید.
- روی ایجاد کلیک کنید.
ما از این پروژه برنامه کاربردی کنسول NET 7 برای کار با EventCounters در بخشهای بعدی این مقاله استفاده خواهیم کرد.
EventCounter چیست؟
EventCounters همتای بین پلتفرمی، سبک وزن و NET Core برای شمارشگرهای عملکرد .NET Framework برای ویندوز هستند. آنها APIهایی برای جمع آوری داده های عملکرد سبک در زمان واقعی در برنامه های NET Core شما هستند.
EventCounter یک ویژگی EventSource است که برای ثبت یک معیار عملکرد سطح پایین خاص طراحی شده است. EventCounter های مختلف استفاده از CPU، مصرف حافظه، تعداد رشته ها و بسیاری از جنبه های دیگر عملکرد زمان اجرا .NET Core و ASP.NET Core را ردیابی می کنند.
برای استفاده از EventCounters در NET Core، ابتدا باید کلاسی ایجاد کنید که کلاس System.Diagnostics.Tracing.EventSource را گسترش دهد. سپس میتوانید هر رویداد شمارندهای را که معیارهای عملکردی را که میخواهید ردیابی کنید ارائه میکند، پیادهسازی کنید. می توانید داده های شمارنده عملکرد منتشر شده توسط EventCounters را با استفاده از هر تعداد ابزار نظارت بر عملکرد مشاهده کنید. ما از ابزار dotnet-counters مفید در اینجا استفاده خواهیم کرد. .
نصب شمارنده های دات نت
برای شروع استفاده از ابزار dotnet-counters، ابتدا باید آن را با استفاده از دستور زیر در پنجره کنسول نصب کنید.
dotnet tool install --global dotnet-counters
شکل ۱. نصب شمارنده دات نت.
پس از نصب دات نت شمارنده، F5 را فشار دهید تا برنامه کنسولی که در بالا ایجاد کردیم اجرا شود. شکل ۲ زیر برنامه کنسول را در حال اجرا نشان می دهد.
شکل ۲. اجرای برنامه پیشفرض کنسول NET Core.
ابزار شمارنده داتنت به شما امکان میدهد شمارندههای عملکرد را در برنامههای NET Core خود بررسی کنید. برای نمایش لیستی از فرآیندهای قابل نظارت، کافیست دستور زیر را در پنجره فرمان اجرا کنید.
dotnet-counters ps
شکل ۳ لیستی از فرآیندهای در حال اجرا را نشان می دهد.
هنگامی که برنامه کنسول شروع به کار کرد، دستور زیر را در پنجره فرمان برای نظارت بر برنامه کنسول اجرا کنید.
dotnet-counters monitor -n EventCountersDemo
شکل ۴. نظارت بر برنامه کنسول ما در شمارنده های دات نت.
EventCounters را در NET Core اجرا کنید
برای انتشار شمارنده های عملکرد خود در NET Core، باید یک کلاس EventSource پیاده سازی کنید. دلیل آن این است که EventCounter بر روی مکانیسم ردیابی NET Core توسعه یافته است.
یک کلاس با نام CustomEventSource در فایلی به همین نام با پسوند cs ایجاد کنید. از آنجایی که همه EventCounter باید در مقابل یک EventSource ثبت شوند، کلاس CustomEventSource شما باید کلاس System.Diagnostics.Tracing.EventSource را گسترش دهد.
کد ایجاد شده پیشفرض فایلی را که ایجاد کردهاید با کد منبع دادهشده در فهرست زیر جایگزین کنید.
[EventSource(Name = "EventCountersDemo.CustomEventSource")] public sealed class CustomEventSource : EventSource { public static readonly CustomEventSource Instance = new(); private readonly IncrementingEventCounter _incrementingEventCounter; private bool _disposedValue; private CustomEventSource() { _incrementingEventCounter = new IncrementingEventCounter("MyCustomCounter", this) { DisplayName = "Incrementing Counter" }; } public void IncreaseCounterValue() { _incrementingEventCounter.Increment(); } public void Dispose() => Dispose(true); protected override void Dispose(bool disposing) { if (!_disposedValue) { if (disposing) { _incrementingEventCounter?.Dispose(); } _disposedValue = true; } base.Dispose(disposing); } }
شمارش رویداد را با استفاده از کمی کد سفارشی راه اندازی می کنیم. برای این کار، کد تولید شده پیش فرض فایل Program.cs را با کد زیر جایگزین کنید.
using EventCountersDemo; Task.Run(async () => await CounterIncrementor()); Console.ReadKey(); async Task CounterIncrementor() { while (true) { CustomEventSource.Instance.IncreaseCounterValue(); await Task.Delay(500); } }
برای نظارت بر برنامه کنسول، دستور زیر را در پنجره فرمان اجرا کنید:
dotnet-counters monitor -n EventCountersDemo --counters EventCountersDemo.CustomEventSource
پارامتر –counters ما را قادر می سازد منبع رویداد خاصی را که به نظارت بر آن علاقه مندیم مشخص کنیم. در این مثال، نام منبع رویداد EventCountersDemo.CustomEventSource است.
شکل ۵ خروجی اجرای دستور قبلی را نشان می دهد.
شکل ۵. نظارت بر CustomEventSource ما در شمارندههای نقطهنت.
EventCounters را در NET Core مصرف کنید
EventCounters را می توان با استفاده از EventLKisteners و EventPipes مصرف کرد. شما می توانید EventCounters را به دو روش مختلف، in-proc و out-of-proc مصرف کنید. میتوانید با استفاده از EventListener API. برای استفاده از یک شمارنده به روشی خارج از پروک، باید از یک EventPipe استفاده کنید. .
فهرست کد زیر نشان میدهد که چگونه میتوانید EventCounters را با استفاده از کلاس EventListener به صورت in-proc مصرف کنید.
public sealed class CustomEventCounterListener : EventListener { protected override void OnEventSourceCreated(EventSource eventSource) { if (eventSource.Name == "EventCountersDemo.CustomEventSource") { var args = new Dictionary<string, string?> { ["EventCounterIntervalSec"] = "1" }; EnableEvents(eventSource, EventLevel.Verbose, EventKeywords.All, args); } } protected override void OnEventWritten(EventWrittenEventArgs eventWrittenEventArgs) { if (!eventWrittenEventArgs.EventName.Equals("EventCounters")) { return; } if (eventWrittenEventArgs.Payload.First() is not IDictionary<string, object> payload) { return; } for (int i = 0; i < eventWrittenEventArgs.Payload.Count; ++i) { if (eventWrittenEventArgs.Payload[i] is IDictionary<string, object> eventPayload) { Console.WriteLine($"{payload["DisplayName"]} - {payload["Increment"]}"); } } } }
EventSources معمولاً برای تشخیص، ثبت و ردیابی رفتار برنامه استفاده می شود. از طرف دیگر، EventCounter برای پروفایل عملکرد، بهینهسازی و اهداف تشخیصی مناسبتر است. استفاده اولیه از EventCounters به عنوان یک ابزار تشخیصی یا پروفایل است، نه به عنوان ابزاری برای نظارت بر سلامت و عملکرد در تولید. برای نظارت بر برنامههای کاربردی مستقر در تولید، باید از سیستمهای نظارت و گزارش سطح بالاتر استفاده کنید.
پست های مرتبط
نحوه استفاده از EventCounters در NET Core
نحوه استفاده از EventCounters در NET Core
نحوه استفاده از EventCounters در NET Core