وقتی اجرای مجموعهای از Stateهای SaltStack طول میکشد، پیدا کردن مراحل زمانبر در میان خروجی متنی همیشه راحت نیست. Salt Result Parser زمانهای ثبتشده در خروجی را به نمودار میلهای افقی تبدیل میکند تا بتوانید مدت اجرای مراحل مختلف را کنار هم ببینید و موارد کندتر را برای بررسی بیشتر انتخاب کنید.
این ابزار یک اسکریپت Python است که فایل خروجی ذخیرهشدهٔ salt یا salt-call را میخواند. برای تحلیل فایل به اتصال به Salt Master نیاز ندارد و خودش فرمانی روی سرورها اجرا نمیکند؛ دادهٔ موردنیازش همان شناسهها و زمانهای موجود در متن است.
نمودار چه چیزی نشان میدهد؟
- هر میله با شناسهٔ یک State برچسبگذاری میشود و طول آن، مدت اجرای ثبتشده بر حسب میلیثانیه است.
- نمودار با Matplotlib نمایش داده میشود و کتابخانهٔ mplcursors امکان دیدن جزئیات با قرار دادن نشانگر روی میلهها را فراهم میکند.
- راهنمای شناور، شناسه و زمان اجرا را با سه رقم اعشار نشان میدهد.
- ترتیب دادهها از فایل ورودی گرفته میشود؛ برنامه مراحل را بر اساس زمان اجرا مرتب نمیکند.
طبق پیادهسازی برنامه، شناسهها از خطوط ID: بعد از جداکنندهٔ ---------- و زمانها از الگوی Duration: ... ms استخراج میشوند. سپس نمودار با عنوان Job Durations باز میشود. این نمایش برای مقایسهٔ مدت اجراست؛ موفق یا ناموفق بودن Stateها و محتوای بخش Changes در نمودار نمایش داده نمیشود.
نصب و آمادهسازی
به Python ۳، ابزار pip و محیطی نیاز دارید که بتواند پنجرهٔ تعاملی Matplotlib را نمایش دهد. نسخههای وابستگی در فایل requirements.txt مشخص شدهاند: Matplotlib نسخهٔ 3.8.3 و mplcursors نسخهٔ 0.5.2. نسخهٔ Python انتخابی باید با این وابستگیها سازگار باشد.
برای نمونه، در لینوکس یا macOS با Git و پشتیبانی از venv:
git clone https://github.com/hatamiarash7/Salt-Result-Parser.git
cd Salt-Result-Parser
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install -r requirements.txt
اگر خروجی Salt روی سروری بدون محیط گرافیکی تولید شده است، میتوانید فایل را به سیستم محلی منتقل کرده و نمودار را آنجا باز کنید. برنامه از plt.show() استفاده میکند و گزینهٔ خط فرمانی برای تعیین فایل تصویر خروجی ندارد.
ورودی و اجرای برنامه
خروجی متنی Stateها را در فایلی مثل result.txt ذخیره کنید و مسیر آن را به برنامه بدهید:
python3 main.py result.txt
نام فایل دلخواه است؛ مسیر فایل، اولین آرگومان برنامه است و فایل با کدگذاری UTF-8 خوانده میشود. برای یک آزمایش کوچک، متن نمونهٔ زیر را در result.txt قرار دهید. شناسهها و زمانهای این مثال فرضیاند و قالب مورد انتظار پارسر را نشان میدهند:
local:
----------
ID: install_nginx
Function: pkg.installed
Result: True
Comment: Package installed
Started: 10:00:00.000000
Duration: 1250.500 ms
Changes:
----------
ID: start_nginx
Function: service.running
Result: True
Comment: Service is running
Started: 10:00:01.250500
Duration: 45.250 ms
Changes:
با اجرای دستور بالا، دو شناسهٔ install_nginx و start_nginx مبنای برچسبهای نمودار میشوند. مقایسهٔ طول میلهها کمک میکند تفاوت زمان نصب بسته و راهاندازی سرویس را ببینید؛ برای دیدن مقدار دقیق نیز نشانگر را روی هر میله قرار دهید.
نکات قالب ورودی
پارسر بر پایهٔ الگوهای متنی مشخص نوشته شده است، بنابراین خروجی JSON یا YAML و خروجیهایی که این خطوط را ندارند، ورودی مناسبی برای آن نیستند. بهتر است فایل، متن سادهٔ بدون کدهای رنگی ترمینال باشد و هر State یک خط شناسه و یک خط مدت اجرا با واحد ms داشته باشد.
شناسهها و زمانها جداگانه استخراج و به ترتیب به هم نسبت داده میشوند. برنامه تطبیق کامل ساختار هر State را بررسی نمیکند؛ اگر بخشی از خروجی حذف شده باشد یا تعداد این دو گروه برابر نباشد، ممکن است رسم نمودار خطا بدهد یا نسبت دادن زمانها قابل اتکا نباشد. پیش از تحلیل، کامل بودن فایل را بررسی کنید.
همچنین نام Minion در برچسبها وارد نمیشود. برای خروجی چند میزبان یا Stateهایی با شناسهٔ تکراری، برچسبها ممکن است یکسان شوند و میلهها روی هم قرار بگیرند؛ استفاده از خروجی یک میزبان با شناسههای متمایز، مقایسه را روشنتر میکند.
کد پروژه با مجوز MIT منتشر شده است. راهنمای اصلی و تصویر نمونهٔ نمودار در مخزن پروژه قرار دارند.