+1

Tập trung và trực quan hóa nhật ký Docker trong Grafana với Loki

Bài viết hướng dẫn cách tập trung và trực quan hóa nhật ký Docker trong Grafana với Loki. Phương pháp này cho phép bạn mở rộng quy mô theo chiều ngang với Grafana, Loki và Promtail, mỗi phần chạy độc lập với nhau.

Cách tiếp cận trong bài viết này

Bạn sẽ thấy các hướng dẫn khác chỉ cho bạn cách thiết lập mọi thứ trong một máy duy nhất. Mặc dù điều này có thể thuận tiện cho những người chạy tất cả nội dung Docker của họ trong một máy chủ duy nhất, nhưng đó không phải là cách thực hành tốt nhất cho môi trường production.

Tôi sẽ chỉ cho bạn cách thiết lập mọi thứ theo cách bạn có thể mở rộng quy mô theo chiều ngang. Với Grafana, Loki và Promtail, mỗi phần chạy độc lập với nhau.

Ví dụ: Bạn có thể có promtail trong một máy chủ chạy các container Docker cho một ứng dụng web, gửi nhật ký đến một phiên bản Loki đang chạy trong một máy chủ khác và sau đó trực quan hóa mọi thứ trong Grafana đang chạy trong một máy chủ thứ ba.

Cách hoạt động của phương pháp

Trong cách thiết lập ở bài viết này, chúng ta sẽ có trình nền Docker gửi nhật ký trực tiếp đến Loki mà không cần phải định cấu hình Promtail! image.png

Điều này có một số lợi thế:

  • Bạn không cần phải loay hoay với các tệp nhật ký và vị trí của chúng
  • Docker sẽ lo việc gửi nhật ký đến Loki
  • Truy vấn nhật ký trở nên DỄ DÀNG HƠN RẤT NHIỀU trong Grafana vì chúng ta có thể truy vấn theo tên container, image, dự án compose, v.v.

Thiết lập Loki

Nếu bạn đã có một phiên bản Loki và chỉ quan tâm đến việc thiết lập plugin Docker Loki, bạn có thể bỏ qua phần này.

Như tôi đã nói trong phần giới thiệu, tôi muốn thiết lập mọi thứ trong các máy chủ riêng biệt, vì vậy đây là cách tôi thiết lập Loki trong một máy chủ Ubuntu của mình.

Lưu ý rằng thiết lập này cũng hoạt động nếu bạn muốn thực hiện tất cả trong một máy, chỉ là bạn có thể muốn thiết lập loki và grafana trong cùng một tệp compose.

1. Tạo một thư mục cho các tệp cấu hình

cd && mkdir loki && cd loki

2. Tạo tệp loki-config.yaml

nano loki-config.yaml

Dán nội dung sau:

# You can enable authentication to prevent unauthorized access to your logs
auth_enabled: false

server:
  # This is the port where Loki will receive logs from Docker (or Promtail)
  http_listen_port: 3100
  # This is the port where Loki will expose its API
  grpc_listen_port: 9096

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

query_range:
  results_cache:
    cache:
      embedded_cache:
        enabled: true
        max_size_mb: 100

schema_config:
  configs:
    - from: 2020-10-24
      store: tsdb
      object_store: filesystem
      schema: v13
      index:
        prefix: index_
        period: 24h

ruler:
  alertmanager_url: http://localhost:9093

3. Tạo tệp docker-compose.yaml

nano docker-compose.yaml

Dán nội dung sau:

services:
  loki:
    image: grafana/loki:latest
    volumes:
      - ./loki-config.yml:/etc/loki/loki-config.yml
    ports:
      - "3100:3100"
    restart: unless-stopped
    command: -config.file=/etc/loki/loki-config.yml

Mặc dù bạn có thể chạy container đơn lẻ này bằng docker run, nhưng tôi thích sử dụng docker-compose để tôi không phải nhớ lệnh để khởi động container.

4. Khởi động Loki

docker compose up -d

Nếu mọi thứ suôn sẻ, bạn sẽ có thể truy cập Loki tại http://your-server-ip:3100.

Nếu bạn có máy chủ ở nhiều vị trí (aws, digital ocean, lab tại nhà, v.v.), bạn có thể tạo proxy ngược bằng NGINX hoặc dịch vụ tương tự để hiển thị Loki với internet. Nếu vậy, tôi khuyên bạn nên bật xác thực trong tệp loki-config.yaml hoặc chỉ cho phép máy chủ của bạn truy cập Loki thông qua proxy ngược hoặc tường lửa.

Bây giờ bạn có thể trỏ tất cả các máy chủ Docker của mình để trỏ đến phiên bản Loki này!

Thiết lập plugin Docker Loki

Tôi sẽ giả sử bạn đã có một hoặc nhiều container Docker đang chạy trong một máy chủ ở đâu đó.

Bạn có thể lặp lại bước này cho mọi máy chủ bạn có đang chạy container Docker.

1. Tạo các tệp cần thiết

