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.

Grafana Datasources

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?

“Buy Me A Coffee”