Skip to content

Hướng dẫn gỡ lỗi truy vấn

Khi truy vấn BQL không hoạt động như mong đợi, hướng dẫn này sẽ giúp bạn tìm và sửa lỗi.

Truy vấn không hoạt động — Phải làm gì?

Làm theo các bước sau theo thứ tự:

Bước 1: Đọc thông báo lỗi

Nếu bạn thấy lỗi, hãy đọc kỹ. Thông thường lỗi sẽ nói chính xác vấn đề nằm ở đâu.

Mẫu lỗi thường gặp:

  • "syntax error" → Kiểm tra dấu | và cách viết lệnh
  • "unknown field" → Kiểm tra tên trường trong mô hình dữ liệu
  • "type mismatch" → Kiểm tra xem bạn có đang so sánh String với Int không

Tham khảo đầy đủ: Xem Tham chiếu thông báo lỗi


Bước 2: Đơn giản hóa truy vấn

Bớt phức tạp cho đến khi chạy được, rồi từng bước thêm lại.

Ví dụ:

bql
-- Bắt đầu đơn giản:
from events-* | head 10

-- Thêm một bộ lọc:
from events-* | search status=error | head 10

-- Thêm một bộ lọc nữa:
from events-* | search status=error and env=prod | head 10

-- Thêm tổng hợp:
from events-* | search status=error and env=prod | stats count

Bước 3: Kiểm tra tên trường

Tên trường phân biệt hoa/thường và phải khớp chính xác.

Cách kiểm tra:

  1. Chạy truy vấn đơn giản để xem các trường có sẵn:
    bql
    from events-* | head 1
  2. Xem Tham chiếu mô hình dữ liệu cho mẫu index của bạn
  3. Kiểm tra cách viết và thứ tự chữ hoa/thường

Bước 4: Kiểm tra kiểu dữ liệu

BQL có hai kiểu: StringInt. Khi so sánh phải cùng kiểu.

Cách kiểm tra:

  • String: "error", "42", "true"
  • Int: 42, 0, 100
  • "42" (String) khác 42 (Int)

Sai lầm thường gặp: search port=443 trong khi port là String → dùng search port="443"


Bước 5: Kiểm tra hạn chế

Một số tính năng bạn mong đợi có thể chưa tồn tại trong BQL.

Hạn chế đã biết:

  • Không có toán tử NOT → dùng !=
  • Không có toán tử < > <= >=
  • Không dùng regex trong search → dùng match() trong eval
  • Không có kiểu Float → dùng Int hoặc String

Danh sách đầy đủ: Xem Hạn chế đã biết


Bước 6: Kiểm tra thứ tự pipeline

BQL thực thi lệnh từ trái sang phải. Thứ tự rất quan trọng.

Sai lầm thường gặp:

  • Sắp xếp trước khi lọc (lãng phí tài nguyên)
  • Tổng hợp trước khi lọc (đếm sai hàng)

Thứ tự đúng:

bql
from index-* | search ... | where ... | eval ... | stats ... | sort ... | head

Bước 7: Kiểm tra dữ liệu thiếu

Nếu truy vấn trả về kết quả rỗng:

  1. Xác nhận mẫu index tồn tại (from events-*)
  2. Kiểm tra khoảng thời gian (timerange earliest=... latest=...)
  3. Xác nhận trường có dữ liệu (kiểm tra mẫu với head 10)

Sơ đồ quyết định

Có thông báo lỗi?
├── "syntax error" → Kiểm tra dấu | và cách viết lệnh
├── "unknown field" → Kiểm tra tham chiếu mô hình dữ liệu
├── "type mismatch" → Kiểm tra String vs Int
├── "function not found" → Kiểm tra tham chiếu hàm
├── "timeout" → Thêm head/limit, thu hẹp bộ lọc
└── Không lỗi, nhưng kết quả rỗng?
    ├── Kiểm tra mẫu index
    ├── Kiểm tra khoảng thời gian
    ├── Kiểm tra trường có tồn tại
    └── Kiểm tra kiểu dữ liệu

Danh sách kiểm tra khi gỡ lỗi

Sử dụng danh sách này khi gặp sự cố:

  • [ ] Cú pháp đã đúng chưa? (dấu | giữa các lệnh)
  • [ ] Tên lệnh viết đúng chưa?
  • [ ] Tên trường khớp chính xác chưa? (phân biệt hoa/thường)
  • [ ] Đang so sánh đúng kiểu chưa? (String vs Int)
  • [ ] Thứ tự pipeline đúng chưa? (lọc → tổng hợp → sắp xếp)
  • [ ] Chỉ dùng các tính năng được hỗ trợ chưa? (kiểm tra hạn chế)
  • [ ] Mẫu index có tồn tại không?
  • [ ] Khoảng thời gian đã đặt đúng chưa?
  • [ ] Có dữ liệu cho các trường bạn đang truy vấn không?

Ví dụ thực tế khi gỡ lỗi

Tình huống 1: Lỗi cú pháp

Truy vấn:

bql
search status=error | | head 5

Lỗi: parse error: empty command in pipeline

Sửa: Xóa dấu | thừa:

bql
search status=error | head 5

Tình huống 2: Kết quả rỗng

Truy vấn:

bql
from logs-* | search status=Error | head 10

Không lỗi, nhưng không có kết quả.

Gỡ lỗi:

  1. Kiểm tra giá trị trường: from logs-* | head 1 → thấy status=error (chữ thường)
  2. Sửa lỗi hoa/thường: search status=error

Kết quả: Chạy được sau khi sửa chữ hoa/thường.

Tình huống 3: Sai kiểu dữ liệu

Truy vấn:

bql
from logs-* | search port=443 | head 10

Không lỗi, nhưng không có kết quả.

Gỡ lỗi:

  1. Kiểm tra kiểu trường: port được lưu dưới dạng String
  2. Sửa kiểu: search port="443"

Kết quả: Chạy được sau khi thêm dấu ngoặc kép.

Tình huống 4: Thiếu khoảng thời gian

Truy vấn:

bql
from logs-* | search status=error | head 10

Lỗi: scan without time range

Sửa: Thêm khoảng thời gian:

bql
timerange earliest=2026-01-01T00:00:00Z latest=2026-01-02T00:00:00Z | from logs-* | search status=error | head 10

Tình huống 5: Hàm không tồn tại

Truy vấn:

bql
from logs-* | eval label=toLower("hello") | head 5

Lỗi: semantic error: unknown function 'toLower'

Sửa: Dùng đúng tên hàm:

bql
from logs-* | eval label=lower("hello") | head 5

Cần giúp thêm

Nếu vẫn chưa giải quyết được:

  1. Xem Tham chiếu thông báo lỗi để biết chi tiết lỗi cụ thể
  2. Xem Sai lầm thường gặp để tìm vấn đề tương tự
  3. Xem Hạn chế đã biết để biết tính năng chưa có
  4. Xem Cookbook để tham khảo truy vấn mẫu

Chủ đề liên quan

Released under the MIT License.