Những gì tôi muốn làm trong máy chủ của mình là thiết lập một thư mục chỉ dành cho thiết lập ghi nhật ký này, vì vậy:

cd && mkdir promtail && cd promtail

Trong thư mục này, bạn sẽ cần 2 tệp:

  • promtail-config.yaml
  • docker-compose.yaml

2. promtail-config.yaml

Tệp này sẽ cho Promtail biết vị trí tìm nhật ký và nơi gửi chúng.

server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  # Temporary file to store the last read position for each log stream. Useful in case of a crash or restart.
  filename: /tmp/positions.yaml

clients:
  # The URL where your Loki instance is running
  - url: http://localhost:3100/loki/api/v1/push

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

Bạn có thể sao chép trực tiếp đoạn mã trên, điều quan trọng duy nhất cần thay đổi là trường url trong phần clients.

Đoạn mã trên giả định rằng bạn sẽ chạy một container Docker chạy Loki trong cùng máy chủ với Promtail (do đó là localhost). Ví dụ, tôi có Loki trong lab tại nhà của mình chạy phía sau proxy ngược, vì vậy tôi sẽ thay đổi phần này thành https://myloki.mydomain.com/loki/api/v1/push.

3. docker-compose.yaml

# docker-compose.yml

services:
  promtail:
    image: grafana/promtail:latest
    restart: unless-stopped
    volumes:
      - /var/log:/var/log
      - ./promtail-config.yml:/etc/promtail/promtail-config.yml
    command: -config.file=/etc/promtail/promtail-config.yml

Tệp docker-compose này sẽ khởi động một container Promtail với tệp cấu hình mà chúng ta vừa tạo.

4. Cài đặt plugin Docker Loki

Đây là phần dễ nhất.

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

Kiểm tra ở đây để biết phiên bản mới nhất của lệnh này.

Nếu lệnh thành công, bạn sẽ thấy plugin được liệt kê khi bạn chạy docker plugin ls.

5. Định cấu hình trình nền Docker

Chúng ta cần tạo một tệp daemon.json trong /etc/docker/ với nội dung sau:

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

Điều này cho Docker biết rằng nó nên sử dụng trình điều khiển nhật ký loki thay vì trình điều khiển mặc định và gửi nhật ký đến phiên bản Loki.

Một lần nữa, hãy thay đổi trường loki-url thành URL chính xác cho bạn.

loki-batch-size là tùy chọn, nhưng tôi muốn đặt nó thành 400 để tránh gửi quá nhiều yêu cầu đến Loki.

6. Chờ đã, nếu plugin Loki gửi nhật ký, tại sao chúng ta cần Promtail?

Plugin Loki sẽ gửi nhật ký đến Loki, nhưng nó sẽ không theo dõi vị trí nhật ký. Điều này có nghĩa là nếu Loki ngừng hoạt động, bạn sẽ mất các nhật ký đã được gửi trong khi nó ngừng hoạt động.

Promtail sẽ theo dõi vị trí nhật ký và gửi nhật ký đến Loki khi nó hoạt động trở lại.

7. Khởi động lại Docker

sudo systemctl restart docker

8. Khởi động promtail

cd ~/promtail && docker compose up -d

Tuyệt vời! Giờ đây, chúng ta có tất cả các container Docker trong máy này gửi nhật ký của chúng đến phiên bản Loki của chúng ta!

Thiết lập Grafana

1. Cài đặt Grafana

Nếu bạn đã thiết lập Grafana, bạn có thể chuyển sang 3.3, nơi tôi chỉ cho bạn cách truy vấn nhật ký dễ dàng như thế nào.

Nó đơn giản như chạy một container:

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

Bạn có thể truy cập Grafana tại http://your-server-ip:3000.

2. Kết nối Grafana với Loki

  • Trong bảng điều khiển bên trái, đi tới "Connections" > "Data Sources".

  • Nhấp vào "+ Add new data source".

  • Tìm kiếm "Loki": image.png

  • Điền tên và URL của phiên bản Loki của bạn: image.png

  • Nhấp vào "Save & Test". Bạn sẽ thấy một thông báo cho biết mọi thứ đang hoạt động chính xác. image.png

3. Truy vấn nhật ký

Trong bảng điều khiển bên trái, đi tới "Explore". Chọn nguồn Loki của bạn ở trên cùng: image.png

Bây giờ đến phần siêu thú vị của thiết lập này. Bạn có thể truy vấn nhật ký theo tên container, dự án compose, v.v.: image.png

Đây là phần hay nhất của thiết lập này, vì bạn có thể dễ dàng xem nhật ký của một container cụ thể mà không cần phải phân loại qua hàng trăm tệp và cấu hình kỳ lạ.

Kết luận

Tôi thích thiết lập này, tôi triển khai nội dung của mình chủ yếu bằng Docker và việc tập trung tất cả nhật ký vào một nơi duy nhất giúp cuộc sống của tôi dễ dàng hơn rất nhiều trong việc gỡ lỗi và giám sát.

Hy vọng bạn thấy bài viết này hữu ích.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí