نظارت بر کارایی فرآیندهای نرم‌افزاری یا APM چیست؟

در دنیای نرم‌افزارها و برنامه‌های تحت وب امروز اگر بخواهید، وب اپلیکیشن به شکل روان، با کمترین مشکل و با یک سرعت مناسب اجرا شود، مونیتور‌کردن سرورها و زیرساخت‌های شبکه در مقیاس‌های بزرگ خیلی مهم می‌شود و اینکه چه سطحی از نظارت بر عملکردها برای اطمینان از اینکه سرویس همیشه در دسترس باشد لازم است؟ برای ما در آپارات مطمئن شدن از این موضوع که تمام بخش‌های حیاتی سرویس به بهترین شکل در حال کار باشند و کاربرهایمان خدمات ما را سریع و روان دریافت کنند در اولیت شماره یک قرار دارد!!

تعریفی برای APM یا Application Performance Monitoring

نظارت بر کارایی فرآیندهای نرم‌افزاری (Application Performance Monitoting) یکی از روش‌هایی است که در سرویس‌ها و میکروسرویس‌های مختلف آنلاین برای نظارت نحوه اجرایی فرآیندهای سیستم مورد استفاده قرارمی‌گیرد.

به طور مثال صفحه اول آپارات را در نظر بگیرید:

وقتی این صفحه از سمت یکی از کاربران ما بارگذاری می‌شود، بخش‌های مختلفی مانند MySQL Query ها، Cache Server ها ، عملیات‌های متعدد Redis و سرویس‌های Recommender که قسمتی از رویه‌های اجرایی برای نمایش صفحه اول سایت است، به صورت موازی و متوالی در "سورس کد" سایت اجرا می‌شوند. اما اینکه هر کدام از این بخش‌ها چه مقدار زمان برای اجرا شدن لازم دارند و چه اطلاعاتی در هرکدام از این مراحل در حال انتقال است، در حالت عادی برای توسعه‌دهنده مشخص نیست و یا دریافتشان نیازمند ابزار مخصوص به خود است. بنابراین در پی تغییرات اخیر در Code Base سرویس آپارات تصمیم گرفتیم که برای نظارت بر اجرای این عملکردها APM را به شکل صحیح و قابل اتکا پیاده‌سازی کنیم. برای این کار سراغ سرویس‌دهنده‌های مختلف که به صورت SaaS یا Self-Hosted در دنیای نرم‌افزار وجود دارند رفته و با بررسی مزایا و معایب آن‌ها سرویس Elastic APM را انتخاب کردیم. که در این مطلب می‌خواهم این تجربه را با شما در میان بگذارم.


سرویس Elastic APM

در حال حاضر خیلی از شرکت‌ها  از مجموع سرویس‌های “Elastic”  برای نگهداری لاگ‌ها و متریک‌های سیستم استفاده می‌کنند که در آن باید برای تحلیل و ردیابی مسايل به جستجو بپردازیم و کمتر مجموعه ای به سراغ سرویس Elastic APM می‌روند اما باید گفت APM این امکان را به شما می‌دهد که به راحتی رویه اجرای فرآیند‌های مختلف در نرم افزار شما را مانیتور کنید. در APM یک Transaction اصلی از سرویس (برای مثال نمایش صفحه اول سرویس) به بخش‌های کوچکتری تحت عنوان Span تقسیم میشود و اطلاعات هریک از این Span ها شامل زمان شروع، زمان پایان، اطلاعات جانبی (بطور مثال SQL Query  اجرا شده) و بسیاری از اطلاعات کلی‌تر را در قالب همان Transaction ثبت و برای APM ارسال می‌کند.

تصویر شماره ۱ : محیط Elastic APM
تصویر شماره ۱ : محیط Elastic APM


همانطور که در تصویر شماره ۲ می‌بینید خروجی که Elastic APM می‌دهد شباهت بسیاری به نحوه نمایش Network Inspector در مرورگر کروم (تصویر شماره ۳) دارد، با این تفاوت که در مرورگر کروم، شما نحوه بارگذاری فایل‌ها و درخواست‌های مختلف آن صفحه را می‌بینید ولی در APM مدت زمان و اطلاعات مربوط به هریک از Span های اجرای کد را هم می‌بینید.

