API'nizin saniyede tam 500 istekte nasıl davrandığını ölçmek istiyorsanız, “N iş parçacığı ne kadar hızlı gönderebiliyorsa” yaklaşımı yeterli değildir. Çoğu yük testi aracı eşzamanlılığı sabitler ve gerçek istek oranının dalgalanmasına izin verir. Vegeta tersini yapar: oranı siz belirlersiniz, Vegeta da sunucu yavaşlasa bile o oranda istek göndermeye devam eder. Bu, belirli bir hedef yük altında verimi, gecikmeyi ve SLO’da gerçekten taahhüt edeceğiniz değerleri görmek için kritiktir.
Vegeta nedir?
Vegeta, Go ile yazılmış komut satırı tabanlı bir HTTP yük testi aracıdır. Go kütüphanesi olarak da kullanılabilir, ancak bu yazı CLI kullanımına odaklanır.
Temel kullanım modeli şudur:
vegeta attack -rate=100 -duration=30s
Bu komut, 30 saniye boyunca saniyede 100 istek göndermeyi hedefler. Sunucu yavaşlarsa Vegeta eski isteklerin bitmesini bekleyip hızı düşürmez; programa göre yeni istekler göndermeye devam eder.
Bu nedenle Vegeta açık model yük testi yapar. Gerçek trafikte kullanıcılar genellikle sistemin önceki isteği bitirmesini beklemez; trafik kendi zamanlamasında gelir. Oran tabanlı test bu davranışı daha iyi taklit eder.
Oran tabanlı yük ile eşzamanlılık tabanlı yük farkı
Yük testi araçlarını değerlendirirken ilk ayrım şudur:
- Eşzamanlılık tabanlı araçlar: Sabit sayıda iş parçacığı, bağlantı veya sanal kullanıcı çalıştırır.
- Oran tabanlı araçlar: Belirli bir saniye başına istek oranını hedefler.
Eşzamanlılık tabanlı modelde her kullanıcı istek gönderir, yanıtı bekler, sonra sonraki isteği gönderir. Sunucu yavaşladığında döngü de yavaşlar. Sonuç olarak gerçek istek oranı düşebilir ve sistemin üretimde yaşayacağı yığılma gizlenebilir.
Vegeta gibi oran tabanlı araçlarda ise geliş oranı sabittir. Sunucu yetişemezse gecikme artar, hatalar görünür hale gelir ve kapasite sınırı daha net ölçülür.
Kısaca:
- “Kaç eşzamanlı kullanıcıyı kaldırabilirim?” diyorsanız eşzamanlılık tabanlı model uygundur.
- “Saniyede 2.000 istekte ne olur?” diyorsanız Vegeta gibi oran tabanlı model daha uygundur.
Daha geniş araç karşılaştırması için en iyi API yük testi araçlarına bakabilirsiniz.
Vegeta kurulumu
Kurulum yöntemi işletim sisteminize göre değişir.
macOS için 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üyse kaynaktan derleyebilirsiniz:
git clone https://github.com/tsenart/vegeta
cd vegeta
make vegeta
Kurulumu doğrulayın:
vegeta --help
Komut yardım çıktısını görüyorsanız CLI kullanıma hazırdır.
İlk Vegeta testi
Vegeta Unix pipe mantığıyla çalışır:
- Hedef istek tanımlanır.
-
vegeta attackyükü üretir. -
vegeta reportsonucu raporlar.
En basit örnek:
echo "GET http://localhost:8080/" | vegeta attack -duration=5s -rate=100 | vegeta report
Bu komut şunu yapar:
-
echo, test edilecek hedefi üretir. -
vegeta attack, 5 saniye boyunca saniyede 100 istek gönderir. - Toplamda yaklaşık 500 istek oluşur.
-
vegeta report, sonuçları özetler.
-rate bayrağı zaman birimi başına istek sayısını belirtir:
-rate=100 # saniyede 100 istek
-rate=100/1s # saniyede 100 istek
-rate=50/500ms # her 500 ms'de 50 istek
-rate=0 kullanırsanız oran sınırı kalkar ve Vegeta mümkün olan en yüksek hızda istek gönderir. Bu, sabit oranlı testten farklıdır; daha çok maksimum verim denemesi gibi düşünülmelidir.
Örnek metin raporu:
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:
Raporu okurken özellikle şu alanlara bakın:
-
Latencies: gecikme dağılımı -
50: medyan gecikme -
95ve99: kuyruk gecikmesi -
Success [ratio]: başarılı istek oranı -
Status Codes: HTTP durum kodları -
Error Set: bağlantı, zaman aşımı veya benzeri hatalar
Ortalama gecikme düşük olsa bile 99. yüzdelik dilim yüksekse kullanıcıların bir kısmı yavaş yanıt alıyor demektir.
Sonuçları dosyaya kaydedin
Hızlı denemeler için çıktıyı doğrudan vegeta report’a göndermek yeterlidir. Ancak tekrar analiz edeceğiniz testlerde ham sonuçları dosyaya kaydetmek daha kullanışlıdır.
echo "GET http://localhost:8080/" | \
vegeta attack -duration=10s -rate=200 -output=results.bin
Metin raporu üretin:
vegeta report results.bin
JSON raporu üretin:
vegeta report -type=json results.bin > metrics.json
Gecikme histogramı üretin:
vegeta report -type='hist[0,2ms,5ms,10ms,25ms,100ms]' results.bin
Histogram, isteklerin hangi gecikme aralıklarına düştüğünü gösterir. Böylece gecikmenin dar bir aralıkta mı toplandığını yoksa geniş bir dağılıma mı yayıldığını hızlıca görebilirsiniz.
Hedef dosyası ile çoklu endpoint testi
Gerçek API testlerinde tek bir GET isteği genellikle yeterli değildir. Birden fazla endpoint’i test etmek için hedefleri dosyaya taşıyın.
targets.txt 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
Kurallar:
- Her hedef
METHOD URLsatırıyla başlar. - Header satırları yöntem satırının altında yer alır.
- Header formatı
Anahtar: Değerşeklindedir. -
@./payload.jsonsatırı istek gövdesinin dosyadan okunacağını belirtir. - Boş satır hedefleri birbirinden ayırır.
-
#ile başlayan satırlar yorumdur.
POST gövdesi için payload.json dosyasını oluşturun:
{ "name": "Ada", "role": "engineer" }
Testi ç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 bu döngüyü sürdürür.
Kimlik doğrulama için genel header ekleyebilirsiniz:
vegeta attack -targets=targets.txt -rate=50 -duration=30s \
-header="Authorization: Bearer $TOKEN" | vegeta report
JSON hedef formatı
Programatik testlerde veya yüksek hacimli hedef üretiminde JSON formatı daha uygundur. Her satır bir JSON nesnesidir.
{"method": "GET", "url": "http://localhost:8080/api/users"}
{"method": "POST", "url": "http://localhost:8080/api/users", "header": {"Content-Type": ["application/json"]}, "body": "eyJuYW1lIjoiQWRhIn0="}
Çalıştırma:
vegeta attack -format=json -targets=targets.json -rate=100 -duration=30s | vegeta report
body alanı base64 kodlanmış olmalıdır. Bu format, hedefleri anlık üretip Vegeta’ya aktarmak için kullanışlıdır. Bellek verimliliği için -lazy seçeneğiyle birlikte kullanılabilir.
Grafik ve karşılaştırma üretme
Tek bir özet rapor, test süresince yaşanan trendleri gizleyebilir. Örneğin gecikme testin ortasında yükselip sonra normale dönmüş olabilir.
Vegeta plot komutuyla HTML grafik üretir:
vegeta attack -targets=targets.txt -rate=100 -duration=60s | \
vegeta plot > plot.html
Ardından dosyayı tarayıcıda açın:
open plot.html
Farklı yük seviyelerini karşılaştırmak için sonuçları ayrı dosyalara kaydedin:
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 CI ortamlarında HTML grafik yerine CSV dışa aktarabilirsiniz:
vegeta encode -to=csv results.bin > results.csv
Bu CSV çıktısını metrik toplama sistemlerine, dashboard’lara veya kendi analiz betiklerinize aktarabilirsiniz.
Vegeta ne zaman kullanılmalı?
Vegeta özellikle şu durumlarda uygundur:
- Belirli bir QPS/RPS hedefinde API gecikmesini ölçmek istiyorsunuz.
- Gecikme veya hata oranının hangi istek oranında bozulmaya başladığını bulmak istiyorsunuz.
- İki altyapı yapılandırmasını aynı yük altında karşılaştırıyorsunuz.
- CI içinde kolay çalışacak, script edilebilir bir CLI aracı istiyorsunuz.
- GUI bağımlılığı olmayan basit ve tekrarlanabilir testler çalıştırmak istiyorsunuz.
Vegeta odaklanmış bir araçtır. HTTP istekleri gönderir, durum kodlarını, gecikmeyi ve verimi ölçer. Ancak çok adımlı kullanıcı akışlarını dallanma mantığıyla modellemek veya yanıt gövdelerinde iş kuralı doğrulamak için tasarlanmamıştır.
Alternatifleri değerlendiriyorsanız k6 yük testi ve JMeter yük testi karşılaştırmalarına da bakabilirsiniz. Temel kavramlar için API performans testi eğitimi iyi bir başlangıçtır.
Fonksiyonel test yük testinden önce gelmeli
Yük testi “yeterince hızlı mı?” sorusunu yanıtlar. “Doğru mu?” sorusunu yanıtlamaz.
Bir Vegeta testi %100 başarı ve tüm isteklerde 200 OK gösterebilir. Ancak endpoint yanlış kullanıcıyı, eski fiyatı veya hatalı JSON alanını döndürüyor olabilir. Vegeta açısından bu yanıt hâlâ hızlı ve başarılı bir HTTP 200 yanıtıdır.
Doğruluk için ayrı kontroller gerekir:
- Yanıt gövdesi doğrulama
- JSON şema kontrolü
- Header kontrolü
- İş kuralı assertion’ları
- Çok adımlı senaryo doğrulama
Bu alan fonksiyonel testtir. Sağlıklı akış şu şekilde olmalıdır:
- API’nin doğru yanıt verdiğini doğrulayın.
- Doğrulanan endpoint’leri belirli bir oran altında Vegeta ile ölçün.
- Sonuçları gecikme, hata oranı ve verim açısından değerlendirin.
Bu noktada Apidog, Vegeta’nın yerine geçmekten çok onu tamamlar. Apidog’da durum kodu, header ve JSON alanları üzerinde görsel assertion’lar oluşturabilir, istekleri zincirleyebilir ve testleri veri dosyalarıyla çalıştırabilirsiniz. Vegeta ise aynı doğru akışın saniyede yüzlerce kez çağrıldığında hızlı kalıp kalmadığını ölçer.
CI içinde Apidog + Vegeta akışı
Apidog CLI ile fonksiyonel testleri CI içinde çalıştırabilirsiniz.
Kurulum:
npm install -g apidog-cli
Bir senaryo veya paketi çalıştırın:
apidog run --access-token "$APIDOG_ACCESS_TOKEN" \
-t <scenarioOrSuiteId> \
-e <environmentId> \
-r cli,html,junit
Parametreler:
-
-t: senaryo, klasör veya paket kimliği -
-e: ortam kimliği -
-r: raporlayıcılar (cli,html,json,junit)
junit çıktısı çoğu CI sistemiyle entegre edilebilir.
Örnek CI mantığı:
# 1. Fonksiyonel test
apidog run --access-token "$APIDOG_ACCESS_TOKEN" \
-t <scenarioOrSuiteId> \
-e <environmentId> \
-r cli,junit
# 2. Yük testi
vegeta attack -targets=targets.txt -rate=100 -duration=60s -output=results.bin
# 3. Rapor
vegeta report results.bin
vegeta report -type=json results.bin > metrics.json
Adım adım kullanım için Apidog CLI komut satırı eğitimine ve CI akışı için CI/CD işlem hattı kılavuzuna bakabilirsiniz.
Sıkça Sorulan Sorular
Vegeta POST gövdelerini destekliyor mu?
Evet. HTTP hedef dosyasında yöntemi ve URL’yi ilk satıra yazın, Content-Type header’ı ekleyin ve gövde dosyasını @./payload.json ile referanslayın.
Örnek:
POST http://localhost:8080/api/users
Content-Type: application/json
@./payload.json
JSON hedef formatında ise method, url ve base64 kodlu body alanlarını kullanın.
-rate=0 ne yapar?
Oran sınırını kaldırır. Vegeta istekleri bağlantıların ve işçilerin izin verdiği kadar hızlı gönderir. Bu, kontrollü sabit oran testi değil, maksimum verim denemesidir.
Tekrarlanabilir kapasite ölçümü için açık bir oran belirleyin:
-rate=100
-rate=500
-rate=2000
Gecikme yüzdelik dilimleri nasıl okunur?
Raporun Latencies satırı minimum, ortalama, 50., 90., 95., 99. yüzdelik dilimleri ve maksimum değeri gösterir.
Özellikle şunlara odaklanın:
-
50: tipik kullanıcı deneyimi -
95: yavaş kullanıcıların büyük kısmı -
99: kuyruk gecikmesi
Ortalama düşük olsa bile 95. veya 99. yüzdelik dilim yüksekse performans sorunu olabilir.
Vegeta API yanıtlarının doğru olduğunu kontrol eder mi?
Hayır. Vegeta verim, gecikme, durum kodu ve hata setini ölçer. Yanıt gövdesi, JSON şeması veya iş kuralları üzerinde assertion çalıştırmaz.
Bu nedenle Vegeta’yı fonksiyonel test aracıyla birlikte kullanmak daha sağlıklıdır.
Vegeta CI içinde nasıl çalıştırılır?
Vegeta tek bir CLI ikilisidir ve stdin/stdout ile çalışır. Bu yüzden CI adımlarına kolayca eklenir.
Örnek:
vegeta attack -targets=targets.txt -rate=100 -duration=60s -output=results.bin
vegeta report results.bin
vegeta report -type=json results.bin > metrics.json
Pratik akış:
- Fonksiyonel testleri çalıştırın.
- Başarılı endpoint’leri Vegeta ile yük altında ölçün.
-
results.bin, JSON raporu veya JUnit çıktısını CI artifact olarak saklayın.
Top comments (0)