RESTful API Üzerinde Baştan Sona Performans Testi
Published: 2022-01-17 19:56:26

Başlarken;
- Jmeter kurulumu
- Jmeter ile test ortamının hazırlanması
- İlk sonuçların alınması
- InfluxDB kurulumu
- Grafana kurulumu
- Grafana gösterge paneli üzerinde test sonuçlarının gösterilmesi
üzerinden baştan sona bir perfomans testini ayrıntılı konuşacağız.

Performans testi: bir çok yazılım mühendisinin çok defa karşılaştığı, çözüm ürettiği ve bu testler sayesinde üzerinde çalıştığı sistemin artı ve eksilerini gördüğü bir testtir. Ama çoğu durumda test ekibi dışında olan yazılım mühendislerinin fazla dikkat etmediği de bir konudur aslında. Kendi testlerini genel olarak bir kaç defa yük veya performans testi yaptıktan sonra ki bu da genelde REST Api üzerinden olur, yazdığı kod bloğunu commit/deploy etme yada bir diğer ifadeyle canlıya alma yoluna gider. Genel olarak ben de böyle yapıyordum. Çünkü performans testinin çok çetrefilli olduğunu, bir çok konfigürasyon yapmam gerektiğini bununla zaman kaybedeceğime yeni geliştirmeler yapabileceğimi düşünüyordum. 
Fakat gördüm ki yazdığım kodlar, oluşturduğum sorgular her ne kadar optimize edilmiş olsa da canlı da yavaş çalışan sistemler, açılmayan web sayfaları olarak karşıma çıkıyordu. Bu durum beni performans veya yük testini kendi içimde nasıl yapabilirimin sorusunun cevabını bulmaya gitti ve öğrenmeye başladım. Öğrendikten sonra, yaklaşık 1-2 saat içerisinde yazmış olduğum herhangi bir HTTP Request i rahatlıkla test edebilir hale getirdiğimi gördüm. Bu sebeple sizin de benim gibi performans takıntınız varsa ve bunu kolay ve anlaşılır yoldan yapmak istiyorsanız, bu yazı size göre olabilir.
Öncelikle REST Api mizi test edebilecek bir araca ihtiyacımız olacak. Bunlardan yaygın ve ücretsiz olanlardan bir tanesi JMeter ile başlayacağız. Jmeter nedir ne değildir bu gibi çok ayrıntıya girmeyeceğiz, işimizi görecek kadar bilsek yeterli şu an için. Kronometreleriniz açık mı? Bakalım siz kaç saat veya dakikada test sisteminizi oluşturacaksınız.

---

## Jmeter Kurulumu ve İlk Test
Jmeter aracını indirmek için [bu linkten] (https://jmeter.apache.org/download_jmeter.cgi) faydalanabilirsiniz. Şu an ben Apache JMeter 5.4.3 sürümünü kullanıyorum, belki siz bu yazıyı okuduğunuzda sürüm bilgileri değişmiş olabilir. İlgili sayfada belirttiği üzere bilgisayarımda Java 8+ olup olmadığında dikkat ediyorum, değilse Java nın 8 veya üstü sürümünü indiriyorum. Burada iki kaynak (Source / Binaries) var ben Binaries olanı seçiyorum ve aşağıdaki resimde görüldüğü üzere apache-jmeter-5.4.3.zip dosyasını indiriyorum.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2fwvygtonlu2fc3jkrmr.png)
İndirdiğim dosyayı unzip edip, **apache-jmeter-5.4.3\bin\jmeter.bat** uzantısına tıklayarak Jmeter ımı açıyorum. Jmeter ana sayfam açıldıktan sonra sizin da karşınıza aşağıdaki gibi bir görsel çıkması gerekiyor. Eğer çıktıysa doğru yoldasınız demektir.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y333u7werzvhacjtohdf.png)
Önemli bir hatırlatma: Yukarıdaki resimde gördüğünüz üzere Jmeter 2 numaralı cmd.exe den beslendiği için kapatmanız durumunda Jmeter da kapanacaktır. Kapatmadan işlemlerinize devam ediniz.
Şimdi test planımızı (1 numara) oluşturmamız lazım. Bir performans veya yük testi yapabilmek için ihtiyaç duyduğumuz yegane şey sanal kullanıcılardır. Yani sitemize 10 kişi veya 100 kişi girdiğinde sitemiz nasıl tepki veriyor, bu yükü kaldırabiliyor mu, performanslı çalışıyor mu görmek isteriz. Bu 10,100 veya 1000 sanal kullanıcıyı oluşturmak için Test Plan tabına sağ tıklayarak **Add->Threads(Users)->Thread Group** sekmesine tıklıyoruz. Resimde görüldüğü üzere Thread Group ile ne kadar user ile test etmemiz gerektiğine ve hangi saniye aralıklarla bunu yapmamıza ve döngü yapıp yapmayacağımıza karar verebiliyoruz.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/geobcqgebrkrkzwqcw31.png)

