0

Lab 9.4 - Xây dựng hệ thống Centralized Logging với Fluent Bit, Loki và Grafana

Phần 4 - Kết nối Loki với Grafana và truy vấn Log đầu tiên

Đến thời điểm này, chúng ta đã hoàn thành hai thành phần quan trọng của hệ thống Logging:

  • Loki để lưu trữ log.
  • Fluent Bit để thu thập log từ Kubernetes và gửi tới Loki.

Tuy nhiên, việc xem log thông qua kubectl logs hoặc kiểm tra log của Loki vẫn chưa thực sự thuận tiện.

Trong môi trường Production, DevOps thường sử dụng Grafana để tìm kiếm, lọc và phân tích log.

Ở phần này, chúng ta sẽ kết nối Grafana với Loki và thực hiện những truy vấn LogQL đầu tiên.


Mục tiêu của phần này

Sau khi hoàn thành phần này, bạn sẽ:

  • Kết nối Grafana với Loki.
  • Hiểu Data Source trong Grafana.
  • Thực hiện truy vấn LogQL đầu tiên.
  • Tìm log theo Namespace.
  • Tìm log theo Pod.
  • Tìm log theo nội dung.
  • Hiểu Label và Log Stream trong Loki.

Kiến trúc sau khi hoàn thành

Sau phần này, kiến trúc Logging sẽ hoàn chỉnh.

              Spring Boot
                    │
             stdout / stderr
                    │
          /var/log/containers
                    │
               Fluent Bit
                    │
                   Loki
                    │
                 Grafana
                    │
             Search Log

Grafana sẽ đóng vai trò là giao diện để truy vấn và phân tích log.


Bước 1. Truy cập Grafana

Nếu Grafana chưa được mở, thực hiện Port Forward:

kubectl port-forward svc/grafana \
3000:80 \
-n monitoring

Mở trình duyệt:

http://localhost:3000

Đăng nhập bằng tài khoản đã tạo ở Lab 6.


Bước 2. Kiểm tra Data Source

Trong Grafana, chọn:

Connections

↓

Data Sources

Nếu bạn cài Loki bằng Helm Chart có tích hợp sẵn với Grafana, Data Source Loki có thể đã được tạo tự động.

Nếu chưa có, chúng ta sẽ thêm thủ công.


Bước 3. Thêm Data Source Loki

Chọn:

Add data source

Chọn:

Loki

Nhập địa chỉ:

http://loki.logging.svc.cluster.local:3100

Sau đó nhấn:

Save & Test

Nếu cấu hình đúng, Grafana sẽ hiển thị:

Data source is working

Điều này cho biết Grafana đã kết nối thành công tới Loki.


Vì sao dùng Service DNS?

Trong Kubernetes, các Pod có thể được tạo mới bất kỳ lúc nào.

Ví dụ:

loki-0

bị xóa.

Pod mới sẽ được tạo:

loki-1

Địa chỉ IP của Pod có thể thay đổi.

Do đó, Grafana không kết nối trực tiếp tới Pod, mà kết nối tới Kubernetes Service:

loki.logging.svc.cluster.local

Service sẽ tự động chuyển tiếp request tới Pod đang hoạt động.

Đây cũng là cách các ứng dụng trong Kubernetes giao tiếp với nhau.


Bước 4. Mở Explore

Grafana có hai khu vực chính:

  • Dashboard
  • Explore

Dashboard dùng để hiển thị Metrics.

Explore dùng để:

  • Query Metrics.
  • Query Logs.
  • Debug.

Chọn:

Explore

Ở góc trên bên trái, chọn Data Source:

Loki

Đây sẽ là nơi chúng ta thực hiện các truy vấn LogQL.


Bước 5. Thực hiện truy vấn đầu tiên

Nhập:

{}

Nhấn:

Run Query

Nếu Fluent Bit đã gửi log thành công, bạn sẽ thấy rất nhiều dòng log từ toàn bộ Cluster.

Ví dụ:

INFO Spring Boot started

GET /api/todos

Prometheus scrape completed

Grafana request

...

Lưu ý rằng:

{}

có nghĩa là:

Hiển thị tất cả Log Stream.

Trong Cluster thực tế có hàng trăm Pod, truy vấn này thường trả về rất nhiều dữ liệu nên ít khi được sử dụng.


Bước 6. Tìm log theo Namespace

Trong Kubernetes, mỗi ứng dụng thường nằm trong một Namespace.

Ví dụ:

todo-app

monitoring

logging

kube-system

Để chỉ xem log của ứng dụng Todo:

{namespace="todo-app"}

Ví dụ kết quả:

INFO Application started

GET /api/todos

POST /api/todos

ERROR Database timeout

So với:

{}

kết quả lúc này chỉ còn log của Namespace todo-app.


