DEV Community

Cover image for Vegeta Yük Testi: Sabit Oranlı HTTP Eğitimi
Tobias Hoffmann
Tobias Hoffmann

Posted on • Originally published at apidog.com

Vegeta Yük Testi: Sabit Oranlı HTTP Eğitimi

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.

Apidog'u bugün deneyin

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Diğer paket yöneticileri:

# MacPorts
port install vegeta

# Arch Linux
pacman -S vegeta

# FreeBSD
pkg install vegeta
Enter fullscreen mode Exit fullscreen mode

Go yüklüyse kaynaktan derleyebilirsiniz:

git clone https://github.com/tsenart/vegeta
cd vegeta
make vegeta
Enter fullscreen mode Exit fullscreen mode

Kurulumu doğrulayın:

vegeta --help
Enter fullscreen mode Exit fullscreen mode

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:

  1. Hedef istek tanımlanır.
  2. vegeta attack yükü üretir.
  3. vegeta report sonucu raporlar.

En basit örnek:

echo "GET http://localhost:8080/" | vegeta attack -duration=5s -rate=100 | vegeta report
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

-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:
Enter fullscreen mode Exit fullscreen mode

Raporu okurken özellikle şu alanlara bakın:

  • Latencies: gecikme dağılımı
  • 50: medyan gecikme
  • 95 ve 99: 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
Enter fullscreen mode Exit fullscreen mode

Metin raporu üretin:

vegeta report results.bin
Enter fullscreen mode Exit fullscreen mode

JSON raporu üretin:

vegeta report -type=json results.bin > metrics.json
Enter fullscreen mode Exit fullscreen mode

Gecikme histogramı üretin:

vegeta report -type='hist[0,2ms,5ms,10ms,25ms,100ms]' results.bin
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Kurallar:

  • Her hedef METHOD URL satı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.json satı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" }
Enter fullscreen mode Exit fullscreen mode

Testi çalıştırın:

vegeta attack -targets=targets.txt -rate=50 -duration=30s | vegeta report
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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="}
Enter fullscreen mode Exit fullscreen mode

Çalıştırma:

vegeta attack -format=json -targets=targets.json -rate=100 -duration=30s | vegeta report
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Ardından dosyayı tarayıcıda açın:

open plot.html
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Başsız CI ortamlarında HTML grafik yerine CSV dışa aktarabilirsiniz:

vegeta encode -to=csv results.bin > results.csv
Enter fullscreen mode Exit fullscreen mode

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:

  1. API’nin doğru yanıt verdiğini doğrulayın.
  2. Doğrulanan endpoint’leri belirli bir oran altında Vegeta ile ölçün.
  3. 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
Enter fullscreen mode Exit fullscreen mode

Bir senaryo veya paketi çalıştırın:

apidog run --access-token "$APIDOG_ACCESS_TOKEN" \
  -t <scenarioOrSuiteId> \
  -e <environmentId> \
  -r cli,html,junit
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Pratik akış:

  1. Fonksiyonel testleri çalıştırın.
  2. Başarılı endpoint’leri Vegeta ile yük altında ölçün.
  3. results.bin, JSON raporu veya JUnit çıktısını CI artifact olarak saklayın.

Top comments (0)