Docker container metrics with prometheus and Grafana (CADVISOR)

H. Alperen Selcuk
4 min readMar 8, 2024

Bu yazıda containerlarınızın metriklerini alıp grafanada nasıl göstereceğinizden bahsedeceğim.

Docker container çalıştırdığınız hostlarda containerlarınızın ne kadar resource kullandığını görmek istiyorsanız Cadvisor kullanmanız işinizi çok kolaylaştıracaktır.

docker-host

öncelikle örnek docker çalışan bir docker host ayarlayalım. docker-compose ile ayağa kaldırıcaz.

docker ve dockercompose yüklemek için repomda olan scripten faydalanabilirsiniz.

daha sonra örnek bir uygulamayı ayağa kaldıralım.

docker compose up diyerek ayağa kaldıralım.

cAdvisor

cAdvisor docker contailerlarınız çalıştığı host üzerinde system pathlerine mount olarak dockerla ilgili metrikleri alır.

bunu docker run diyerek çalıştıracağınız gibi docker-compose yamlda da çalıştırabilirsiniz.

  cadvisor:
container_name: cadvisor
image: gcr.io/cadvisor/cadvisor:latest
network_mode: "host"
ports:
- "8888:8080"
volumes:
- "/:/rootfs"
- "/var/run:/var/run"
- "/sys:/sys"
- "/var/lib/docker/:/var/lib/docker"
- "/dev/disk/:/dev/disk"
privileged: true

yukarıdaki örnek yetkili bir cAdvisor bunu daha az yetkili olarak da açabilirsiniz. mesela readonly olarak:

VERSION=v0.36.0 # use the latest release version from https://github.com/google/cadvisor/releases
sudo docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
--privileged \
--device=/dev/kmsg \
gcr.io/cadvisor/cadvisor:$VERSION

ben docker-compose file a ekleyip tekrar up yapacağım.

burda farkettiyseniz expose ettiğimiz 8888 portu bulunmuyor çünkü host network olarak seçtik.

prometheus

prometheus cadvisordan aldığı metrikleri grafana için ayarlayacak. bunun için binary sini yükleyip daha sonra config dosyasını hazırlayacağız.

daha sonra prometheus yaml dosyası eklememiz gerekiyor.

mkdir -p /etc/prometheus
touch /etc/prometheus/prometheus.yml

daha sonra içine cadvisor için config yapacağız.

global:
scrape_interval: 15s
evaluation_interval: 15s

scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['10.2.0.6:9100']

- job_name: 'cadvisor'
static_configs:
- targets: ['10.2.0.6:8080']

private IP ile config gireceğiz. prometheus u service olarak ekleyip çalıştıracağız ki yeniden başladığında devam edebilsin.

systemd altına bir service açacağız.

touch /etc/systemd/system/prometheus.service

içine de confiği koyuyoruz.

[Unit]
Description=Prometheus
After=network.target

[Service]
ExecStart=/usr/local/bin/prometheus --config.file=/etc/prometheus/prometheus.yml
Restart=always

[Install]
WantedBy=default.target

daha sonra reload ve enable

sudo systemctl daemon-reload
sudo systemctl start prometheus
sudo systemctl enable prometheus

grafana

ben hızlıca docker üzerinde bir grafana ayaga kaldırıp datasource ekleyeceğim, hali hazırda kullandığınız grafanaya da koyabilirsiniz.

basitçe bir container olarak ayaga kaldırdım user pass admin/admin

docker run -d --name=grafana -p 3000:3000 grafana/grafana

grafanaya 3000 portundan bağlanacağım.

datasource eklemek için sırasıyla

connections -> data source -> add new datasource

diyerek prometheus u seçiyoruz. daha sonra docker host Ip si ve prometheus portu ekliyoruz.

şimdi bir tane dashboard import edeceğiz.

dashboard a gelerek import seçip ID kısmına 193 yazacağız bu bize hazır postgresql dashboardu verecek.

load dediğimiz anda dashboard gelecek ve datasource olarak eklediğimiz prometheus u göstereceğiz.

artık container metrikleriniz grafanada görebiliyorsunuz.

bir sonraki yazımda görüşmek üzere.

h.a.s.

--

--