İlgili RestAPI mizi kaç thread veya kullanıcı ile test edeceğimize karar verdikten sonra, örneğin ben 200 kullanıcı ile test edeceğim, REST API de çağırma methodlarımız olarak da bilinen bir HTTP Request oluşturacağız. HTTP Request ile belirlediğimiz bu 200 kullanıcı hangi HTTP Requesti ve Requestleri test etsin ona karar vereceğiz. Bunun için aşağıdaki resimde de görüldüğü üzere Thread Group tabına sağ tıklayıp **Add->Sampler->HTTP Request** sekmesine tıklayıp yeni bir HTTP Request oluşturuyorum. 


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0fwxac3m6sivr9bc9kjh.png)

Ben kendi REST Api mi değil de internette free REST Api test edebileceğim bir sayfa üzerinde test edeceğim. Bunun için [reqres.in](https://reqres.in/) web sayfasını kullanıp, oradan bir HTTP Request seçmek istiyorum. Aşağıdaki resimde görüldüğü üzere **https://reqres.in/api/users?page=2 ** api sayfasını test edeceğim. 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ujs15jqu1vbymmm14u6d.png)

> Eğer siz kendi oluşturduğunuz Rest API yı test etmek isterseniz ve bir HTTP Header a ihtiyacınız varsa, yine Thread Group a sağ tıklayıp Add-> Config Element-> HTTP Header Manager ı seçmeniz yeterli olacaktır. Bir sonraki yazımda kendi REST API mizi oluşturup test etmeyi de anlatmayı düşünüyorum.

Test edeceğimiz API url ini belirledikten sonra bunu Jmeter ile nasıl tanımlıyoruz ona bakalım. Jmeter da HTTP Request i sekmesini tıkladığımızda aşağıdaki gibi bir görsel gelecektir. 


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dni8shelic2y6njjfove.png)
 İlgili url imin **https://reqres.in/api/users?page=2 **  yukarıdaki resimde nasıl dağıtıldığını görmektesiniz. 7 numaralı kısıma server veya ip ismi, 8  numaralı kısma path imiz, son olarak 9 nolu kısıma ise parametremizi yazıyoruz, bu da url deki soru işareti kısmından sonra kısıma denk geliyor. Şu an ufak bir API testi yaptığımızdan ve genel bir anlatım olduğundan çok detaya giremiyorum. İlerleyen zamanlarda bu kısmı da detaylandırabiliriz. Ayrıca şunu da belirtmek isterim ki, biz şu an her ne kadar bir HTTP Request le test etsek de normal de daha çok HTTP Requesti de test edebiliriz. Sadece yeni bir HTTP Request oluşturmanız ve farklı bir api url i girmeniz gerekecektir.

Şimdi geldik verilerimizi analiz etmeye. İlk görseli görmek isterseniz, Thread Group a yine sağ tıklayarak Add-> Listener -> ... diyerek istediğiniz analiz verilerini görebilirsiniz. Ben örnek olsun diye **View Result Tree** ve **View Result in Table** ı ekleyeceğim. İlgili listener ları ekledikten sonra testi başlatmak için Jmeter ı ilk önce kaydedip, daha sonra Run(Play) butonuna basmak yeterli olacaktır. Test bittikten sonra ilgili listener lara tıkladığınızda sonuçları görebileceksiniz.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/go46j9pel1w334f0zhcy.png)

Hadi gelin şimdi bu test sonucunda dönen datayı görselleştirip, daha iyi analiz edilebilir hale getirelim. Bunun için test sonuç verilerini aktaracağımız Influx DB ye ve sonucu görselleştireceğimiz Grafana ya ihtiyacımız olacak.

---

## Influx DB Kurulumu

