Continuous monitoring in DevOps met Grafana

Sanne Jelink, oktober 2021.


Stel je eens voor, na een paar sprints heb je met je een team een product af wat naar productie gedeployed wordt. Vanaf dat moment wordt de applicatie eigenlijk een zwart gat. Hoe houd je als team nu in de gaten wat er allemaal gebeurt in je software?

Voor de minor DevOps heb ik onderzoek gedaan naar een nieuwe technologie die bij DevOps wordt toegepast, zodat deze toegepast kan worden in het eindproduct.

In dit onderzoek heb ik gekozen voor een tool die een oplossing biedt voor het eerder geschetste probleem, Grafana. Deze tool past ook bij één van de weekthema's die besproken is in deze minor, SlackOps. Grafana wordt gebruikt in continous monitoring. In dit blog leg ik uit wat Grafana doet, wat continous monitoring is en aan het einde is er ook een demonstratie voor het toepassen van Grafana bij het monitoren van een applicatie. Daar maken we een dashboard over netwerk gebruik en memory, wat alerts verzend bij te hoge waardes.

Wat is Grafana?

Skedler beschrijft Grafana als volgt:

Grafana is an open source visualization and analytics software. It allows you to query, visualize, alert on, and explore your metrics no matter where they are stored. (Skedler Team, 2021)

Kort gezegd is Grafana dus een tool waarmee data, specifiek time-series data, gevisualiseerd kan worden. Grafana is geen tool die zelf data genereert of opslaat, het moet data uit externe bronnen halen. Denk hierbij aan een database of een monitoring tool zoals Prometheus. Grafana kan wel data uit verschillende bronnen combineren tot één dashboard. Een groot voordeel van Grafana is dat de tool zelf al veel ingebouwde data source plugins heeft, waardoor het makkelijk is om data uit veel voorkomende tools op te halen. Ook is Grafana open-source, waardoor er veel extra te downloaden is (zoals plugins, type visualisaties maar ook hele dashboards).

Door Grafana is er ook een voorbeeld gemaakt van een aantal dashboards, wat hier te vinden is.

Grafana binnen devOps

Hieronder staat een afbeelding met de acht DevOps onderdelen. Grafana is onderdeel van de stap 'monitor.'

delta-n (2021)

In deze stap is het product al gedeployed en ga je als team met diagnostische gegevens de gezondheid van je applicatie monitoren. In het artikel van Bose (2020) zijn er drie categorieën van monitoring beschreven die je tijdens deze fase kan toepassen:

  • Infrastructure Monitoring: Het monitoren van de infrastructuur (CPU usage, beschikbaarheid etc.)
  • Application Monitoring: Het monitoren van een applicatie. (response time, availability etc.)
  • Network Monitoring: Het monitoren van netwerk activiteit.

Grafana's rol in het monitoren is het visualiseren van deze gegevens. Zoals in de inleiding al benoemt moeten de gegevens wel ergens anders vandaan worden gehaald.

Een praktisch voorbeeld is te vinden op Stack Overflow. Stack Overflow gebruikt Grafana om data uit Elasticsearch, OpenTSDB en hun alerting tools (Bosun) te visualiseren. Stack Overflow geeft aan dat Grafana helpt om snel een unieke dashboard te maken waarin ze bronnen combineren. En omdat Grafana open-source is geeft het ze de mogelijkheid om plugins te schrijven voor hun eigen alerting tools. (How Stack Overflow Uses Grafana to Optimize Its Systems, z.d.)

Een applicatie monitoren met Grafana

Nu het duidelijk is wat Grafana is en waarvoor het toegepast wordt binnen DevOps kunnen we Grafa toepassen op een applicatie. Deze applicatie is te vinden in deze GIT repository. Hiervoor moet je docker geïnstalleerd hebben. Om de applicatie te runnen voer je docker-compose up uit.

Nu draait er een simpele Gradle applicatie met één REST endpoint op localhost:8081. De endpoint kan getest worden met het volgende GET request.

http://localhost:8081/greeting?name=test

Je ontvangt dan Hello, test! terug.

