可觀測性Observability,簡稱o11y,有3大支柱: Metrics, Logs, Traces,這篇文章就來記錄我用Vector + VictoriaMetrics + Loki + Grafana蒐集Metrics和Logs的過程。
Why not Prometheus or ELK ?
最主要的原因就是因為我的VPS只有2GB的RAM,不能跑太重量的服務。
Prometheus本身是一個時序資料庫,會定期去拉取Metrics資料後存入Db,但如果Metrics多起來就會消耗記憶體,加上他的設計是主動拉取資料,不能被動推進來,在某些場景下會不太方便,因此我決定採用更輕量的VictoriaMetrics來當作時序資料庫。
ELK(Elasticsearch + Logstash + Kibana)是一套功能非常強大的Log分析系統,但也是因為功能太強,因此占用非常大的資源(像是Elasticsearch就會對所有Log建全文索引,非常消耗硬碟空間,且因為是Java寫的因此也很占用記憶體)。
以我的需求來說不需要ELK這麼強大的功能,只需要能採集Log即可,因此選擇更輕量的Loki,他是一個資料庫,只會對Label做索引,且記憶體消耗非常低。
選好了存Metrics跟Logs的Db後,接下來就要考慮怎麼拿到系統Metrics跟Logs的問題了,一般來說我們可以用Node Exporter來取得各種硬體資訊(CPU, RAM使用率...)、Promtail取得各個Process的Logs,但這樣我們就要裝兩個東西維護上有點麻煩,而Vector就是可以一次都拿到的方案,加上他也足夠輕量,因此最後我就選他了。
安裝
我直接選擇用Docker Compose一次安裝好Vector + VictoriaMetrics + Loki + Grafana,這樣對我來說維護最方便,只要同個資料夾下,設置好每個App的config檔,然後docker compose up -d就可以無腦使用了。
docker-compose.yml
services:
vector:
image: timberio/vector:0.34.X-alpine
container_name: vector
volumes:
- ./vector.yaml:/etc/vector/vector.yaml:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- /var/lib/docker/containers:/var/lib/docker/containers:ro # 有些系統docker container是放在/var/snap/docker/common/var-lib-docker/containers
- /proc:/host/proc:ro
- /sys:/host/sys:ro
restart: unless-stopped
victoriametrics:
image: victoriametrics/victoria-metrics:v1.96.0
container_name: victoriametrics
volumes:
- vmdata:/storage
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
command:
- "-storageDataPath=/storage"
- "-retentionPeriod=1"
- "-promscrape.config=/etc/prometheus/prometheus.yml"
restart: unless-stopped
loki:
image: grafana/loki:2.9.2
container_name: loki
volumes:
- ./loki-config.yaml:/etc/loki/local-config.yaml:ro
- lokidata:/loki
command: -config.file=/etc/loki/local-config.yaml
restart: unless-stopped
grafana:
image: grafana/grafana:latest
container_name: grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin # 首次登入請修改
volumes:
- grafana_data:/var/lib/grafana
ports:
- "3000:3000"
restart: unless-stopped
volumes:
vmdata:
lokidata:
grafana_data:
如果遇到權限問題可以試試加入 user:root
loki-config.yaml
auth_enabled: false
server:
http_listen_port: 3100
common:
path_prefix: /loki
storage:
filesystem:
chunks_directory: /loki/chunks
rules_directory: /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
limits_config:
reject_old_samples: true
reject_old_samples_max_age: 168h
prometheus.yml
VictoriaMetrics完全兼容Prometheus,因此可以用Prometheus拉取的方式從Vector中拿到Metrics(當然也可以從Vector推)。
global:
scrape_interval: 15s
scrape_configs:
- job_name: "vector-exporter"
static_configs:
- targets: ["vector:9090"]
vector.yaml
sources:
docker_logs:
type: docker_logs
host_metrics:
type: host_metrics
collectors:
- cpu
- memory
- disk
- network
- load
scrape_interval_secs: 15
sinks:
loki_sink:
type: loki
inputs:
- docker_logs
endpoint: "http://loki:3100"
encoding:
codec: json
labels:
container_name: "{{container_name}}"
vm_sink:
type: prometheus_exporter
inputs:
- host_metrics
address: "0.0.0.0:9090"
在Grafana中加入Data Source
VictoriaMetrics
左側選單的 Connections -> Data sources -> Add data source -> 選擇 Prometheus
URL: 輸入 http://victoriametrics:8428
Loki
左側選單的 Connections -> Data sources -> Add data source -> 選擇 Loki
URL: 輸入 http://loki:3100
最終效果
接下來只要創建新的Dashboard編輯自己想看的Metrics跟Logs就可以了。
