# Labo TICK stack
## Labo inhoud
### Opgave
Je gaat aan de slag met de TICK stack. Je zal de verschillende componenten leren kennen en gebruiken. Het labo is een integratie-oefening, m.a.w. **je zal gebruik maken van de reeds eerder vergaarde kennis en kunde**. De bedoeling is dat dit labo wordt uitgewerkt gedurende **twee lesweken**.
### Deadline
Ten laatste voor de start van het volgende labo (deel 1).
### Indienen
Je dient het verslag in via Leho – Opdrachten (als PDF-bestand).
## Inleiding
### Doestelling
De bedoeling van dit labo is **niet** om na te gaan hoe snel je kan lezen, commando’s kan invoeren en de output kan plakken in een document.
De bedoeling van dit labo is **wel** dat je de tijd neemt om rustig op verkenning te gaan en bij te leren over het systeem waarmee we werken. De opgave dient enkel als leidraad voor jouw zoektocht. Maak er dus geen race tegen de klok van.
### Benodigdheden
* Je eigen laptop
* Je krijgt toegang tot een VM met:
* Ubuntu 18.04.4
* Docker 19.03.8
* docker-compose 1.25.4
* De credentials zijn teurg te vinden op Leho
### De Pipeline
**Deze sectie zal volgende week worden uitgebreid!**
## Theoretische achtergrond
Gezien de omstandigheden lijkt me een stukje zelfstudie aangewezen. Bekijk zeker eens ["glossary"](https://docs.influxdata.com/influxdb/v1.7/concepts/glossary/). Verklaar volgende termen i.f.v. van InfluxDB zo conreet mogelijk.
### InfluxDB Glossary
Wat is een database?
> Antwoord
> ...
> ...
Wat is een measurement?
> Antwoord
> ...
> ...
Wat is een tag?
> Antwoord
> ...
> ...
Wat is een field?
> Antwoord
> ...
> ...
Wat is een tag set?
> Antwoord
> ...
> ...
Wat is een field set?
> Antwoord
> ...
> ...
### De TICK stack
TICK staat voor... Telegraf, InfluxDB, Chronograf, Kapacitor. Leg kort uit wat de verschillende componeten precies doen:
InfluxDB is / doet:
> Antwoord
> ...
> ...
Telegraf is / doet:
> Antwoord
> ...
> ...
Chronograf is / doet:
> Antwoord
> ...
> ...
Kapacitor is / doet:
> Antwoord
> ...
> ...
## TICK stack opzetten - deel 1
We zullen stap voor stap de volledige TICK stack opzetten, configureren en uiteraard gebruiken.
### InfluxDB
Starten doen we met de *i* van InfluxDB. Op je VM staat reeds de nodige software, alsook zijn de Docker images reeds *"gepulled"*.
Maak volgende mappenstructuur aan:
```
student@tick-01:~$ tree
.
.
└── labo
└── configs
└── tick
├── env
├── influxdb.conf
└── orig
└── influxdb.conf
```
In de directory `labo` maak je het bestand `docker-compose.yml`:
```
version: '3.7'
services:
influxdb01:
image: influxdb:1.7.8-alpine
container_name: influxdb01
ports:
- "8086:8086"
expose:
- 8089
volumes:
- influxdb01:/var/lib/influxdb
- ./configs/tick/influxdb.conf:/etc/influxdb/influxdb.conf:ro
volumes:
influxdb01:
```
Leg bovenstaande uit (tip: [documentatie Docker image](https://hub.docker.com/_/influxdb)).
> Antwoord
> ...
> ...
Je kan een configuratiebestand volledig van scratch aanmaken of je kan dit "genereren" (zie [documentatie](https://hub.docker.com/_/influxdb)).
```
docker run --rm influxdb:1.7.8-alpine influxd config > ~/labo/configs/tick/orig/influxdb.conf
```
Maak een kopie van deze config in `labo/configs/tick`.
Pas volgende setting aan (zie [documentatie](https://docs.influxdata.com/influxdb/v1.7/administration/config#reporting-disabled-false) waarom):
```
reporting-disabled = true
```
Start daarna de services beschreven in `docker-compose.yml` op. Hoe doe je dit ook alweer? Uitstekende vraag:
> Antwoord
> ...
> ...
Je InfluxDB is nu normaal gezien actief. Het image bevat naast de "database server" ook de client: *influx*. Het Docker image zelf is gebaseerd op Alpine. Dat maakt dat we in principe gebruik kunnen maken van *sh*. We kunnen echter ook rechtstreeks de client starten:
```
docker-compose exec influxdb01 influx
```
Probeer volgende zaken uit, documenteer, gebruik de **juiste** terminologie. Merk op dat de commando's niet hoofdlettergevoelig zijn (de tags, fields, measurements, ... wel), alsook een ';' is optioneel.
```
> SHOW DATABASES
> CREATE DATABASE testdb
> USE testdb
> SHOW MEASUREMENTS
> INSERT cpu,host=test value=25.3
> SHOW MEASUREMENTS
> SELECT * FROM cpu
> SHOW TAG KEYS
> SHOW FIELD KEYS
> INSERT cpu,host=test,rack=production-01 value=25.3
> SHOW MEASUREMENTS
> SHOW TAG KEYS
> SHOW FIELD KEYS
> SELECT * FROM cpu
> SELECT * FROM cpu WHERE rack = 'production-01'
> SELECT value FROM cpu WHERE rack = 'production-01'
> SELECT host,value FROM cpu WHERE rack = 'production-01'
```
Documenteer! Zijn er dingen die je opvielen?
> Antwoord
> ...
> ...
Moeilijk? Makkelijk? Geef gerust je feedback. Mijn persoonlijke mening: relatief eenvoudig, gelijkaardige aan "klassieke" SQL.
> Antwoord
> ...
> ...
### Authenticatie
Momenteel kan in principe iedereen aan de InfluxDB instantie (poort staat open), zonder enige authorisatie en authenticatie. Dat kan natuurlijk niet de bedoeling zijn... .
Pas `docker-compose.yml` aan, voeg volgende toe (bv. onder `expose`):
```
env_file:
- configs/tick/env/.env.influxdb
```
Maak daarna `configs/tick/env/.env.influxdb` aan:
```
INFLUXDB_HTTP_AUTH_ENABLED=true
INFLUXDB_ADMIN_USER=admin
INFLUXDB_ADMIN_PASSWORD=admin
INFLUXDB_USER=telegraf
INFLUXDB_USER_PASSWORD=labo
INFLUXDB_DB=telegraf
```
Pas daarnaast de InfluxDB configuratie aan:
```
[http]
auth-enabled = true
pprof-auth-enabled = true
ping-auth-enabled = true
```
De combinatie van beiden zal zorgen dat je InfluxDB ietwat beter afgeschermd is. Merk op dat environment variables prioritair zijn t.o.v. de config. Er zal een admin gebruiker aangemaakt worden, evenals een gebruiker voor *Telegraf* en bijhorende database. Dit zal echter enkel en alleen gebeuren wanneer de database voor het eerst geïnitialiseerd wordt.
We hebben nog niets cruciaal opgeslaan. Stop alle services. Wis het Docker volume.
```
docker volume ls
docker system prune --volumes
```
Start nu opnieuw de services (voor de duidelijkheid: dat is er momenteel nog steeds maar eentje). Bekijk de output (dus niet detached uitvoeren, `screen` is een geweldige tool).
Welke queries zie je passeren?
> Antwoord
> ...
> ...
### Telegraf
Voeg volgende service toe aan `docker-compose.yml`:
```
telegraf:
image: telegraf:1.13.4-alpine
container_name: telegraf
env_file:
- configs/tick/env/.env.telegraf
volumes:
- ./configs/tick/telegraf.conf:/etc/telegraf/telegraf.conf:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
```
Wat zou het nut van de laatste lijn kunnen zijn?
> Antwoord
> ...
> ...
Genereer ook hier een config file:
```
docker run --rm telegraf:1.13.4-alpine telegraf config > ~/labo/configs/tick/orig/telegraf.conf
```
Maak een kopie, `~/labo/configs/tick/telegraf.conf` en zoek, pas volgende zaken aan (je text-editor vlot beheersen zal hier zeker helpen):
```
[[outputs.influxdb]]
...
urls = ["http://influxdb01:8086"]
database = "${INFLUXDB_DB}"
...
## HTTP Basic Auth
username = "${INFLUXDB_USER}"
password = "${INFLUXDB_USER_PASSWORD}"
[[inputs.docker]]
...
endpoint = "unix:///var/run/docker.sock"
...
total = true
```
Merk op dat er gebruik gemaakt wordt van variabelen. De documentatie daarvan is terug te vinden in het config bestand zelf:
```
# Environment variables can be used anywhere in this config file, simply surround
# them with ${}. For strings the variable must be within quotes (ie, "${STR_VAR}"),
# for numbers and booleans they should be plain (ie, ${INT_VAR}, ${BOOL_VAR})
```
Zorg dat `~/labo/configs/tick/env/.env.telegraf` volgende bevat:
```
INFLUXDB_USER=telegraf
INFLUXDB_USER_PASSWORD=labo
INFLUXDB_DB=telegraf
```
Start alle services. Start opnieuw de client, vergeet niet te authenticeren, controleer of er een database telegraf is, bekijk de measurements, bekijk data, ... .
```
docker-compose exec influxdb01 influx
auth
SHOW DATABASES
USE telegraf
SHOW ...
SELECT * FROM ...
```
> Antwoord
> ...
> ...
### Chronograf
We gaan verder... Voeg volgende toe aan `docker-compose.yml`:
```
chronograf:
image: chronograf:1.8.0-alpine
container_name: chronograf
ports:
- "8888:8888"
env_file:
- configs/tick/env/.env.chronograf
volumes:
- chronograf:/var/lib/chronograf
```
Vergeet geen `volume` te registreren (`chronograf`).
Het environment file (`.env.chronograf`) ziet er deze keer als volgt uit:
```
INFLUXDB_URL=http://influxdb01:8086
INFLUXDB_USERNAME=admin
INFLUXDB_PASSWORD=admin
REPORTING_DISABLED=true
```
Start alles op en surf naar http://172.23.82.60:\$JOUW_POORT\$.
#### Eerste visualisatie
Voer volgende stappen uit:
* Ga naar "Explore"
* Selecteer telegraf.autogen
* Klik CPU open
* Klik CPU - 5 open
* Kies cpu-total
* Kies usage-user (bij Fields)
Tada! Je zou nu een grafiek moeten hebben. Rechtsbovenaan kan je zorgen dat deze automatisch wordt bijgewerkt. Je ziet daar tevens staan welke query er gebruikt wordt. Maak een screenshot.
> Antwoord
> ...
> ...
Je kan eventueel nog meerdere queries toevoegen, de visualisatie verder aanpassen, ... Probeer in ieder geval de chart op te slaan in een dashboard. Maak opnieuw een screenshot.
> Antwoord
> ...
> ...
#### Dashboards
Je kan zelf dashboards maken, maar je kan er ook importeren. Voer volgende stappen uit:
* Ga naar Configuration
* Klik op je InfluxDB connectie
* Klik op update
* Selecteer "System" en "Docker"
* Kapacitor "skip" je
* Finish
Ga naar Dashboards. Klik bv. het Docker dashboard open. Maak een screenshot.
> Antwoord
> ...
> ...
#### Verken zelf!
Klik nog wat rond, bekijk zeker eens al de mogelijkheden!
### Kapacitor
Voeg volgende snipper toe aan je `docker-compose.yml`:
```
kapacitor:
image: kapacitor:1.5.4-alpine
container_name: kapacitor
expose:
- 9092
env_file:
- configs/tick/env/.env.kapacitor
volumes:
- ./configs/tick/kapacitor.conf:/etc/kapacitor/kapacitor.conf:ro
```
Genereer zoals gebruikelijk een config:
```
docker run --rm kapacitor:1.5.4-alpine kapacitord config > ~/labo/configs/tick/orig/kapacitor.conf
```
Maak een kopie, plaats deze in `configs/tick`. Je hoeft momenteel niets aan te passen. We overschrijven bepaalde settings met environment variabels:
```
KAPACITOR_INFLUXDB_0_USERNAME=admin
KAPACITOR_INFLUXDB_0_PASSWORD=admin
KAPACITOR_INFLUXDB_0_URLS_0=http://influxdb01:8086
KAPACITOR_REPORTING_0_enabled=false
```
Sla dit op als `~/labo/configs/tick/env/.env.kapacitor`. Pas `.env.chronograf` aan, voeg volgende zaken toe:
```
KAPACITOR_URL=http://kapacitor:9092
KAPACITOR_USERNAME=admin
KAPACITOR_PASSWORD=admin
```
Start alle services op.
#### Mailgun
Maak een account aan op Mailgun (gebruikt eventueel https://10minutemail.com).

Voor de verificatie kan je bv. https://www.spoofbox.com of een gelijkaardige service gebruiken.
Ga naar "Sending", klik daar op je "Sandbox" domein en kies voor "SMTP". Hou de credentials bij. Aan de rechterkant vul je je e-mailadres in, voeg dit toe als een "authorized recipient".
In Chronograf ga je naar "Configuration". Bewerk je Kapacitor connectie. Ga naar "SMTP" en voer de credentials in. Zorg dat dit je *default* server is door "Configuration Enabled" af te vinken. Sla op, stuur een "Test Alert".

#### Alerting
Ga naar "Alerting" (in Chronograf). Maak een alert aan, die bv. een mail stuurt wanneer de CPU gebruik groter dan een bepaalde *treshold* is.
Maak een screenshot van een ontvangen "Alert Mail".
> Antwoord
> ...
> ...
## TICK stack opzetten - deel 2
Een aantal zaken die volgende week zullen behandeld worden:
* Meer queries :-)
* GitHub Auth
* Relay
* Traefik
* Kafka
* Elasticsearch