Verder draait nu ook Prometheus(http://localhost:9090) en cAdvisor (http://localhost:8080).cAdvisot cAdvisor doet het volgende:

cAdvisor (Container Advisor) provides container users an understanding of the resource usage and performance characteristics of their running containers. It is a running daemon that collects, aggregates, processes, and exports information about running containers. Specifically, for each container it keeps resource isolation parameters, historical resource usage, histograms of complete historical resource usage and network statistics. This data is exported by container and machine-wide. (Google, z.d.)

Prometheus verzamelt de data uit cAdvisor en stelt deze beschikbaar voor Grafana.

Ook draait Grafana nu op http://localhost:3000/. Hier navigeren we nu heen om ons eerste dashboard te maken.

Stap 1: verbinden van Grafana met Prometheus

Navigeer naar Grafana, log in met de username en wachtwoord admin.

Maak vervolgens eerst verbinding met een datasource, in ons geval Prometheus. Via het tandwiel in het menu links, navigeer je naar datasources. Voeg een Prometheus source toe. Selecteer dan het Prometheus data type. Vul hier onderstaande gegevens in:

Sla deze configuratie op en selecteer dan links de create optie om een nieuw dashboard te creëren.

Nu beginnen we met het visualiseren van wat basisstatistieken.

Stap 2: visualiseren van data

Voor onze back-end maken we een dashboard met de volgende visualisaties:

  • Memory usage
  • Memory cached
  • Received and sent network traffic.

Voordat we beginnen met het toevoegen van visualisaties voegen we eerst een variabele op het dashboard toe. We moeten namelijk bij sommige grafieken kiezen voor welke container we de visualisaties willen tonen. Door hier een variabele voor toe te voegen, kan dit dashboard gebruikt worden voor verschillende containers.

Rechtboven selecteer je instellingen en ga je naar variables. Hier maak je een variabele met de volgende instellingen:

De waarde van de variabele moeten we nog wel instellen. Het is mogelijk om deze op te halen met een query, maar voor dit voorbeeld vullen we het zelf in. Hiervoor haal je met het volgende commando in de terminal de code van de container op.

docker ps

Noteer de code achter gradle-democopy_resource en navigeer naar localhost:8080. Hier staan alle containers die gemonitord worden. Navigeer naar /docker en hier zie je de containers.

Kopieer de naam van de container die begint met dezelfde code als we eerder genoteerd hebben. Vul deze waarde in en sla dan je variabele op.

Memory met simpele queries.

Vervolgens terug op het dashboard zie je een panel met drie opties:

  • Add an empty panel
  • Add a new row
  • Add panel from the panel library

We beginnen met een new row waarin we informatie over de memory gaan opslaan. Voeg een nieuw paneel toe. Je bent nu op het volgende scherm:

Onderaan bij de query gaan we er een toevoegen om informatie uit Prometheus te halen. Je kan zelf een query schrijven, maar je kan ook de query builder gebruiken. Eerst maken we een query met de builder. De metric die we willen weergeven in deze tabel container_memory_usage_bytes. Dit willen we niet van iedere container, dus we selecteren het label id. Hiervoor kiezen we dan vervolgens de naam van de juiste container. Dit levert bij mij de volgende query op:

container_memory_usage_bytes{id="/docker/ac86b01f14c893b0816b7981206230d77526add737303b721bff0e3b17069d10"}

Met use query kunnen we de query toepassen. Dan krijg je ongeveer de volgende grafiek te zien.

Deze is nog te verbeteren. Ten eerste wil ik mijn variabele in de query gebruiken. Dit doe ik door de query aan te passen mt de volgende code.

container_memory_usage_bytes{id="$container"}

In de query tab verander ik ook de legenda. Hier zet ik 'Back-end' neer. Deze kan je ook dynamisch maken door bijvoorbeeld {{id}} neer te zetten. Ook verander bij 'Panel options' in de rechterkant van het scherm de titel naar 'Memory usage'. In dit paneel heb je nog veel meer opties, zoals thresholds, kleurenschemas en andere display opties. Na deze veranderingen ziet de grafiek er dan als volgt uit.

Deze zelfde stappen gebruik ik voor de cached memory, hiervoor gebruik ik 'container_memory_cache'. Hierna zijn je eerste grafieken klaar.

Network traffic met complexere queries.

Nu voegen we nog een grafiek over network traffic toe. Hiervoor gebruik ik wat complexere queries en ga ik meerdere queries in één grafiek stoppen. Maak op je dashboard een nieuw paneel aan. Hierin komen de ontvangen (container_network_receive_bytes_total) en verzonden bytes (container_network_transmit_bytes_total).

Eerst maken we een query voor de ontvangen bytes. Hier zetten we een query functie function omheen, rate(). Deze berekent de gemiddelde verhoging.

rate(container_network_receive_bytes_total{}[5m])

Met deze query krijg je meerdere resultaten en dus ook meerdere lijnen in je diagram. Deze lijnen voegen we samen door nog sum() om de query heen te zetten. Hierna kan je ook de legenda aanpassen.

sum(rate(container_network_receive_bytes_total{}[5m]))

De verzonden bytes kan je ook toevoegen in dezelfde grafiek, door een tweede query toe te voegen. Gebruik hier container_network_transmit_bytes_total. Als je dit correct hebt gedaan, dan heb je het volgende resultaat.

Stap 3: alerts

We gaan nu een aantal statistieken van de applicatie bekijken. Op het moment dat er iets fout gaat, wil je daar snel van op de hoogte zijn. Hier zijn alerts voor. Ter voorbeeld gaan we voor de ontvangen bytes een alert instellen.

Om alerts te ontvangen hebben we eerst een alert channel nodig. In het linker menu kan je bij het belletje een alerting channel toevoegen. Ik heb ervoor gekozen om slack te gebruiken. Met deze tutorial heb ik een webhook url aangemaakt die ik in Grafana instel.

Navigeer terug naar het dashboard en je network grafiek en ga dan naar de tab 'alerts'. Ter voorbeeld vullen we het volgende in:

Vervolgens als je terug navigeert naar het dashboard, kan je naast de refresh knop instellen dat het dashboard automatisch refreshed. Na een tijdje krijg je in je grafiek te zien dat het alert geactiveerd wordt en krijg je een alert op je ingestelde channel:

Als we nu de Is Above in de alert verhogen naar een hoog getal krijg je een bevestiging dat je alert verholpen is.

Stap 4: exporteren van het dashboard

Nu het dashboard klaar is gaan we deze exporteren, zodat we het dashboard later opnieuw kunnen inladen. Via de share knop (naast de naam van je dashboard) kan je een JSON bestand exporteren. Met dit bestand kan je het dashboard importeren. Het is dan ook mogelijk om templates van dashboards online te downloaden en te delen.

Conclusie

Met Grafana kan data uit verschillende bronnen snel omgezet worden naar een dashboard. Deze dashboards, in combinatie met alerts helpen je om je applicaties in de gaten te houden. In de demo heb ik gezien hoe je simpele grafieken kan aanmaken en queries kan schrijven. Met deze kennis van Grafana kan ik in het project continous monitoring toepassen op de pitstop applicatie.

Bronnen

Last change: 2025-01-13