Instalasi Grafana dan Loki dengan Docker Compose sebagai Log Monitoring Observability


Image ©Grafana

Grafana adalah salah satu tools monitoring (atau mereka lebih menyebutnya observability sekarang) yang dibuat Grafana Labs. Lebih lengkapnya, Grafana Labs juga menyediakan stack teknologi bernama LGTM. Loki untuk log, Grafana – untuk dasbor dan visualisasi, Tempo – untuk tracing, dan Mimir – untuk metrik. Seluruh produk mereka menyediakan versi OSS yang gratis dan bebas digunakan. Grafana Labs juga menyediakan versi enterprise dan cloud yang berbayar dengan beberapa tambahan fitur. Disamping itu, mereka juga menyediakan Promtail, yaitu agent untuk mengirim logging dari suatu machine ke Loki.

Kali kita akan menggunakan VPS untuk proses instalasi Grafana self-managed. Grafana sendiri dalam docs menyebutkan hanya membutuhkan RAM 512MB dan 1 Core CPU. Namun tentu akan lebih baik memberikan spesifikasi server yang jauh lebih tinggi mengingat cara kerja Grafana yang membutuhkan sangat banyak pembacaan data. Berikut spesifikasi VPS yang digunakan:

  1. 8 Core CPU
  2. 6 GB RAM

Grafana sendiri menyediakan beberapa opsi instalasi, namun mereka merekomendasikan instalasi melalui Helm Chart karena lebih mudah dalam skalabilitas ke depannya. Namun instalasi Helm chart membutuhkan cluster Kubernetes. Untuk percobaan kali ini kita akan melakukan instalasi dengan Docker Compose untuk proses instalasi yang lebih mudah.

Langkah-langkah:

Pertama yang harus dilakukan adalah memastikan Docker dan Portainer sudah terinstall pada server. Untuk Portainer dapat diakses menggunakan URL : https://<ip-public-vps:9443/.

Untuk Docker mengeceknya menggunakan perintah :

$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; preset: enabled)
     Active: active (running) since Fri 2024-03-01 03:43:58 CET; 2 days ago
     ...

Jika nanti hasilnya Docker belum berjalan, mulai atau jalankan Docker menggunakan perintah:

$ sudo systemctl start docker
$ sudo docker start portainer

Setelah memastikan Docker dan Portainer berjalan dengan sempurna, buka dan login pada Portainer menggunakan URL : https://<ip-public-vps>:9443/.

Klik Stacks+ Add stack → Isikan pada kolom :
Name : grafana-loki (anda bisa menggunakan nama lain)
Web Editor : (masukan Source Kode dibawah ini)

version: "3.8"

networks:
  loki:

services:
  loki:
    image: grafana/loki:2.9.4
    hostname: loki
    ports:
      - "3100:3100"
    command: -config.file=/etc/loki/local-config.yaml
    networks:
      - loki

  promtail:
    image: grafana/promtail:2.9.4
    volumes:
      - /var/log:/var/log
    command: -config.file=/etc/promtail/config.yml
    networks:
      - loki

  grafana:
    environment:
      - GF_PATHS_PROVISIONING=/etc/grafana/provisioning
      - GF_AUTH_ANONYMOUS_ENABLED=true
      - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
    entrypoint:
      - sh
      - -euc
      - |
        mkdir -p /etc/grafana/provisioning/datasources
        cat <<EOF > /etc/grafana/provisioning/datasources/ds.yaml
        apiVersion: 1
        datasources:
        - name: Loki
          type: loki
          access: proxy
          orgId: 1
          url: http://loki:3100
          basicAuth: false
          isDefault: true
          version: 1
          editable: false
        EOF
        /run.sh
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    networks:
      - loki

Baris kode diatas adalah sebuah skrip Docker Compose. Skrip diatas akan menginisialisasi 3 service yaitu Grafana, Loki, dan Promtail. Grafana akan bisa diakses dari port 3000 sedangkan API Loki akan bisa diakses dari port 3100. Untuk mengeksekusi Stacks klik tombol Deploy the stack.

Pastikan Grafana, Loki dan Promtail sudah berjalan dengan ditandai kotak hijau beruliskan running. Selanjutnya, konfigurasi username dan password dengan mengakses Grafana melalui port 3000. Masukkan user: admin dan password: admin. Setelah itu Grafana akan menginstruksikan untuk mengganti password bawaan.

Beralih dari Portainer ke terminal, instalasi Plugin Docker Driver, dengan menggunakan perintah :

$ docker plugin install --alias loki grafana/loki-docker-driver:2.9.4 --grant-all-permissions

Beralih ke Portainer lagi, buat kontainer baru dengan waktu logging rendah, caranya klik Container+ Add container, lalu isikan pada kolom :

Name : test-logging (opsional)
Image : busybox:latest
Command (Override) : sh -c "while true; do echo 'Log example'; sleep 1; done"
Driver : loki:latest
Options (+ add logging driver option) :
kolom 1 = url-loki
kolom 2 = http://<ip-public-server>:3100/loki/api/v1/push

Lalu buka Grafana dengan URL http://<ip-public-server>:3000/, masuk dengan username dan password yang sudah diatur.

Untuk melihat log dari kontainer yang berjalan caranya klik Garis 3 (pojok kiri atas) → ConnectionsData Sources → Klik Explore (pada Data Sources Loki) → lakukan konfigurasi pada Label filters :
Select label : host
Select value : <nama-vm>

Klik Run query atau Live, Jika berhasil terhubung, log dari kontainer akan tertampil pada kolom Logs. Bila terjadi too many outstanding requests coba kurangi timeframe, atau perkecil cakupan logs dengan memberikan filter yang lebih spesifik.

Dengan ini kita sudah berhasil melakukan instalasi Grafana, Loki, dan Promtail, namun beberapa hal perlu dicatat:

  1. Instalasi masih berupa Docker. Tentu akan memberikan masalah skalabilitas ke depannya. Maka dari itu lebih direkomendasikan instalasi dengan Helm chart.
  2. API Loki yang masih belum terproteksi. Loki sendiri tidak memiliki metode autentikasi bawaan. Grafana labs merekomendasikan memberikan autentikasi melalui reverse proxy seperti NGINX untuk akses Loki.
  3. Instalasi masih menggunakan database SQLite. Grafana sendiri merekomendasikan menggunakan database di luar kontainer seperti PostgreSQL atau MySQL.

Source: Grafana Docs

Written by DevOps Intern at Digital Amoeba – MSIB Batch 6:
Kurniawan Farid Jadmiko – Universitas Teknologi Digital Indonesia
Muhammad Raihan Widagdo – Universitas Negeri Semarang