API'nizin tam olarak saniyede 500 istekle nasıl davrandığını bilmek istersiniz, "N sayıda iş parçacığının yapabildiği kadar hızlı" değil. Çoğu yük testi aracı eşzamanlılığı sabitler ve istek oranının dalgalanmasına izin verir. Vegeta ise tam tersini yapar: oranı siz belirlersiniz ve sunucunun nasıl yanıt verdiğine bakılmaksızın saniyede o kadar istek gönderir. Bu fark, yanıt sayfasının kullandığı sayıya, hedeflenen bir yük altındaki verime ve bir SLO'da (Hizmet Seviyesi Hedefi) gerçekten vaat edeceğiniz gecikmeye önem verdiğinizde önemlidir.
Vegeta Nedir?
Vegeta, Go ile yazılmış bir komut satırı HTTP yük testi aracıdır. Aynı zamanda bir Go kütüphanesi olarak da kullanılabilir, ancak bu eğitim CLI'ya odaklanacaktır. Temel fikir, sabit bir istek oranıdır. Vegeta'ya "30 saniye boyunca saniyede 100 istek gönder" dersiniz ve o da gerektiğinde işçiler ekleyerek bu hızı korur. Sunucu yavaşlarsa, Vegeta eski isteklerin bitmesini beklemek yerine programa uygun olarak yeni istekler göndermeye devam eder.
Bu tasarım size açık modelli bir yük testi sunar. Gerçek trafik kendi zamanlamasında gelir; kullanıcılar bir sonraki kullanıcı gelmeden önce yavaş uç noktanızı beklemez veya duraklamaz. Oran tabanlı bir araç bu davranışı taklit eder.
Oran tabanlıya karşı eşzamanlılık tabanlı yük
İnsanların kafasını karıştıran ayrım şudur.
Eşzamanlılık tabanlı bir araç (sabit bir iş parçacığı havuzu veya sanal kullanıcılar, her biri istek-yanıt döngüsü yapan) kapalı bir model kullanır. Sunucu yavaşladığında, döngü durur ve gerçek istek oranı düşer. Siz yük istediniz, ancak araç sessizce geri çekildi. Bu durum, üretimde göreceğiniz yığılmayı gizler.
Vegeta gibi oran tabanlı bir araç açık bir model kullanır. Geliş oranını siz belirlersiniz. Sunucu yetişemezse, istekler kuyruğa girer, gecikme artar ve rapor bunu gösterir. Talep kapasiteyi aştığında ne olduğunun dürüst bir resmini elde edersiniz.
Her iki model de yanlış değildir. "Kaç eşzamanlı kullanıcıyı kaldırabilirim" diye merak ettiğinizde eşzamanlılık modelini kullanın. "Saniyede 2.000 istekte ne olur" diye merak ettiğinizde ise oran modelini kullanın. Vegeta ikinci türdendir. Araç alanının daha geniş bir haritası için en iyi API yük testi araçlarına bakın.
Vegeta Kurulumu
Kurulumunuza uygun olanı seçin.
macOS'ta Homebrew:
brew update && brew install vegeta
Diğer paket yöneticileri:
# MacPorts
port install vegeta
# Arch Linux
pacman -S vegeta
# FreeBSD
pkg install vegeta
Go yüklü olduğunda kaynaktan:
git clone https://github.com/tsenart/vegeta
cd vegeta
make vegeta
GitHub sürüm sayfasından önceden oluşturulmuş bir ikili dosyayı da indirebilirsiniz. Kurulumu onaylayın:
vegeta --help
Temel iş akışı
Vegeta, Unix pipe'ları etrafında inşa edilmiştir. Bir hedef girer, bir saldırı çalışır ve bir rapor çıkar. En küçük faydalı çalıştırma tek bir satırdır:
echo "GET http://localhost:8080/" | vegeta attack -duration=5s -rate=100 | vegeta report
Soldan sağa okuyun:
echobir hedefi (bir yöntem ve URL) standart çıktıya yazar.vegeta attackbu hedefi standart girdiden okur ve 5 saniye boyunca saniyede 100 istek gönderir. Bu toplam 500 istektir.vegeta reportikili sonuç akışını okur ve bir özet yazdırır.
-rate bayrağı zaman birimi başına istek alır. -rate=100 ve -rate=100/1s aynı anlama gelir. -rate=50/500ms her 500 milisaniyede bir 50 istek anlamına gelir. -rate=0 olarak ayarlamak limiti kaldırır ve mümkün olduğunca hızlı gönderir, bu tamamen farklı bir testtir.
Bir metin raporu şöyle görünür:
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:
Önce gecikme satırını okuyun. 50 sütunu medyandır (ortanca). 99 sütunu kuyruktur: isteklerin yüzde 1'i bundan daha yavaştı. Kuyruklar, kullanıcıların sorun yaşadığı yerdir, bu nedenle sağlıklı bir ortalama ile kötü bir 99. yüzdelik dilim hala bir sorundur. Ardından Success [ratio] ve Status Codes'u kontrol edin. Tüm 200'lerle %100 başarı oranı, sunucunun yükü kaldırdığı anlamına gelir. Herhangi bir 5xx kodu veya boş olmayan bir Error Set, sistemin bozulmaya başladığı anlamına gelir.
Sonuçları kaydedin, sonra birçok şekilde raporlayın
Doğrudan report'a yönlendirmek hızlı bir bakış için iyidir. Tekrar gözden geçireceğiniz herhangi bir şey için, önce ham sonuçları bir dosyaya kaydedin, ardından o tek dosyadan istediğiniz her raporu oluşturun.
echo "GET http://localhost:8080/" | \
vegeta attack -duration=10s -rate=200 -output=results.bin
Şimdi çalıştırma results.bin dosyasına kaydedildi. Bir metin raporu oluşturun:
vegeta report results.bin
Bir kontrol paneli veya çalıştırmalar arası fark için yapılandırılmış JSON oluşturun:
vegeta report -type=json results.bin > metrics.json
Seçtiğiniz aralıklarla (bucket) bir gecikme histogramı oluşturun:
vegeta report -type='hist[0,2ms,5ms,10ms,25ms,100ms]' results.bin
Histogram, her gecikme aralığına kaç isteğin düştüğünü sayar. Gecikmenin sıkı bir şekilde kümelenmiş mi yoksa geniş bir aralığa yayılmış mı olduğunu hızlıca görmenin bir yoludur.
Hedef dosya formatı
Gerçek API'lar birden fazla GET isteğine ihtiyaç duyar. Hedeflerinizi bir dosyaya taşıyın ve bunu -targets ile geçirin. Varsayılan HTTP formatı satır tabanlı ve okunabilir.
targets.txt dosyasını oluşturun:
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
Bunu çalıştırmak için birkaç kural:
- Her hedefin ilk satırı
METHOD URL'dir. - Başlık satırları doğrudan yöntem satırının altında, her satırda bir
Anahtar: Değerşeklinde yer alır. @ile başlayan bir satır, içeriği istek gövdesi olacak bir dosya adını belirtir.- Boş bir satır bir hedefi diğerinden ayırır.
#ile başlayan satırlar yorumdur.
JSON gövdenizi payload.json dosyasına koyun:
{ "name": "Ada", "role": "engineer" }
Dosyaya karşı saldırıyı çalıştırın:
vegeta attack -targets=targets.txt -rate=50 -duration=30s | vegeta report
Vegeta hedefler arasında sırayla döner ve süre bitene kadar döngüyü sürdürür. Ayrıca komut satırında -header ile genel başlıklar ekleyebilirsiniz, bu kimlik doğrulama için kullanışlıdır:
vegeta attack -targets=targets.txt -rate=50 -duration=30s \
-header="Authorization: Bearer $TOKEN" | vegeta report
Programatik veya yüksek hacimli çalıştırmalar için Vegeta bir JSON hedef formatını da okur. Her satır bir JSON nesnesidir ve bunu -format=json ile seçersiniz:
{"method": "GET", "url": "http://localhost:8080/api/users"}
{"method": "POST", "url": "http://localhost:8080/api/users", "header": {"Content-Type": ["application/json"]}, "body": "eyJuYW1lIjoiQWRhIn0="}
body alanı base64 ile kodlanmıştır. Bu format iyi akış sağlar, böylece hedefleri anında oluşturabilir ve bellek verimliliği için -lazy ile doğrudan içeri aktarabilirsiniz.
Grafikler ve histogramlar
Tek bir sayı trendleri gizler. Çalışmanın ortasında gecikme bozulursa, eğriyi görmek istersiniz. Vegeta'nın plot komutu, bir sonuç akışını etkileşimli bir HTML sayfasına dönüştürür:
vegeta attack -targets=targets.txt -rate=100 -duration=60s | \
vegeta plot > plot.html
Bir tarayıcıda plot.html dosyasını açın. Çalıştırma boyunca gecikmenin zaman serisi grafiğini görürsünüz, böylece yavaş bir artış veya test ortası bir ani yükseliş bariz hale gelir. Yük seviyelerini karşılaştırmak için birkaç çalıştırmayı birlikte çizebilirsiniz:
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
Başsız ortamlar (headless environments) için grafiği atlayın ve encode ile bir histogram veya ham CSV dışa aktarın:
vegeta encode -to=csv results.bin > results.csv
Vegeta ne zaman kullanılır?
Soru oran ve kapasite ile ilgili olduğunda Vegeta'ya başvurun:
- Belirli bir saniye başına istek hedefinde verim ve gecikmeye ihtiyacınız var.
- Gecikmenin veya hata oranının tırmanmaya başladığı oranı bulmak istiyorsunuz.
- Aynı, tekrarlanabilir yük altında iki farklı yapılandırmayı veya iki altyapı yapılandırmasını karşılaştırıyorsunuz.
- Kabuk iş akışına ve GUI'siz bir CI işine kolayca entegre olabilen komut dosyası oluşturulabilir bir araç istiyorsunuz.
Odaklanmış bir araçtır. Belirli bir oranda HTTP istekleri gönderir ve sunucunun nasıl yanıt verdiğini ölçer. Dallanma mantığına sahip çok adımlı kullanıcı yolculuklarını betiklemez ve yanıt gövdelerini durum kodlarının ötesinde doğrulamaz. Bu odaklanma bir özelliktir; aracı küçük tutar ve sonuçları netleştirir.
Diğer test araçlarıyla karşılaştırıyorsanız, k6 yük testi ve JMeter yük testindeki karşılaştırmalar eşzamanlılık modeli alternatiflerini ele alır. Temel kavramlar ve metrikler için API performans testi eğitimi iyi bir başlangıçtır.
Fonksiyonel testin yeri
Yük testi "yeterince hızlı mı" sorusunu yanıtlar. "Doğru mu" sorusunu yanıtlamaz. Bir Vegeta çalıştırması %100 oranında 200 yanıtı bildirebilirken, uç nokta yanlış kullanıcıyı, eski bir fiyatı veya hatalı biçimlendirilmiş bir JSON alanını döndürebilir. Bir yük testi aracı açısından bu yanıtların her biri hızlı ve başarılı bir 200'dür.
Doğruluk farklı bir kontrol gerektirir: yanıt gövdesi, şema ve iş kuralları üzerindeki iddialar (assertion'lar). Bu, fonksiyonel testtir ve yük testlerinizden önce ve onlarla birlikte yer almalıdır. Sağlıklı desen, API'nin doğru olduğunu doğrulamak, ardından belirli bir oranda nasıl performans gösterdiğini ölçmektir.
İşte bu noktada Apidog, Vegeta gibi bir araçla rekabet etmek yerine onu tamamlar. Apidog'da durum, başlıklar ve JSON alanları üzerinde görsel iddialarla (assertion'larla) test senaryoları oluşturur, istekleri zincirlersiniz ve bunları veri dosyalarından yönlendirirsiniz. API'nin doğru verileri döndürdüğünü doğrularsınız. Vegeta ise bu doğru yol saniyede yüzlerce kez kullanıldığında hızlı kalıp kalmadığını doğrular. İki araç, iki soru.
Apidog ayrıca başsız bir CLI sunar, böylece bu fonksiyonel senaryolar yük adımınızla aynı CI işlem hattında çalışır. Node ile kurun:
npm install -g apidog-cli
Ardından, işlem hattınız için raporlayıcılarla birlikte, kaydedilmiş bir senaryoyu veya paketi kimliğine göre çalıştırın:
apidog run --access-token "$APIDOG_ACCESS_TOKEN" \
-t <scenarioOrSuiteId> \
-e <environmentId> \
-r cli,html,junit
-t bayrağı senaryo, klasör veya paket kimliğini alır, -e ortam kimliğini alır ve -r bir veya daha fazla raporlayıcıyı (cli, html, json, junit) seçer. junit çıktısı çoğu CI kontrol paneline entegre olur. Adım adım çalıştırma için Apidog CLI komut satırı eğitimine ve kopyala-yapıştır iş akışı için CI/CD işlem hattı kılavuzuna bakın. Önce fonksiyonel testi çalıştırın, ardından geçen uç noktaları Vegeta'nın ölçmesine izin verin.
Sıkça Sorulan Sorular (SSS)
Vegeta, gövdeli POST isteklerini destekliyor mu?
Evet. HTTP hedefleri dosyasında, yöntemi ve URL'yi ilk satıra koyun, bir Content-Type başlığı ekleyin ve @./payload.json ile bir gövde dosyasına referans verin. JSON formatında, method, url ve base64 kodlu bir body alanı ayarlayın.
-rate=0 ne yapar?
Hız sınırını kaldırır ve istekleri işçilerin ve bağlantıların izin verdiği kadar hızlı gönderir. Bu, kontrollü sabit oranlı bir testten farklı olan maksimum verim testidir. Tekrarlanabilir kapasite ölçümleri için açık bir oran belirleyin.
Gecikme yüzdelik dilimlerini nasıl okurum?
Raporun gecikme satırı minimum, ortalama ve 50., 90., 95., 99. ve maksimum yüzdelik dilimleri gösterir. 95. ve 99. yüzdelik dilimlere odaklanın. Bunlar, gerçek kullanıcıların karşılaştığı, ortalamanın tek başına gizleyebileceği yavaş kuyruğu tanımlar.
Vegeta, API'min doğru verileri döndürdüğünü kontrol edebilir mi?
Hayır. Verimi, gecikmeyi ve durum kodlarını ölçer. Yanıt gövdeleri veya şemalar üzerinde iddialarda bulunmaz. Doğruluk için onu fonksiyonel bir test aracıyla eşleştirin, ardından oranı ve gecikmeyi ölçmek için Vegeta'yı kullanın.
Vegeta'yı CI'da nasıl çalıştırırım?
Stdin'i okuyan ve sonuçları yazan tek bir ikili dosyadır, bu nedenle herhangi bir kabuk adımına kolayca entegre olur. Sonuçları -output ile kaydedin, ardından bir metin veya JSON raporunu yapılandırma artifaktı olarak oluşturun. Yük adımından önce, Apidog CLI gibi fonksiyonel bir engel ekleyin, böylece yalnızca iddialarını zaten geçen uç noktaları ölçersiniz.