Jmeter yapmış olduğumuz testi daha iyi bir görsel ile analiz etmek istiyorsak bunun en kolay yollarından bir tanesi, InfluxDB ile Jmeter den gelen analiz verilerini kaydedip, Grafana aracı ile bu veriyi göstermek. Bunun için ihtiyacımız olan Influx DB yi indirmek için [linke](https://portal.influxdata.com/downloads/) tıklayabilirsiniz. Fakat burada önemli bir detayı vermekte fayda var. Eğer InfluxDB nin son sürümünü indirirseniz, Grafana daki analiz görsellerinizi (dashboard) FluxDB query ile oluşturmanız gerekiyor, normalde Granfana da Jmeter analiz görselleri için hazır yapılar var fakat bunların çoğu FluxDB yi desteklemiyor. O yüzden benim amacım FluxDB ile dashboard oluşturmak olmadığından InfluxDB'nin 1.8... versiyonunu indirdim. Aşağıdaki resimden InfluxDB'nin eski versiyonunun nerede olduğunu görebilirsiniz. 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n0tgp9ab5c22ptei3a6f.png)
Direk bir setup linki olmadığından veri tabanını Windows için verdiği PowerShell komutuyla indirebilirsiniz. İlgili satırı kopyalayıp PowerShell inize yapıştırdığınızda sürümün inmeye başladığını göreceksiniz. İşte bu kadar kolay. InfluxDB nizin indiği yere gidip dosyayı unzip ediyoruz. Genelde C:\Users\[Bilgisayar İsminiz] olduğu yerde oluyor, dikkat etmekte fayda var.

Unzip ettikten sonra **...\influxdb-1.8.10_windows_amd64\influxdb-1.8.10-1\influxd.exe** yi çalıştırarak InfluxDB'imizi ayağa kaldırıyoruz. Ayağa kaldırdıktan sonra yapmamız gereken bir veri tabanı ve bir kullanıcı adı oluşturmak. Bunu oluşturmamızın sebebi, Jmeter veriyi hangi veritabanına yazsın onu söylemek, Grafana hangi veri tabanına hangi kullanıcı ile bağlansın onu belirtmek için. Bunun için **...\influxdb-1.8.10_windows_amd64\influxdb-1.8.10-1\influx.exe** dosyasını çalıştırıyoruz ve karşımıza gelen .exe ekranına 

`CREATE DATABASE test_db`

yazıyor ve enter a basıyoruz. Kullanıcı oluşturmak için de aşağıdaki kod satırını yazıp, enter a basmanız yeterli olacaktır.

`CREATE USER root with password 'root'`

**

> Tekrar hatırlatmak da fayda var, çalıştırdığınız .exe file larını lütfen tüm test süreciniz bitene kadar kapatmayınız.
** 

Şimdi, InfluxDB yi bu şekilde bırakalım ve Grafana nın kurulumuna geçelim. Grafana nın kurulumunu yapıp veri tabanımızı bağladıktan sonra Jmeter üzerinde yapılan testin Grafana da nasıl göründüğüne hep beraber bakalım.

---

## Grafana Kurulumu

Ben yukarıda ki diğer kurulumlar gibi Grafanada da aynı yöntemle ilerleyeceğim. İlgili [linke ](https://grafana.com/grafana/download?platform=windows) tıkladığınızda aşağıdaki görselde görüldüğü üzere Windows Binaries i seçip, ilgili zip dosyasını indirip, unzip ediyoruz.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ysa0khy3ouqmhxv7m10b.png)

Unzip ettikten sonra indirdiğiniz yolun **...\grafana-8.3.3\bin
** klasörüne gidip grafana-server.exe yi çalıştırıyoruz. İlgili .exe dosyasını hiç kapamadan **http://localhost:3000** adresine gidiyoruz. İlk açılışta sizi bir login sayfası karşılayacak, default user / password olan;
`Username: admin
Password: admin`
girip devam edebilirsiniz.

Şimdi sıra geldi InfluxDB yi Grafana ya bağlama işlemine. Bunun için aşağıdaki görseldeki gibi Configuration-> Data Source sekmesine tıklıyoruz. 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5cdjca0rch6dq278n899.png)

Gelen sayfadan **Add Data Source** butonuna tıklayıp, InfluxDB yi seçiyoruz. Karşınıza bir bağlamayı planladığınız InfluxDB nin bağlantı bilgilerini doldurmanız gereken bir form gelecek. Şimdi sırayla bu bilgileri dolduralım.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p1z23sdxxq2invuwidjx.png)

- 13 numaralı alana ilgili bağlantıya bir isim veriyosunuz, ben MyTest olarak isimlendirdim.
- 14 numaralı alana sorgu dilinizi seçiyorsunuz, biz 1.8 versiyonunu indirdiğimiz için InfluxQL i seçiyoruz.
- 15 numaralı alana veritabanınızın url sini giriyorsunuz. Burada default olarak bir url yazıyordur, fakat doğru olsa bile oraya ilgili url nizi yazınız. Url bilginiz yukarıda bahsettiğim influx.exe yi çalıştırdığınızda karşınıza çıkacaktır. Default url ekranda görüldüğü gibidir.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tgotpvsi5ujs8qbsxwdj.png)

