Als je een API hebt ontwikkeld en deze wordt veel gebruikt, dan wil je weten hoe deze performed en wat dit betekent voor de load van de server of VPS waar deze op draait. Maar ook wat de calls zijn die een hoge request time hebben en welke veel aangeroepen worden. Hoe analyseer en controleer je dit? Heel simpel, het aloude gezegde 'meten is weten' gaat perfect hier op. Daarvoor gebruiken wij de webserver logs en de server statistieken.

Welke tools gebruik je hier dan voor en hoe werkt dat dan?

De belangrijkste tools die wij hiervoor gebruiken zijn Kibana, als onderdeel van een ELK stack, en Grafana. Deze tools zijn goed naast elkaar te gebruiken.

In Grafana is de performance van ons cluster inzichtelijk, dus per component (bv. een webserver of database server) kunnen we statistieken inzien over de load, CPU gebruik, disk i/o, aantal processen, memory usage etc. Met Telegraf worden deze statistieken (die je normaal met top, atop of htop op de server zelf bekijkt) opgeslagen in InfluxDB, waarmee je in Grafana dan dashboards kunt maken. Hierbij kun je deze data inzien per server voor een specifiek tijdsslot (laatste x minuten/uren/dagen/etc.), waarbij je zover terug in de tijd kan als je retentietijd toelaat.

Grafana Dashboard

Alle requests die de API afhandelt zijn inzichtelijk in Kibana. Dit wordt mogelijk gemaakt door alle logging van je webserver (Apache of Nginx) te pushen naar een ELK stack (Elasticsearch, Logstash & Kibana).

Vanaf de webservers versturen wij in een continue stream deze logs met Filebeat naar Logstash, waar de logfiles a.d.h.v. Grok patterns geparset worden. De log lines worden opgesplitst in losse velden (zoals request url, response time, timestamp etc.) waarna deze data in Elasticsearch word opgeslagen. Sla hierbij liever te veel dan te weinig op, want je weet nooit wanneer je welke data wilt raadplegen. Als je achteraf toch bepaalde info uit de log data nodig hebt die niet opgeslagen is, dan mis je die historische data.

Kibana is een interface bovenop Elasticsearch waarmee je vervolgens deze realtime data kunt doorzoeken, visualisaties kunt maken en dashboards kan opzetten. Denk hierbij bijvoorbeeld aan een totaal aantal requests per endpoint, gemiddelde response time per endpoint, de traagste endpoints, etc.. Ook deze data is inzichtelijk voor een specifiek tijdsslot, waarbij je zover terug in de tijd kan als je retentie tijd toelaat.

Kibana Dashboard

Hoe combineer je deze data dan?

Doordat je in zowel Grafana als Kibana kunt inzoomen op een bepaald tijdsslot, kun je de grafieken en overige visualisaties naast elkaar houden. Als er op een zeker moment in Grafana te zien is dat er een hoge load op je web,- of databaseserver is, dan kun je in Kibana kijken naar de endpoints die op dat moment een hoge response time hebben of juist vaak aangeroepen werden en de verhouding daartussen.

Deze data is nuttig om achteraf te analyseren, maar ook om data te vergaren van hoe een nieuwe functionaliteit zicht gedraagt onder load d.m.v. het doen van een loadtest. Hier lees je meer over in onze vorige blogpost: Performance testing: zo weet je hoe snel je applicatie is

In de loop van de tijd zul je ook patronen gaan ontdekken in het gebruik van je API, wat nuttige info op kan leveren, bv. wat de piek momenten zijn.

Wat kun je hier verder nog mee?

Een interessant aspect waar wij zelf nog niets mee gedaan hebben, maar wat wij zeker willen gaan onderzoeken is het toepassen van machine learning op je datastroom in Kibana. Hiermee wordt het mogelijk om o.a. te forecasten op basis van trends en om anomalieën detecteren.

Zowel Grafana als Kibana hebben de mogelijkheid tot alerting, waarbij je een kanaal zoals Slack, PagerDuty, email etc. kunt gebruiken. Hiervoor kun je thresholds instellen, bijvoorbeeld wanneer de load op een server gedurende 10 minuten boven de 10 uitkomt, zodat er een alert verstuurd wordt. Hierop kun je dan actief reageren en op onderzoek uitgaan. Deze tooling kun je dus zowel voor het analyseren als actief monitoren en alerting gebruiken. Kortom, meten is weten ;-)

Stappenplan

Hieronder vind je een stappenplan om zelf een setup op te zetten. Voorbeelden van hoe de configuratie eruit moet zien zijn er legio op het internet. Het beste advies hierbij is: begin klein en verifieer bij elke stap of je output klopt met je verwachting. Zet je iets in InfluxDB? Controleer of er daadwerkelijk data in de DB staat. Stream je log data naar Logstash? Verifieer dat het in Elasticsearch opgeslagen wordt vanuit Logstash.

Grafana

  1. Configureer een server met InfluxDB [1] en Grafana [2]
  2. Installeer en configureer Telegraf [3] op de server(s) die je wilt monitoren, zodat deze data gaat opslaan in je InfluxDB.
  3. Stel je dashboard samen in de interface van Grafana [2]

Kibana

  1. Configureer een server met ELK stack [4] of maak gebruik van de cloud dienst van Elastic [5]
  2. Installeer en configureer Filebeat [6] zodat logging gestreamed wordt naar je ELK stack. In eerste instantie zou ik rechtstreeks naar Elastisearch streamen en dat valideren om daarna  pas naar Logstash te streamen en Grok patterns [7] toepassen.
  3. Zodra de data goed in Elastisearch staat kun je aan de slag met het doorzoeken van de data, hier visualisaties van te maken en een dashboard samen te stellen.

Resource

[1] https://docs.influxdata.com/influxdb/v1.7/introduction/installation/
[2] https://grafana.com/grafana/
[3] https://www.influxdata.com/time-series-platform/telegraf/
[4] https://www.elastic.co/guide/en/elastic-stack/current/installing-elastic-stack.html
[5] https://www.elastic.co/products/elastic-stack
[6] https://www.elastic.co/products/beats/filebeat
[7] https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html

Geschreven door: Arjan Passchier

Meer kennis bijspijkeren? Kom dan naar onze Meetup: Ode aan de Code!

Bekijk onze Meetups

Wij zijn altijd op zoek naar getalenteerde vakgenoten!

Bekijk onze vacatures