Skip to content

Cấu hình BQL Server ​

BQL Server không dùng file cấu hình (không giống BlackHole Core/Search với blackhole.yml). Toàn bộ cấu hình server gồm:

  1. Biến môi trường — log level, port (qua port mapping Docker/systemd).
  2. Request gRPC — mọi thông tin truy vấn (OpenSearch, time range, quyền index) được client gửi trong từng request Execute.

Biến môi trường ​

BiếnMô tảMặc định
RUST_LOGLog level của tracing (error, warn, info, debug, trace)info
APP_IMAGEChỉ dùng trong docker-compose.deploy.yml để chọn image GHCR—
📝
Port gRPC mặc định là **9090** (hardcode trong binary: `0.0.0.0:9090`). Để đổi port, dùng port mapping của Docker (`-p 19090:9090`) hoặc `systemd` socket proxy — binary hiện không đọc biến môi trường cho port.

Cấu hình log ​

bash
# Chạy trực tiếp
RUST_LOG=debug cargo run -p bql-server

# Docker
docker run -d -p 9090:9090 -e RUST_LOG=debug ghcr.io/gcsclabs/bql-server:latest

Log output ở mức info bao gồm request đến, metadata injected, và shutdown. Ở mức debug, chi tiết hơn (index overrides, PIT cache, chunk).

Tham chiếu request gRPC ​

Service chính: bql.v1.Bql/Execute (server-streaming). Message ExecuteRequest:

TrườngKiểuMô tả
bqlstringNội dung truy vấn BQL (bắt buộc có from <index>)
earliest_unixint64Bắt đầu khoảng thời gian (Unix giây). 0 = không áp dụng
latest_unixint64Kết thúc khoảng thời gian (Unix giây). 0 = không áp dụng
time_fieldstringTên trường thời gian (mặc định ts nếu để trống)
opensearch_urlstringBase URL OpenSearch, vd http://opensearch:9200
opensearch_userstringUsername OpenSearch (bỏ trống nếu không có auth)
opensearch_passstringPassword OpenSearch
row_limituint32Giới hạn số dòng trả về (0 = mặc định engine)
byte_limituint32Giới hạn dung lượng phản hồi
timeout_msuint32Timeout truy vấn (milli giây)
lookup_tablesmap<string,string>Dữ liệu lookup CSV theo tên bảng
pushdown_enabledboolBật pushdown filter/projection xuống OpenSearch
filterrepeated FilterClauseBộ lọc proto (range/term/bool/match) ép trực tiếp xuống OpenSearch
aggsmap<string, AggregationSpec>Aggregation proto (date_histogram, terms, histogram, min/max/sum/avg/count)
sizeint32Số dòng mỗi page (giống head)
fromint32Offset phân trang (0 = từ đầu)
allowed_indexesrepeated IndexInfoDanh sách index được phép truy vấn (phân quyền)
sortrepeated SortClauseSắp xếp theo trường (ASC/DESC)
source_includesrepeated stringChỉ trả về các trường này
source_excludesrepeated stringLoại trừ các trường này
track_total_hitsint32Bật đếm tổng số hit chính xác
search_afterstringCursor phân trang (JSON từ Completion.search_after của page trước)

IndexInfo — phân quyền index ​

protobuf
message IndexInfo {
  string name   = 1;  // Tên index hoặc glob pattern, vd "logs-*"
  string prefix = 2;  // Tiền tố tenant, vd "tenant_a" → truy vấn "tenant_a_logs-*"
}

Quy tắc:

  • Index trong from phải khớp (exact hoặc glob) với một IndexInfo.name trong allowed_indexes, nếu không request bị từ chối.
  • Nếu prefix khác rỗng, index thực tế truy vấn là {prefix}_{name}.
  • allowed_indexes rỗng → từ chối toàn bộ truy vấn.

Phản hồi gRPC ​

ExecuteResponse là một oneof:

TrườngMô tả
chunkChunk dữ liệu: columns + rows (mỗi row là map<string,string>)
completionKết thúc truy vấn: FULL / PARTIAL / FAILED
aggregation_responseKết quả aggregation (buckets)

Completion chứa ExecutionReport (query_id, rows_emitted, source_rows_read, operator_steps, telemetry_json) và search_after (cursor cho page kế tiếp, rỗng khi hết).

ℹ️
Mỗi truy vấn luôn kết thúc bằng **đúng một** `Completion`. Nếu stream dừng mà không có `Completion` là lỗi giao thức — hãy báo lỗi phía client.

Đặc điểm hành vi cần biết ​

  • Bắt buộc from: request không có mệnh đề from bị từ chối (INVALID_ARGUMENT).
  • Time range tự inject: nếu earliest_unix/latest_unix khác 0 và truy vấn chưa có timerange, server tự chèn timerange field=<time_field> earliest=... latest=... vào pipeline.
  • Không time range → từ chối: nếu query thiếu cả timerange lẫn earliest/latest, engine từ chối (tránh full scan) với FAILED_PRECONDITION.
  • PIT cache: server cache Point-in-Time ID (TTL 300s) theo fingerprint của query để phân trang search_after hiệu quả; cache nằm trong bộ nhớ server, mất khi restart.

Liên kết liên quan ​

Released under the MIT License.