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