تصویر شماره ۲:‌نمونه خروجی Elastic APM برای یک Transaction
تصویر شماره ۲:‌نمونه خروجی Elastic APM برای یک Transaction


تصویر شماره ۳ : Chrome Network Inspector
تصویر شماره ۳ : Chrome Network Inspector


در حال حاضر با کمک این تکنولوژی ما می‌توانیم به راحتی نحوه اجرای کد مربوط به هرکدام از بخش‌ها یا Business های وب‌سایت را در شرایط مختلف بررسی کنیم و مشکلات احتمالی در ساختار کد و یا زیر ساخت‌ها و میکروسرویس‌های مختلف را قبل از اینکه کاربران با کندی و یا بدتر از آن با خطا مواجه شوند، پیدا و برطرف کنیم.

چطور باید APM را پیاده‌سازی کنیم؟‌

خوب تا اینجا با کلیات APM آشنا شدیم اما برای پیاده‌سازی این سرویس دو بخش کلی را باید بدانیم:

بخش اول بالا آوردن خود Elastic APM است که مقالات خوبی در رابطه‌ با آن وجود دارد که چند لینک از آن‌ها را در اینجا برای شما قرار داده‌ام.

۱. https://www.elastic.co/guide/en/apm/get-started/current/install-and-run.html
۲. https://logz.io/blog/application-performance-monitoring/

بخش دوم شامل پیاده‌سازی آن در Code Base وب‌سایت شما است. قبل از هرچیزی باید این نکته را بدانید که Elastic APM به سرعت در حال پیشرفت است و از ۳ ماه پیش دو نسخه ماژور ۶ و ۷ خود را منتشر کرده که تغییرات زیادی در ساختار ارسال اطلاعات این دو نسخه بوجود آورده است.

نکته ۱ : بنابراین شما باید در زمان نصب و بالا آوردن Elastic APM و انتخاب Agent مخصوص کد به ورژنی که آن Agent را پشتیبانی می‌کند، دقت زیادی کنید.
نکته ۲: زمانی که این مطلب را برای شما می‌نویسم آخرین نسخه پایدار ارايه شده نسخه ۷.۱ است ولی در هر زمان می‌توانید از طریق آدرس elastic.co به ساختار ورودی که Elastic APM API قبول می‌کند، دسترسی پیدا کنید.

در حال حاضر Elastic برای چند زبان مختلف از جمله Go, Java, Node.js, Python, Ruby, RUM به صورت رسمی کتابخانه‌ی Agent منتشر کرده‌ و البته برای زبان‌های دیگر هم Community Library های مختلفی منتشر شده‌است، در این راستا ما در آپارات برای زبان PHP تنها توانستیم یک کتابخانه پیدا کنیم که آن هم متاسفانه مشکلات زیر را داشت:

۱- باگ‌های مختلفی داشت.

۲- از Intake API V2.0 پشتیبانی نمی‌کرد.

۳- از همه مهم‌تر ارسال اطلاعات از طریق REST Api انجام می‌شد که برای آپارات با این حجم از ترافیک، اضافه شدن زمان مجزا برای ارسال اطلاعات به زمان بارگذاری صفحه هزینه‌ی (زمان انتظار کاربر) زیادی دربرداشت.

در نتیجه تصمیم گرفتیم یک کتابخانه PHP برای Elastic APM Intake API 2.0 و با پشتیبانی از ورژن ۶.۷ تا ۷.۱ به کمک تیم توسعه آپارات آماده کنیم

این کتابخانه برای زبانی مثل PHP که یک Scripting Language است یک حسن بزرگ دارد، به این شکل که می‌تواند ارسال اطلاعات به Elastic APM را هم به صورت TCP از طریق API و هم به صورت UDP از طریق یک SideCar که با زبان GoLang نوشته شده، انجام دهد.

کلام آخر:

این کتابخانه الان به صورت متن باز در Github و Packagist برای استفاده عموم دوستانی که از PHP در Stack خودشان استفاده می‌کنند منتشر شده است. هم اکنون در حال تکمیل مستندات برای استفاده از این کتابخانه در Github هستیم و خوشحال می‌شویم اگر بتوانید در بهینه کردن آن مشارکت کنید.