Tham Chiếu Thông Báo Lỗi
Khi truy vấn BQL gặp vấn đề, bạn sẽ thấy thông báo lỗi. Hướng dẫn này giúp bạn hiểu chuyện gì đã xảy ra và cách khắc phục.
Chẩn Đoán Nhanh
Gặp lỗi? Làm theo sơ đồ sau:
- Lỗi nhắc đến "parse" hoặc "syntax" → Xem Lỗi phân tích cú pháp
- Lỗi nhắc đến "semantic" hoặc "function" → Xem Lỗi ngữ nghĩa
- Lỗi nhắc đến "runtime", "execution", hoặc "opensearch" → Xem Lỗi thời gian chạy
Lỗi Phân Tích Cú Pháp
Lỗi phân tích cú pháp xảy ra khi BQL không hiểu được cú pháp truy vấn của bạn. Parser báo cáo các lỗi này dưới dạng diagnostics với tiền tố parse error:.
"empty command in pipeline"
Nguyên nhân: Đoạn pipeline trống, ví dụ search foo | | head 5 (đoạn trống giữa hai dấu |).
Cách sửa: Xóa đoạn trống:
-- Wrong: empty segment
search foo | | head 5
-- Correct:
search foo | head 5"FROM must be the first segment in the query"
Nguyên nhân: Bạn đặt from ở vị trí khác ngoài đầu truy vấn.
Cách sửa: Đưa from lên đầu:
-- Wrong: from after search
search status=error | from logs-*
-- Correct:
from logs-* | search status=error"expected expression"
Nguyên nhân: Lệnh search hoặc where không có biểu thức phía sau.
Cách sửa: Thêm biểu thức lọc:
-- Wrong: no expression
search | head 5
-- Correct:
search status=error | head 5"expected limit value"
Nguyên nhân: limit không có số phía sau.
Cách sửa: Thêm số:
-- Wrong: no value
limit
-- Correct:
limit 10"invalid limit value"
Nguyên nhân: Giá trị sau limit không phải số hợp lệ.
Cách sửa: Dùng số nguyên dương:
-- Wrong: not a number
limit ten
-- Correct:
limit 10"expected head value" / "expected tail value"
Nguyên nhân: head hoặc tail không có số phía sau.
Cách sửa: Thêm số:
-- Wrong: no value
head
-- Correct:
head 10"invalid head value" / "invalid tail value"
Nguyên nhân: Giá trị sau head/tail không phải số hợp lệ.
Cách sửa: Dùng số nguyên dương:
-- Wrong: negative value
head -1
-- Correct:
head 10"expected eval assignment target=expr"
Nguyên nhân: eval không có định dạng target=expression.
Cách sửa: Dùng cú pháp target=expression:
-- Wrong: no assignment
eval lower("hello")
-- Correct:
eval label=lower("hello")"invalid eval assignment target=expr"
Nguyên nhân: Mục tiêu hoặc biểu thức trong eval bị trống.
Cách sửa: Cung cấp cả mục tiêu và biểu thức:
-- Wrong: empty expression
eval label=
-- Correct:
eval label=lower("hello")"expected stats function like count(field) or min(field)"
Nguyên nhân: stats không có lệnh hàm hợp lệ.
Cách sửa: Dùng hàm stats hợp lệ:
-- Wrong: no function
stats
-- Correct:
stats count
stats min(code)"unsupported stats function 'X'"
Nguyên nhân: Bạn dùng tên hàm không được hỗ trợ trong stats.
Cách sửa: Dùng một trong các hàm được hỗ trợ:
count,distinct_count,min,max,sum,avg
-- Wrong: median not supported
stats median(latency)
-- Correct:
stats avg(latency)"expected ')' to close stats function"
Nguyên nhân: Lệnh hàm stats bị thiếu dấu đóng ngoặc.
Cách sửa: Đóng ngoặc:
-- Wrong: missing )
stats min(code
-- Correct:
stats min(code)"expected field name inside stats function"
Nguyên nhân: Lệnh hàm có ngoặc trống, ví dụ min().
Cách sửa: Thêm tên trường:
-- Wrong: empty parens
stats min()
-- Correct:
stats min(code)"expected sort field"
Nguyên nhân: sort không có tên trường phía sau.
Cách sửa: Thêm trường:
-- Wrong: no field
sort
-- Correct:
sort host
sort host desc"expected timerange earliest=<value> latest=<value>"
Nguyên nhân: timerange thiếu tham số bắt buộc.
Cách sửa: Cung cấp cả earliest và latest:
-- Wrong: missing arguments
timerange
-- Correct:
timerange earliest=2026-01-01T00:00:00Z latest=2026-01-02T00:00:00Z"timerange requires earliest=<value>" / "timerange requires latest=<value>"
Nguyên nhân: Thiếu một trong hai tham số timerange bắt buộc.
Cách sửa: Cung cấp cả hai tham số:
-- Wrong: missing latest
timerange earliest=2026-01-01T00:00:00Z
-- Correct:
timerange earliest=2026-01-01T00:00:00Z latest=2026-01-02T00:00:00Z"invalid timerange token 'X'"
Nguyên nhân: Xuất hiện token không nhận diện được trong tham số timerange.
Cách sửa: Chỉ dùng earliest=, latest=, và tùy chọn field=:
-- Wrong: unrecognized token
timerange earliest=2026-01-01T00:00:00Z latest=2026-01-02T00:00:00Z timezone=UTC
-- Correct:
timerange earliest=2026-01-01T00:00:00Z latest=2026-01-02T00:00:00Z"expected rename <old> as <new>"
Nguyên nhân: rename không tuân theo cú pháp old as new.
Cách sửa: Dùng cú pháp đúng:
-- Wrong: missing "as"
rename old_field new_field
-- Correct:
rename old_field as new_field"rename requires both old and new field names"
Nguyên nhân: Một hoặc cả hai tên trường trong rename bị trống.
Cách sửa: Cung cấp cả hai tên:
-- Wrong: empty new name
rename field as
-- Correct:
rename field as new_field"expected top <count> <field> or top <field>"
Nguyên nhân: top có định dạng tham số không hợp lệ.
Cách sửa: Dùng một trong hai định dạng:
-- Both are correct:
top host
top 5 host"invalid top count 'X'"
Nguyên nhân: Số đếm trong top không phải số hợp lệ.
Cách sửa: Dùng số nguyên dương:
-- Wrong: not a number
top five host
-- Correct:
top 5 host"expected rare <count> <field> or rare <field>"
Nguyên nhân: rare có định dạng tham số không hợp lệ.
Cách sửa: Dùng một trong hai định dạng:
-- Both are correct:
rare host
rare 5 host"invalid rare count 'X'"
Nguyên nhân: Số đếm trong rare không phải số hợp lệ.
Cách sửa: Dùng số nguyên dương:
-- Wrong: not a number
rare five host
-- Correct:
rare 5 host"expected addtotal field"
Nguyên nhân: addtotal không có tên trường phía sau.
Cách sửa: Thêm trường:
-- Wrong: no field
addtotal
-- Correct:
addtotal count"expected lookup table match_field OUTPUT field1, field2"
Nguyên nhân: lookup có định dạng tham số không hợp lệ.
Cách sửa: Tuân theo cú pháp: lookup <table> <match_field> OUTPUT <field1>, <field2>
-- Wrong: missing OUTPUT
lookup threat_intel src_ip threat_level
-- Correct:
lookup threat_intel src_ip OUTPUT threat_level"expected OUTPUT keyword in lookup command"
Nguyên nhân: Lệnh lookup thiếu từ khóa OUTPUT.
Cách sửa: Thêm OUTPUT trước các trường đầu ra:
-- Wrong: no OUTPUT keyword
lookup threat_intel src_ip threat_level
-- Correct:
lookup threat_intel src_ip OUTPUT threat_level"expected at least one output field after OUTPUT"
Nguyên nhân: lookup có OUTPUT nhưng không có tên trường phía sau.
Cách sửa: Thêm tên trường sau OUTPUT:
-- Wrong: nothing after OUTPUT
lookup threat_intel src_ip OUTPUT
-- Correct:
lookup threat_intel src_ip OUTPUT threat_level"expected inputlookup table name"
Nguyên nhân: inputlookup không có tên bảng phía sau.
Cách sửa: Thêm tên bảng:
-- Wrong: no table
inputlookup
-- Correct:
inputlookup threat_intel"expected join type=<inner|left|right> key=<field> <right_table_or_subsearch>"
Nguyên nhân: join có định dạng tham số không hợp lệ.
Cách sửa: Tuân theo cú pháp:
-- Correct:
join type=inner key=src_ip threat_intel
join type=left key=src_ip [from threat-* | search action=login]"unknown join type 'X', expected inner, left, or right"
Nguyên nhân: Bạn dùng loại join không được nhận diện.
Cách sửa: Dùng inner, left, hoặc right:
-- Wrong: full not supported
join type=full key=src_ip threat_intel
-- Correct:
join type=inner key=src_ip threat_intel"join requires key=<field>"
Nguyên nhân: join thiếu tham số key=.
Cách sửa: Thêm trường key:
-- Wrong: no key
join type=inner threat_intel
-- Correct:
join type=inner key=src_ip threat_intel"join requires a right table or subsearch"
Nguyên nhân: join không có nguồn dữ liệu bên phải.
Cách sửa: Thêm bảng hoặc subsearch:
-- Wrong: no right source
join type=inner key=src_ip
-- Correct:
join type=inner key=src_ip threat_intel"unclosed bracket in subsearch"
Nguyên nhân: Dấu [ trong subsearch của join không được đóng bằng ].
Cách sửa: Đóng dấu ngoặc:
-- Wrong: missing ]
join type=inner key=src_ip [from threat-* | search action=login
-- Correct:
join type=inner key=src_ip [from threat-* | search action=login]"empty subsearch in join"
Nguyên nhân: Dấu ngoặc trong subsearch của join bị trống: [].
Cách sửa: Thêm truy vấn bên trong dấu ngoặc:
-- Wrong: empty subsearch
join type=inner key=src_ip []
-- Correct:
join type=inner key=src_ip [from threat-* | search action=login]"expected timechart span=<interval> [agg_func[(field)]] [by <fields>]"
Nguyên nhân: timechart có định dạng tham số không hợp lệ hoặc bị thiếu.
Cách sửa: Tuân theo cú pháp:
-- Correct:
timechart span=1h
timechart span=5m count by host"timechart span requires a value like 1h, 5m, 1d"
Nguyên nhân: timechart có span= nhưng không có giá trị khoảng thời gian.
Cách sửa: Thêm khoảng thời gian:
-- Wrong: empty span
timechart span=
-- Correct:
timechart span=1h"timechart requires span=<interval>"
Nguyên nhân: timechart thiếu tham số span bắt buộc.
Cách sửa: Thêm span:
-- Wrong: no span
timechart count
-- Correct:
timechart span=1h count"unsupported timechart function 'X'"
Nguyên nhân: Hàm tổng hợp trong timechart không được hỗ trợ.
Cách sửa: Dùng hàm được hỗ trợ:
count,distinct_count,min,max,sum,avg
"unknown command 'X'"
Nguyên nhân: BQL không nhận diện được tên lệnh.
Cách sửa: Kiểm tra chính tả. Các lỗi thường gặp:
| Sai | Đúng |
|---|---|
seach | search |
whre | where |
stat | stats |
evalute | eval |
timchart | timechart |
"unexpected token in expression"
Nguyên nhân: Biểu thức chứa token không phù hợp với ngữ pháp.
Cách sửa: Kiểm tra lỗi đánh máy trong biểu thức. Biểu thức BQL dùng and/or cho logic Boolean:
-- Wrong: using && instead of and
search status=error && host=web01
-- Correct:
search status=error and host=web01
search status=error host=web01"expected expression after 'or'" / "expected expression after 'and'"
Nguyên nhân: Toán tử Boolean nằm ở cuối biểu thức mà không có gì phía sau.
Cách sửa: Thêm biểu thức bên phải:
-- Wrong: trailing operator
search status=error or
-- Correct:
search status=error or host=web01"unexpected boolean operator"
Nguyên nhân: and hoặc or xuất hiện ở vị trí cần một thuật ngữ (ví dụ: đầu biểu thức).
Cách sửa: Đặt thuật ngữ trước toán tử Boolean:
-- Wrong: starts with "or"
search or status=error
-- Correct:
search status=error or host=web01Lỗi Ngữ Nghĩa
Lỗi ngữ nghĩa xảy ra khi cú pháp truy vấn đúng nhưng ý nghĩa không hợp lý. Tầng ngữ nghĩa báo cáo các lỗi này dưới dạng diagnostics với tiền tố semantic error:.
"unknown function 'X'"
Nguyên nhân: Bạn gọi hàm không tồn tại trong registry.
Cách sửa: Kiểm tra chính tả tên hàm. Các hàm khả dụng:
lower,upper,lendecode_url,decode_hex,base64_decodematch
-- Wrong: toLower not a function
eval label=toLower("hello")
-- Correct:
eval label=lower("hello")"function 'X' arity mismatch: expected N, got M"
Nguyên nhân: Bạn truyền sai số lượng tham số cho hàm.
Cách sửa: Kiểm tra chữ ký hàm:
| Hàm | Tham số | Trả về |
|---|---|---|
lower | 1 (String) | String |
upper | 1 (String) | String |
len | 1 (String) | Int |
decode_url | 1 (String) | String |
decode_hex | 1 (String) | String |
base64_decode | 1 (String) | String |
match | 2 (String, String) | Int |
-- Wrong: lower takes 1 arg, not 2
eval x=lower("hello", "world")
-- Correct:
eval x=lower("hello")"function 'X' arg #N type mismatch: expected Y, got Z"
Nguyên nhân: Tham số hàm có kiểu dữ liệu sai.
Cách sửa: Truyền kiểu dữ liệu đúng:
-- Wrong: upper expects String, not Int
eval x=upper(42)
-- Correct:
eval x=upper("hello")"unresolved type blocks logical lowering"
Nguyên nhân: Biểu thức có kiểu Unknown không thể phân tích trước khi lập kế hoạch.
Cách sửa: Lỗi này thường xảy ra khi bạn truyền tham chiếu trường thô ở nơi cần biểu thức có kiểu. Dùng phép so sánh hoặc lệnh hàm:
-- Wrong: bare field reference with Unknown type
eval x=unknown_field
-- Correct:
eval x=lower("hello")
search field=value"timerange earliest must be <= latest"
Nguyên nhân: Timestamp earliest nằm sau timestamp latest.
Cách sửa: Hoán đổi giá trị hoặc sửa ngày:
-- Wrong: earliest is after latest
timerange earliest=2026-01-02T00:00:00Z latest=2026-01-01T00:00:00Z
-- Correct:
timerange earliest=2026-01-01T00:00:00Z latest=2026-01-02T00:00:00Z"source intersection is empty: query-declared sources do not match any externally-allowed sources"
Nguyên nhân: Cluase from trong truy vấn tham chiếu index không có trong danh sách được phép.
Cách sửa: Kiểm tra các pattern index khả dụng hoặc liên hệ quản trị viên để được cấp quyền truy cập.
Lỗi Thời Gian Chạy
Lỗi thời gian chạy xảy ra trong quá trình thực thi truy vấn. Các lỗi này xuất hiện dưới dạng QueryRunError variants.
"parse error: ..."
Nguyên nhân: Parser phát hiện lỗi cú pháp trong truy vấn.
Cách sửa: Xem Lỗi phân tích cú pháp ở trên để biết thông báo cụ thể.
"semantic error: ..."
Nguyên nhân: Trình phân tích ngữ nghĩa phát hiện lỗi kiểu hoặc hàm.
Cách sửa: Xem Lỗi ngữ nghĩa ở trên để biết thông báo cụ thể.
"logical lowering failed"
Nguyên nhân: Semantic IR không thể chuyển thành logical plan. Lỗi này thường đi sau lỗi kiểu chưa giải quyết.
Cách sửa: Kiểm tra rằng tất cả biểu thức có kiểu đã được xác định. Thường bạn cần sửa lỗi ngữ nghĩa trước đó.
"scan without time range"
Nguyên nhân: Truy vấn đang cố quét dữ liệu mà không có bộ lọc khoảng thời gian. BQL yêu cầu truy vấn có giới hạn thời gian để đảm bảo an toàn.
Cách sửa: Thêm lệnh timerange:
-- Wrong: no time range
from logs-* | search status=error
-- Correct:
timerange earliest=2026-01-01T00:00:00Z latest=2026-01-02T00:00:00Z | from logs-* | search status=error"physical planning failed: ..."
Nguyên nhân: Optimizer hoặc physical planner không thể tạo kế hoạch thực thi.
Cách sửa: Đây thường là lỗi nội bộ. Hãy thử đơn giản hóa truy vấn. Nếu lỗi vẫn tiếp tục, hãy báo cáo kèm theo toàn bộ nội dung truy vấn.
"missing fixture datasource: ..."
Nguyên nhân: Trong chế độ test, fixture data source không tìm thấy.
Cách sửa: Đây là lỗi cơ sở hạ tầng test, không phải lỗi truy vấn. Đảm bảo dữ liệu fixture đã được tải.
"missing physical scan node"
Nguyên nhân: Physical plan thiếu scan node. Đây là lỗi nội bộ.
Cách sửa: Đây là lỗi nội bộ. Hãy thử đơn giản hóa truy vấn hoặc báo cáo.
"opensearch execution failed: ..."
Nguyên nhân: Truy vấn đã được gửi đến OpenSearch nhưng gặp lỗi trong quá trình thực thi.
Nguyên nhân và cách sửa thường gặp:
| Lỗi OpenSearch | Nguyên nhân có thể | Cách sửa |
|---|---|---|
no such index [X] | Sai pattern index | Kiểm tra tên index trong cluase from |
mapper_parsing_exception | Kiểu trường không khớp | Kiểm tra kiểu trường trong index |
search_phase_execution_exception | Query DSL không hợp lệ | Đơn giản hóa truy vấn |
missing aggregations object | Index trống hoặc sai cú pháp aggregation | Kiểm tra index có dữ liệu |
connection refused | OpenSearch đang dừng | Kiểm tra OpenSearch có đang chạy |
request_timeout | Truy vấn chạy quá lâu | Thêm head hoặc limit để giảm phạm vi |
"feature disabled: stats" / "feature disabled: sort"
Nguyên nhân: Tính năng stats hoặc sort chưa được bật trong cấu hình.
Cách sửa: Liên hệ quản trị viên để bật feature flag, hoặc dùng cách tiếp cận thay thế:
-- If stats is disabled, you can't use:
stats count
-- If sort is disabled, you can't use:
sort host"cannot use both BQL stats and proto aggs in the same query"
Nguyên nhân: Bạn trộn lẫn stats của BQL với aggregation cấp proto.
Cách sửa: Dùng một trong hai, không dùng cả hai trong cùng một truy vấn.
"internal error: ..."
Nguyên nhân: Xuất hiện lỗi nội bộ không mong đợi.
Cách sửa: Đây là lỗi trong BQL. Hãy báo cáo kèm theo toàn bộ nội dung truy vấn và chi tiết lỗi.
Các Mẫu Lỗi Thường Gặp
| Thông báo lỗi | Nguyên nhân có thể | Cách sửa nhanh |
|---|---|---|
parse error: unknown command 'X' | Sai chính tả lệnh | Kiểm tra chính tả lệnh |
parse error: expected expression | search/where trống | Thêm biểu thức lọc |
parse error: invalid limit value | limit không phải số | Dùng số nguyên dương |
semantic error: unknown function 'X' | Sai tên hàm | Kiểm tra tham chiếu hàm |
semantic error: arity mismatch | Sai số lượng tham số | Kiểm tra chữ ký hàm |
logical lowering failed | Kiểu chưa giải quyết | Sửa lỗi ngữ nghĩa trước đó |
scan without time range | Thiếu timerange | Thêm lệnh timerange |
opensearch execution failed: no such index | Sai tên index | Kiểm tra pattern index |
feature disabled: stats | Stats chưa được bật | Liên hệ quản trị viên |
Khôi Phục Lỗi
BQL sử dụng cơ chế khôi phục lỗi: khi xảy ra lỗi phân tích cú pháp, parser sẽ cố gắng tiếp tục và báo cáo tất cả lỗi cùng lúc, thay vì dừng lại ở lỗi đầu tiên. Điều này có nghĩa bạn có thể thấy nhiều lỗi trong một truy vấn. Hãy sửa lỗi đầu tiên trước, vì các lỗi sau thường là hậu quả nối tiếp từ lỗi đầu tiên.
Chủ Đề Liên Quan
- Bắt Đầu — Mới sử dụng BQL? Bắt đầu từ đây
- Tham Chiếu Lệnh — Toàn bộ cú pháp lệnh
- Cookbook — Truy vấn sẵn sàng sử dụng
- Giới Hạn Đã Biết — Những gì BQL chưa làm được
