回到文章列表
observability-vector-victoriametrics-loki-grafana-metrics-logs

【Observability】用Vector + VictoriaMetrics + Loki + Grafana蒐集Metrics和Logs

發布於 2026-05-02·3·
ObservabilityDevOps

可觀測性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

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

yml
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推)。

yml
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: "vector-exporter"
    static_configs:
      - targets: ["vector:9090"]

vector.yaml

yml
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就可以了。