Nicht immer läuft alles reibungslos
Mittlerweile betreibe ich meine Applikationen fast nur noch als Docker Container. Jeder der bereits einmal mit Docker gearbeitet hat, weiss das Container plötzlich stoppen können oder schon gar nicht starten. Tritt dieser Fall ein, kommt meistens der Befehle docker logs zum Einsatz. Gerade wenn das Log grösser ist, kann sich die Analyse des Logs mühsam gestalten. Irgendeinmal bin ich über Loki gestolpert. Darüber will ich dir jetzt mehr erzählen.
Loki
Es gibt viele Log Aggregation Systeme: ELK, Graylog,Fluentd und dann gibt es eben noch Loki. Der grösste Vorteil ist wohl, dass sich Loki nahtlos in Grafana integrieren lässt. Loki ist zudem horizontal skalierbar, hochverfügbar und multi-tenant fähig. Auch die Installation ist echt easy:
docker run -d -v \
-v /dockerdata/loki/etc/config.yml:/etc/loki/config.yaml \
-v /dockerdata/loki/storage/index:/tmp/loki/index \
-v /dockerdata/loki/storage/chunks:/tmp/loki/chunks \
--restart=always \
--name=prod-loki \
--net prod-network --ip 172.18.0.131 \
grafana/loki:master
Der Inhalt der config.yaml Datei gibt es auf meinem Gist.
Danach ist der Loki Container bereit Daten zu empfangen. Loki besitzt kein Layer zur Authentifizierung, jedoch kann ein Reverse Proxy wie NGINX hier Abhilfe schaffen. Bei Verwendung in einer Produktivumgebung, empfehle ich dringlichst die Anwendung einer Authentifizierungsmethode. Die Übertragung der Daten sollte selbstverständlich über TLS erfolgen.
Grafana
Damit Logs aus Loki in Grafana angezeigt werden können, muss Loki als Datenquelle in Grafana konfiguriert werden.
Anmerkung: In meiner Docker Umgebung verwende ich ein internes Netzwerk, um die Container miteinander zu verbinden.
Loki Logging Driver
Mit dem logging Driver für Docker lassen sich Logs direkt zu Loki senden. Installiert wird dieser mit:
docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions
Docker gibt einem die Möglichkeit, ein default Logging Driver zu konfigurieren. In meinem Setup will ich jedoch nicht alle Container Logs direkt an Loki senden. Dafür konfiguriere ich den Logging Driver beim Start des Containers:
sudo docker run -d \
--name prod-koeniz-abfuhr \
--restart=always \
--net prod-network --ip 172.18.0.120 \
--log-driver=loki \ --log-opt loki-url="http://loki.damn.li/loki/api/v1/push" \
--log-opt loki-retries=5 \
--log-opt loki-batch-size=400 \
koeniz-abfuhr
Anschliessend treffen die ersten Logs in Loki ein und somit auch in Grafana.
Promtail
Nicht nur Docker Logs lassen sich an Loki senden. Mit Promtail steht ein Agent bereit, der Logs findet, Labels hinzufügt und diese an Loki sendet. Promtail lässt sich unter anderem als Service unter Ubuntu installieren.
cd /usr/local/bin
Ordner erstellen:
sudo mkdir promtail
Promtail Binary herunterladen:
sudo curl -O -L https://github.com/grafana/loki/releases/download/v1.5.0/promtail-linux-amd64.zip
Unzippen:
sudo unzip loki-linux-amd64.zip
Ausführbar machen:
sudo chmod +x promtail-linux-amd64
Service Datei erstellen:
sudo nano /etc/systemd/system/promtail.service
Der Inhalt dafür gibt es in meine Gist.
Promtail Konfigurationsdatei erstellen:
sudo nano /usr/local/bin/promtail/config.yaml
Der Inhalt dafür gibt es in meinem Gist.
Service etablieren:
sudo systemctl enable promtail
Service starten:
sudo service promtail start
Ausblick
Bald wird Loki die Extraktion von Metriken aus Logfiles unterstützen. Grafana Labs hat dazu vor kurzem ein Video veröffentlicht. Ich gehe stark davon aus, dass Loki in den nächsten Monaten an Beliebtheit gewinnen wird.
Fazit
Die Einfachheit des Loki - Grafana Stacks hat es mir wohl angetan. Logfiles lassen sich schnell und unkompliziert in Grafana Dashboards einbinden. Die Analyse von Logfiles ist angenehmer und intuitiver. Ich wünsche mir nur noch eine Alerting Funktion, die auf Keywords wie Error oder Warning reagiert. Was haltet ihr von Loki?