- 16 numaralı alana yukarıda oluşturduğumuz veri tabanı ismi, kullanıcı adı ve şifre bilgilerini giriyoruz.
- 17 numaralı alanı GET olarak seçiyoruz ve 18 numaralı butona tıklayıp görseldeki gibi bağlantının başarılı olduğunu görüyoruz.

Yukarıda yapılanları kısaca özetlersek, şimdiye kadar;
- Jmeter kurulumu ve konfigürasyonu yaptık.
- Jmeter da ilk testimizi gerçekleştirdik.
- InfluxDB kurulumunu yaptık. Veri tabanı, kullanıcı ve şifre bilgilerini oluşturduk.
- Grafana yı kurduk, InfluxDB yi veri kaynağı (Data Source) olarak belirleyip, bağlantımızı gerçekleştirdik.

Bundan sonra ise;
- Grafana da Jmeter i görüntüleyebileceğimiz hazır bir dashboard oluşturacağız.
- Jmeter daki verileri InfluxDB ye canlı olarak aktarıp, Grafana dashboard u üzerinde görüntülemeye çalışacağız.

Hadi başlayalım...

## Grafana da Jmeter Gösterge Paneli (Dashboard) Oluşturma

Buradaki amacımız Jmeter dan gelen verileri, log olarak satır satır okumak yerine görsel anlamda zengin bir dashboard kullanıp, performans analizimizi yapmak olacaktır. Bunun için hazır dashboardlar kullanacağız. 
Ben [linkteki ](https://grafana.com/grafana/dashboards/5496) dashbordu kullanacağım. Siz isterseniz ilk başta benim seçtiğim dashboard ile ilerleyin, testinizi bitirdikten sonra başka dashboardları [bu sayfadan](https://grafana.com/grafana/dashboards/) seçebilirsiniz. Burada gördüğünüz üzere her dashboardun bir ID si var ve siz bu ID üzerinden dashboardunuzu kolaylıkla oluşturuyorsunuz. İlgili ID yi kopyalayıp, aşağıdaki görseldeki gibi Import alanına tıklıyoruz,

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mrx2o59j86hmtmrpcxbh.png)
ve **_Import via grafana.com _** kolonuna yapıştırıyoruz. Load dedikten sonra, aşağıdaki görseldeki gibi ekranın gelmesini bekliyoruz.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vw4u8g3oedwyt7116kiw.png)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jaf0biobsjo4dgq72fjq.png)

Yükleme tamamlandıktan sonra, 21 numarada görülen yere Data Soruce muzu seçiyoruz ve **Import** butonuna tıklıyoruz.

Ve işte ilk dashboardumuz hazır :)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ktjgr53nwj0evv743ctm.png)

Şimdi en son olarak Jmeter ımızı InfluxDB ye aktarımını yapıp canlı olarak Grafana üzerinden görüntüleyeceğiz.

> Burada **önemli bir not düşeyim**, verilerinizin canlı aktığını görebilmeniz için Grafana daki dashbordunuzda Yineleme zamanını Off tan farklı değer vermeniz gerekecek. Bunu aşağıdaki görsele bakarak değiştirebilirsiniz.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/67kyh0jbyhxnuqoaiqts.png)

Jmeter a tekrar geliyoruz ve yeni bir **listener** daha ekleyeceğiz. Bunun için yukarıda anlattığım adımlara bakarak Thread Group a sağ tıklayıp **Add-> Listener -> Backend Listener** ı ekliyoruz.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fv62f1gkxv4g346og0vy.png)

Ekledikten sonra 22 numaradaki listeye tıklayıp, benim seçtiğim kaynağı seçiyoruz. 23 numaradaki InfluxDbUrl alanını yine benim gibi dolduruyoruz. Burada yaptığım tek şey default gelen url alanına localhost ve veri tabanı ismini eklemek oldu. İşlemimiz bittikten sonra kaydet butonuna tıklıyoruz ve test planımızı en son haliyle kaydediyoruz.

Hadi test edelim...

Uzun bir yazıdan sonra yapmış olduğumuz emeğin karşılığını almaya hazırız. Jmeter Başla (Play) tuşuna basınız ve hemen ardından Grafana daki dashbordunuzu açınız. Tebrikler, ilk testinizin sonucunu aldınız. Tabii ben az bir kullanıcı ile yaptığımdan kaynak tüketimim az oldu ve bu sebeple hataya düşen hiç bir işlemim (thread) olmadı :) 


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3unggjyeujq1sjlwfwm7.png)

Bu konu ile ilgili takıldığınız veya yapamadığınız bir durum oluşursa lütfen yorumlara yazınız, birlikte sorunun üzerine gidip çözebiliriz. Bir sonraki yazımızda görüşmek üzere, sağlıcakla kalınız.