Skip to content

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:

  1. Lỗi nhắc đến "parse" hoặc "syntax" → Xem Lỗi phân tích cú pháp
  2. Lỗi nhắc đến "semantic" hoặc "function" → Xem Lỗi ngữ nghĩa
  3. 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:

bql
-- 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:

bql
-- 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:

bql
-- 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ố:

bql
-- 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:

bql
-- 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ố:

bql
-- 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:

bql
-- 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:

bql
-- 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:

bql
-- 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ệ:

bql
-- 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
bql
-- 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:

bql
-- 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:

bql
-- 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:

bql
-- 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ả earliestlatest:

bql
-- 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ố:

bql
-- 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=:

bql
-- 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:

bql
-- 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:

bql
-- 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:

bql
-- 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:

bql
-- 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:

bql
-- 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:

bql
-- 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:

bql
-- 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>

bql
-- 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:

bql
-- 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: lookupOUTPUT nhưng không có tên trường phía sau.

Cách sửa: Thêm tên trường sau OUTPUT:

bql
-- 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:

bql
-- 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:

bql
-- 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:

bql
-- 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:

bql
-- 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:

bql
-- 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:

bql
-- 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:

bql
-- 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:

bql
-- Correct:
timechart span=1h
timechart span=5m count by host

"timechart span requires a value like 1h, 5m, 1d"

Nguyên nhân: timechartspan= nhưng không có giá trị khoảng thời gian.

Cách sửa: Thêm khoảng thời gian:

bql
-- 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:

bql
-- 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
seachsearch
whrewhere
statstats
evaluteeval
timcharttimechart

"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:

bql
-- 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:

bql
-- 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:

bql
-- Wrong: starts with "or"
search or status=error

-- Correct:
search status=error or host=web01

Lỗ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, len
  • decode_url, decode_hex, base64_decode
  • match
bql
-- 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àmTham sốTrả về
lower1 (String)String
upper1 (String)String
len1 (String)Int
decode_url1 (String)String
decode_hex1 (String)String
base64_decode1 (String)String
match2 (String, String)Int
bql
-- 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:

bql
-- 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:

bql
-- 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:

bql
-- 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:

bql
-- 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 OpenSearchNguyên nhân có thểCách sửa
no such index [X]Sai pattern indexKiểm tra tên index trong cluase from
mapper_parsing_exceptionKiểu trường không khớpKiểm tra kiểu trường trong index
search_phase_execution_exceptionQuery DSL không hợp lệĐơn giản hóa truy vấn
missing aggregations objectIndex trống hoặc sai cú pháp aggregationKiểm tra index có dữ liệu
connection refusedOpenSearch đang dừngKiểm tra OpenSearch có đang chạy
request_timeoutTruy vấn chạy quá lâuThê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ế:

bql
-- 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ỗiNguyên nhân có thểCách sửa nhanh
parse error: unknown command 'X'Sai chính tả lệnhKiểm tra chính tả lệnh
parse error: expected expressionsearch/where trốngThêm biểu thức lọc
parse error: invalid limit valuelimit không phải sốDùng số nguyên dương
semantic error: unknown function 'X'Sai tên hàmKiểm tra tham chiếu hàm
semantic error: arity mismatchSai số lượng tham sốKiểm tra chữ ký hàm
logical lowering failedKiểu chưa giải quyếtSửa lỗi ngữ nghĩa trước đó
scan without time rangeThiếu timerangeThêm lệnh timerange
opensearch execution failed: no such indexSai tên indexKiểm tra pattern index
feature disabled: statsStats chưa được bậtLiê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

Released under the MIT License.