أنت تريد أن تعرف كيف يتصرف واجهة برمجة التطبيقات (API) الخاصة بك عند 500 طلب في الثانية بالضبط، وليس "بسرعة ما تستطيع N من مؤشرات الترابط معالجته". معظم أدوات اختبار التحميل تثبت التزامن وتترك معدل الطلبات عائمًا. Vegeta يفعل العكس: أنت تحدد المعدل، ويرسل هذا العدد من الطلبات في الثانية بغض النظر عن كيفية استجابة الخادم. هذا الاختلاف يهم عندما تهتم بالرقم الذي تستخدمه ورقة الإجابة، والإنتاجية عند حمل مستهدف، وزمن الاستجابة الذي قد تعد به فعليًا في اتفاقية مستوى الخدمة (SLO).
ما هو Vegeta
Vegeta هي أداة اختبار تحميل HTTP سطر أوامر مكتوبة بلغة Go. يمكن استخدامها أيضًا كمكتبة Go، لكن هذا البرنامج التعليمي يلتزم بواجهة سطر الأوامر (CLI). الفكرة الأساسية هي معدل طلب ثابت. تخبر Vegeta "أرسل 100 طلب في الثانية لمدة 30 ثانية"، وتحافظ على هذه الوتيرة بإضافة عمال حسب الحاجة. إذا تباطأ الخادم، تستمر Vegeta في إصدار طلبات جديدة في موعدها بدلاً من انتظار انتهاء الطلبات القديمة.
يمنحك هذا التصميم اختبار تحميل بنموذج مفتوح. حركة المرور الحقيقية تصل وفقًا لتوقيتها الخاص؛ لا يتوقف المستخدمون وينتظرون نقطة النهاية البطيئة لديك قبل ظهور المستخدم التالي. أداة تعتمد على المعدل تطابق هذا السلوك.
التحميل القائم على المعدل مقابل التحميل القائم على التزامن
إليك الفارق الذي يربك الناس.
تستخدم الأداة القائمة على التزامن (مجموعة ثابتة من مؤشرات الترابط أو المستخدمين الافتراضيين، يقوم كل منهم بتكرار الطلب والاستجابة) نموذجًا مغلقًا. عندما يتباطأ الخادم، تتوقف الحلقة، فينخفض معدل الطلبات الفعلي. لقد طلبت حملاً، لكن الأداة تراجعت بهدوء. هذا يخفي التكدس الذي قد تراه في الإنتاج.
أداة قائمة على المعدل مثل Vegeta تستخدم نموذجًا مفتوحًا. أنت تحدد معدل الوصول. إذا لم يتمكن الخادم من المواكبة، تصطف الطلبات، ويرتفع زمن الاستجابة، ويظهر التقرير ذلك. تحصل على صورة صادقة لما يحدث عندما يتجاوز الطلب السعة.
لا يوجد نموذج خاطئ. استخدم التزامن عندما تريد معرفة "كم عدد المستخدمين المتزامنين الذين يمكنني استيعابهم". استخدم نموذج المعدل عندما تريد معرفة "ماذا يحدث عند 2,000 طلب في الثانية". Vegeta هو النوع الثاني. للحصول على خريطة أوسع لمجال الأدوات، راجع أفضل أدوات اختبار تحميل واجهة برمجة التطبيقات (API).
تثبيت Vegeta
اختر ما يناسب إعدادك.
Homebrew على macOS:
brew update && brew install vegeta
مدراء الحزم الآخرون:
# MacPorts
port install vegeta
# Arch Linux
pacman -S vegeta
# FreeBSD
pkg install vegeta
من المصدر مع تثبيت Go:
git clone https://github.com/tsenart/vegeta
cd vegeta
make vegeta
يمكنك أيضًا تنزيل ملف ثنائي جاهز من صفحة إصدارات GitHub. تأكيد التثبيت:
vegeta --help
العملية الأساسية
تم بناء Vegeta حول أنابيب Unix. يدخل هدف، يتم شن هجوم، ويخرج تقرير. أصغر عملية مفيدة هي سطر واحد:
echo "GET http://localhost:8080/" | vegeta attack -duration=5s -rate=100 | vegeta report
اقرأ هذا من اليسار إلى اليمين:
- `echo` يكتب هدفًا واحدًا (طريقة وعنوان URL) إلى الإخراج القياسي.
- `vegeta attack` يقرأ هذا الهدف من الإدخال القياسي ويطلق 100 طلب في الثانية لمدة 5 ثوانٍ. وهذا يعني إجمالي 500 طلب.
- `vegeta report` يقرأ تدفق النتائج الثنائية ويطبع ملخصًا.
العلامة `-rate` تأخذ عدد الطلبات لكل وحدة زمنية. `-rate=100` و `-rate=100/1s` يعنيان نفس الشيء. `-rate=50/500ms` يعني 50 طلبًا كل 500 مللي ثانية. تعيين `-rate=0` يزيل الحد ويرسل بأسرع ما يمكن، وهو اختبار مختلف تمامًا.
يبدو التقرير النصي كالتالي:
Requests [total, rate, throughput] 500, 100.20, 100.18
Duration [total, attack, wait] 4.991s, 4.990s, 1.2ms
Latencies [min, mean, 50, 90, 95, 99, max] 412us, 1.3ms, 1.1ms, 1.9ms, 2.4ms, 5.1ms, 12ms
Bytes In [total, mean] 128500, 257.00
Bytes Out [total, mean] 0, 0.00
Success [ratio] 100.00%
Status Codes [code:count] 200:500
Error Set:
اقرأ سطر زمن الاستجابة أولاً. العمود `50` هو الوسيط. العمود `99` هو الذيل: 1 بالمائة من الطلبات كانت أبطأ من ذلك. الذيول هي حيث يشعر المستخدمون بالألم، لذلك فإن متوسطًا صحيًا مع نسبة 99% سيئة لا يزال يمثل مشكلة. تحقق من `Success [ratio]` و `Status Codes` بعد ذلك. نسبة نجاح 100 بالمائة مع جميع رموز 200 تعني أن الخادم تحمل الحمل. أي رموز 5xx أو `Error Set` غير فارغ تعني أنه بدأ يتعطل.
حفظ النتائج، ثم الإبلاغ عنها بعدة طرق
التوجيه مباشرة إلى `report` مناسب لإلقاء نظرة سريعة. لأي شيء ستعود إليه لاحقًا، احفظ النتائج الأولية في ملف أولاً، ثم أنشئ كل تقرير تريده من ذلك الملف الواحد.
echo "GET http://localhost:8080/" | \
vegeta attack -duration=10s -rate=200 -output=results.bin
الآن تم تسجيل التشغيل في `results.bin`. أنشئ تقريرًا نصيًا:
vegeta report results.bin
أنشئ JSON مهيكلًا للوحة تحكم أو للمقارنة بين عمليات التشغيل:
vegeta report -type=json results.bin > metrics.json
أنشئ مخطط تكراري (histogram) لزمن الاستجابة مع فئات تختارها:
vegeta report -type='hist[0,2ms,5ms,10ms,25ms,100ms]' results.bin
يحسب المخطط التكراري عدد الطلبات التي وقعت في كل نطاق من نطاقات زمن الاستجابة. إنها طريقة سريعة لمعرفة ما إذا كان زمن الاستجابة متجمعًا بإحكام أم منتشرًا عبر نطاق واسع.
تنسيق ملف الأهداف
تحتاج واجهات برمجة التطبيقات الحقيقية إلى أكثر من طلب GET واحد. انقل أهدافك إلى ملف ومرره باستخدام `-targets`. تنسيق HTTP الافتراضي يعتمد على الأسطر وقابل للقراءة.
أنشئ `targets.txt`:
GET http://localhost:8080/api/users
POST http://localhost:8080/api/users
Content-Type: application/json
@./payload.json
GET http://localhost:8080/api/users/42
بعض القواعد لجعل هذا يعمل:
- السطر الأول من كل هدف هو `METHOD URL`.
- تتبع سطور الرأس مباشرة أسفل سطر الطريقة، سطر واحد `Key: Value` لكل سطر.
- السطر الذي يبدأ بـ `@` يسمي ملفًا يصبح محتواه جسم الطلب.
- سطر فارغ يفصل هدفًا عن التالي.
- السطور التي تبدأ بـ `#` هي تعليقات.
ضع جسم JSON الخاص بك في `payload.json`:
{ "name": "Ada", "role": "engineer" }
قم بتشغيل الهجوم على الملف:
vegeta attack -targets=targets.txt -rate=50 -duration=30s | vegeta report
تتكرر Vegeta عبر الأهداف بالترتيب وتستمر في التكرار حتى انتهاء المدة. يمكنك أيضًا إضافة رؤوس عامة في سطر الأوامر باستخدام `-header`، وهو أمر مفيد للمصادقة:
vegeta attack -targets=targets.txt -rate=50 -duration=30s \
-header="Authorization: Bearer $TOKEN" | vegeta report
لتشغيل البرنامج أو تشغيل بكميات كبيرة، يقرأ Vegeta تنسيق هدف JSON أيضًا. كل سطر هو كائن JSON واحد، وتحدده باستخدام `-format=json`:
{"method": "GET", "url": "http://localhost:8080/api/users"}
{"method": "POST", "url": "http://localhost:8080/api/users", "header": {"Content-Type": ["application/json"]}, "body": "eyJuYW1lIjoiQWRhIn0="}
حقل `body` مشفر بتقنية base64. هذا التنسيق يتدفق جيدًا، لذا يمكنك إنشاء أهداف أثناء التنفيذ وتوجيهها مباشرة باستخدام `-lazy` لتحقيق كفاءة الذاكرة.
الرسوم البيانية والمخططات التكرارية
رقم واحد يخفي الاتجاهات. إذا تدهور زمن الاستجابة في منتصف التشغيل، فأنت تريد رؤية المنحنى. يحوّل أمر `plot` في Vegeta تدفق النتائج إلى صفحة HTML تفاعلية:
vegeta attack -targets=targets.txt -rate=100 -duration=60s | \
vegeta plot > plot.html
افتح `plot.html` في متصفح. ستحصل على مخطط زمني لزمن الاستجابة عبر التشغيل، بحيث يكون التباطؤ التدريجي أو الارتفاع المفاجئ في منتصف الاختبار واضحًا. يمكنك رسم عدة تشغيلات معًا لمقارنة مستويات التحميل:
vegeta attack -rate=50 -duration=30s -targets=targets.txt -output=50qps.bin
vegeta attack -rate=100 -duration=30s -targets=targets.txt -output=100qps.bin
vegeta plot 50qps.bin 100qps.bin > compare.html
للبيئات التي لا تحتوي على واجهة رسومية، تخطى الرسم البياني وقم بتصدير مخطط تكراري أو ملف CSV الخام باستخدام `encode`:
vegeta encode -to=csv results.bin > results.csv
متى تستخدم Vegeta
استخدم Vegeta عندما يتعلق السؤال بالمعدل والسعة:
- تحتاج إلى الإنتاجية وزمن الاستجابة عند هدف محدد من الطلبات في الثانية.
- تريد معرفة المعدل الذي يبدأ عنده زمن الاستجابة أو معدل الخطأ في الارتفاع.
- تقوم بمقارنة نسختين أو تهيئتين للبنية التحتية تحت حمل متطابق وقابل للتكرار.
- تريد أداة قابلة للبرمجة تندمج في خط أنابيب shell وفي مهمة CI بدون واجهة رسومية.
إنها أداة مركزة. ترسل طلبات HTTP بمعدل وتقيس كيفية استجابة الخادم. لا تقوم ببرمجة رحلات مستخدم متعددة الخطوات بمنطق متفرع، ولا تتحقق من أجسام الاستجابة بخلاف رموز الحالة. هذا التركيز هو ميزة؛ فهو يحافظ على صغر حجم الأداة ونظافة النتائج.
إذا كنت تقارنها بأدوات أخرى، فإن المقارنات في اختبار تحميل k6 و اختبار تحميل JMeter تغطي بدائل نموذج التزامن. للمفاهيم والمقاييس الأساسية، يعد البرنامج التعليمي لاختبار أداء واجهة برمجة التطبيقات (API) بمثابة مقدمة جيدة.
أين يتناسب الاختبار الوظيفي
يجيب اختبار التحميل على سؤال "هل هو سريع بما فيه الكفاية". ولكنه لا يجيب على سؤال "هل هو صحيح". يمكن لتشغيل Vegeta أن يبلغ عن 100 بالمائة من رموز 200 بينما تعيد نقطة النهاية المستخدم الخاطئ، أو سعرًا قديمًا، أو حقل JSON مشوهًا. كل واحدة من هذه الاستجابات هي رمز 200 سريع وناجح فيما يتعلق بأداة التحميل.
تتطلب الصحة فحصًا مختلفًا: تأكيدات على جسم الاستجابة، والمخطط (schema)، وقواعد العمل. هذا هو الاختبار الوظيفي، وينتمي قبل وأثناء تشغيلات التحميل الخاصة بك. النمط الصحيح هو التحقق من أن واجهة برمجة التطبيقات صحيحة، ثم قياس أدائها تحت معدل معين.
هنا تكمل Apidog أداة مثل Vegeta بدلاً من التنافس معها. في Apidog، يمكنك بناء سيناريوهات اختبار مع تأكيدات بصرية على الحالة، والرؤوس، وحقول JSON، وربط الطلبات، وتشغيلها من ملفات البيانات. أنت تؤكد أن واجهة برمجة التطبيقات تُرجع البيانات الصحيحة. ثم تؤكد Vegeta أنها تظل سريعة عندما يتم الوصول إلى هذا المسار الصحيح مئات المرات في الثانية. أداتان، سؤالان.
يشحن Apidog أيضًا واجهة سطر أوامر (CLI) بدون واجهة رسومية، بحيث تعمل تلك السيناريوهات الوظيفية في نفس خط أنابيب التكامل المستمر (CI) كخطوة التحميل الخاصة بك. قم بتثبيته باستخدام Node:
npm install -g apidog-cli
ثم قم بتشغيل سيناريو أو مجموعة محفوظة بواسطة المعرف، مع تقارير لخط الأنابيب الخاص بك:
apidog run --access-token "$APIDOG_ACCESS_TOKEN" \
-t <scenarioOrSuiteId> \
-e <environmentId> \
-r cli,html,junit
تأخذ العلامة `-t` معرف السيناريو أو المجلد أو المجموعة، وتأخذ `-e` معرف البيئة، وتختار `-r` واحدًا أو أكثر من أدوات إعداد التقارير (`cli`, `html`, `json`, `junit`). تتناسب مخرجات `junit` مع معظم لوحات معلومات التكامل المستمر (CI). راجع البرنامج التعليمي لسطر أوامر Apidog CLI لتشغيل خطوة بخطوة، و دليل خط أنابيب CI/CD لسير عمل نسخ ولصق. قم بتشغيل البوابة الوظيفية أولاً، ثم دع Vegeta تقيس نقاط النهاية التي اجتازت الاختبار.
الأسئلة الشائعة
هل تدعم Vegeta طلبات POST ذات الجسم؟
نعم. في ملف أهداف HTTP، ضع الطريقة وعنوان URL في السطر الأول، أضف رأس `Content-Type`، وارجع إلى ملف الجسم باستخدام `@./payload.json`. في تنسيق JSON، قم بتعيين حقول `method` و `url` وحقل `body` المشفر بتقنية base64.
ماذا تفعل `-rate=0`؟
إنها تزيل حد المعدل وترسل الطلبات بأسرع ما تسمح به العمال والاتصالات. هذا هو اختبار أقصى إنتاجية، وهو يختلف عن اختبار معدل ثابت متحكم به. لقياسات السعة القابلة للتكرار، قم بتعيين معدل صريح.
كيف أقرأ نسب مئوية زمن الاستجابة؟
يعرض سطر زمن الاستجابة في التقرير الحد الأدنى، والمتوسط، والنسب المئوية 50 و 90 و 95 و 99 والحد الأقصى. ركز على النسب المئوية 95 و 99. إنها تصف الذيل البطيء الذي يواجهه المستخدمون الحقيقيون، والذي يمكن للمتوسط وحده أن يخفيه.
هل يمكن لـ Vegeta التحقق من أن واجهة برمجة التطبيقات الخاصة بي تعيد بيانات صحيحة؟
لا. إنها تقيس الإنتاجية، وزمن الاستجابة، ورموز الحالة. لا تؤكد على أجسام الاستجابة أو المخططات (schemas). قم بإقرانها بأداة اختبار وظيفي للتحقق من الصحة، ثم استخدم Vegeta للمعدل وزمن الاستجابة.
كيف أقوم بتشغيل Vegeta في CI؟
إنه ملف ثنائي واحد يقرأ من الإدخال القياسي ويكتب النتائج، لذا يمكن دمجه في أي خطوة shell. احفظ النتائج باستخدام `-output`، ثم أنشئ تقريرًا نصيًا أو JSON كناتج بناء (build artifact). أضف بوابة وظيفية، مثل Apidog CLI، قبل خطوة التحميل بحيث تقيس فقط نقاط النهاية التي اجتازت تأكيداتها بالفعل.
