Log Monitoring with Grafana LOKI

H. Alperen Selcuk
4 min readJan 10, 2022

loglama için son zamanlarda adını sıkça duyduğum bir tool olan grafana loki yi inceleyeceğim.

promtail agent install edildiği ortamdan logları toplayarak lokiye aktarır. grafana üzerinde de logları görüntüleyebiliriz.

yapı olarak bildiğimiz ELK stack e çok benziyor.

agent olarak promtail kullanmaktadır bu yüzden log toplayacağımız endpoint üzerine yüklememiz gerekmekte.

docker üzerinde stack olarak çalıştıracağım.

docker yüklü sunucuda volume olması için 3 adet directory açıp bu directory içinde config fileları koyacağız.

/var/volumes pathine 3 adet dosya oluşturdum.

ilk inceleyeceğimiz promtail config.

server:
http_listen_port: 9080
grpc_listen_port: 0

positions:
filename: /tmp/positions.yaml

clients:
- url: http://loki:3100/loki/api/v1/push

scrape_configs:

# local machine logs

- job_name: local
static_configs:
- targets:
- localhost
labels:
job: varlogs
__path__: /var/log/*log

promtail 9080 portundan dinleyerek logları lokinin 3100 portuna atacak. log source olarak da path belirtebiliyoruz. mesela ben direk var/log/ dizinindeki sonu log la biten bütün dosyaları gösterdim.

loki confiğinde ise, listen port 3100 promtail zaten bu porta gönderecek.

auth_enabled: false

server:
http_listen_port: 3100
grpc_listen_port: 9096

common:
path_prefix: /tmp/loki
storage:
filesystem:
chunks_directory: /tmp/loki/chunks
rules_directory: /tmp/loki/rules
replication_factor: 1
ring:
instance_addr: 127.0.0.1
kvstore:
store: inmemory

schema_config:
configs:
- from: 2020-10-24
store: boltdb-shipper
object_store: filesystem
schema: v11
index:
prefix: index_
period: 24h

ruler:
alertmanager_url: http://localhost:9093

dosyaları oluşturduktan sonra

sıra geldi stack oluşturmaya bütün componentleri aynı networke yapacağımız için docker-compose kullanacağız. docker-compose üstünde containerların volume ü olarak da açtığımız directory leri path olarak göstereceğiz böylece içine koyduğumuz config dosyaları ile contailerları çalıştırabiliriz.

version: "3"
networks:
loki:
services:
loki:
image: grafana/loki:2.4.0
volumes:
- /var/volumes/loki:/etc/loki
ports:
- "3100:3100"
restart: unless-stopped
command: -config.file=/etc/loki/loki-config.yml
networks:
- loki
promtail:
image: grafana/promtail:2.4.0
volumes:
- /var/log:/var/log
- /var/volumes/promtail:/etc/promtail
restart: unless-stopped
command: -config.file=/etc/promtail/promtail-config.yml
networks:
- loki
grafana:
image: grafana/grafana:latest
volumes:
- /var/volumes/grafana:/var/lib/grafana
ports:
- "3000:3000"
restart: unless-stopped
networks:
- loki

docker-compuse up diyerek başlatıyoruz.

çalışıp çalışmadığını basitçe loki portunda metric pathine istek atarak görebiliriz. aşağıdaki gibi metricleri görebiliyor olmamız gerek.

daha sonra grafana arayüzüne giriyoruz. arayüz için 3000 portundan bağlanacağız user:admin pass:admin

bağlandıktan sonra klasik grafana operasyonu olan grafanaya data-source göstereceğiz normalde bildiğiniz gibi metricler için prometheus u gösterirdik bu sefer lokiyi göstereceğiz.

setting ->data source -> add datasource sekmesinde lokiyi göreceksiniz.

datasource olarak configde http://loki:3100 seçiyoruz save and test yapıyoruz.

explorer sekmesinde loki nin geldiğini göreceksiniz.

log görüntüleyebilmek için LOGQL log query language dediğimiz yapıyı biraz kurcalamak gerekiyor. ben basit bir kaç örnek vereceğim ama detaylarını grafanın sitesinden bakabilirsiniz.

sunucu üzeirnde dockerd loglarına bakacak olursak. aşağıdaki gibi bir yazım ile select yapıyoruz.

promtail confiğinde sunucudaki /var/logs almıştık bu tüzden system ile alakalı loglar geliyor. peki sunucu üzerinde çalışan docker loglarını almak istersek bunun için de protail confiğine birkaç satır eklememiz gerekiyor.

- job_name: docker 
pipeline_stages:
- docker: {}
static_configs:
- labels:
job: docker
__path__: /var/lib/docker/containers/*/*-json.log

promtaile container logu toplatmak için bir plugin kullanmamız gerekiyor. bir driver ykleyerek loki için permission alacağız.

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

daha sonra docker in logları atacağı yeri default ayarlarını loki ile değiştireceğiz. bunu da /etc/docker/daemon.json dosyasında ekstra bir kaç satır girerek yapacağız. gireceğimiz config aşağıda ardından docker restart edeceğiz. systemctl restart docker

{
"log-driver": "loki",
"log-opts": {
"loki-url": "http://localhost:3100/loki/api/v1/push",
"loki-batch-size": "400"
}
}

örnek container için bir nginx koydum. ona gelen istekleri görebiliyormuyuz bakalım. docker run -ti -d -p 8080:80 nginx

grafana arayüzüne gittiğinizde tekrar artık parantez içinde job dışında container name geldiğini de görebilirsiniz. grafana da explorer ettiğimizde nginx e attığım get isteğini logda görebiliyoruz.

kullanımı kolay ve stabil çalışıyor. metric için halihazırda grafana kullanıyorsanız lokiyi de ekleyerek loglama için de kullanmaya başlayabilirsiniz.

daha spesific ve karmaşık log queryler için grafanın kendi sitesini kontrol edebilirsiniz.

umarım faydalı bir yazı olmuştur.

görüşmek üzere

h.a.s.

--

--