Bước 7. Tìm log theo Pod

Giả sử ứng dụng Backend có Pod:

todo-backend-6c89b7d4f9-4mv8h

Có thể truy vấn:

{pod="todo-backend-6c89b7d4f9-4mv8h"}

Hoặc:

{app="todo-backend"}

(nếu Fluent Bit đã thêm Label app).

Ví dụ:

GET /api/todos

POST /api/todos

DELETE /api/todos/10

Lúc này chúng ta chỉ xem log của Backend.


Bước 8. Tìm log theo nội dung

Một trong những tính năng mạnh nhất của Loki là tìm kiếm theo chuỗi.

Ví dụ chỉ lấy log chứa từ:

ERROR

Truy vấn:

{namespace="todo-app"} |= "ERROR"

Ví dụ:

ERROR Database connection timeout

ERROR PostgreSQL refused connection

ERROR Transaction rollback

Toán tử:

|=

có nghĩa là:

Chỉ lấy log chứa chuỗi chỉ định.

Đây là truy vấn được DevOps sử dụng rất thường xuyên khi điều tra sự cố.


Bước 9. Tìm HTTP 500

Giả sử ứng dụng ghi log như sau:

GET /api/todos 500

POST /api/users 500

GET /api/login 200

Có thể truy vấn:

{namespace="todo-app"} |= "500"

Ví dụ:

GET /api/todos 500

POST /api/users 500

DevOps có thể nhanh chóng xác định các request đang trả về lỗi.


Bước 10. Hiểu Label trong Loki

Điểm khác biệt lớn nhất giữa Loki và các hệ thống Logging truyền thống là Label.

Ví dụ một Log Stream:

namespace="todo-app"

pod="todo-backend-6c89b7d4f9"

container="backend"

app="todo-backend"

Đây chính là các Label.

Khi truy vấn:

{namespace="todo-app"}

Loki sẽ tìm Label trước.

Sau đó mới đọc nội dung log.

Nhờ vậy tốc độ truy vấn rất nhanh.


Hiểu Log Stream

Một Log Stream là tập hợp các log có cùng Label.

Ví dụ:

namespace="todo-app"

pod="backend"

container="backend"

là một Log Stream.

Trong khi:

namespace="todo-app"

pod="frontend"

container="frontend"

lại là một Log Stream khác.

Khi Cluster có hàng nghìn Pod, Loki vẫn có thể tìm đúng Log Stream chỉ trong thời gian rất ngắn.


Những truy vấn LogQL cơ bản

Mục đích Truy vấn
Tất cả log {}
Theo Namespace {namespace="todo-app"}
Theo Pod {pod="todo-backend-xxxx"}
Theo Container {container="backend"}
Chứa ERROR {namespace="todo-app"} \|= "ERROR"
Chứa WARN {namespace="todo-app"} \|= "WARN"
Chứa HTTP 500 {namespace="todo-app"} \|= "500"

Đây là những truy vấn bạn sẽ sử dụng thường xuyên trong quá trình vận hành hệ thống.


Những lỗi thường gặp

Không thấy Data Source Loki

Kiểm tra:

kubectl get svc -n logging

Đảm bảo Service Loki đang hoạt động.


Save & Test thất bại

Kiểm tra:

kubectl get pods -n logging

Đảm bảo Pod Loki ở trạng thái:

Running

Đồng thời kiểm tra URL của Data Source đã đúng hay chưa.


Không có log

Kiểm tra:

  • Fluent Bit có đang chạy không?
  • Fluent Bit đã gửi log tới Loki chưa?
  • Ứng dụng có đang sinh log không?

Có thể tạo một vài request tới Backend:

curl http://localhost:8080/api/todos

Sau đó chạy lại truy vấn trong Grafana.


Kết quả đạt được

Sau phần này, chúng ta đã:

  • Kết nối Grafana với Loki.
  • Thực hiện truy vấn LogQL đầu tiên.
  • Tìm kiếm log theo Namespace.
  • Tìm kiếm log theo Pod.
  • Tìm kiếm log theo nội dung.
  • Hiểu Label và Log Stream trong Loki.

Đến đây, chúng ta đã có thể xem log của toàn bộ Kubernetes Cluster ngay trên Grafana mà không cần sử dụng kubectl logs.

Tuy nhiên, việc chỉ biết cách tìm log vẫn chưa đủ. Điều quan trọng hơn là làm thế nào để sử dụng Metrics, Alerts và Logs cùng nhau để điều tra một sự cố thực tế.

Đó cũng chính là nội dung của Phần 5, nơi chúng ta sẽ mô phỏng một sự cố trong hệ thống Todo và áp dụng quy trình điều tra sự cố mà các đội ngũ DevOps thường sử dụng trong môi trường Production.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.