Thu thập thông tin
Khi báo lỗi hoặc cần hỗ trợ, chuẩn bị sẵn:
- Phiên bản:
blackhole-fwd --version - File log:
logs/default.logvàlogs/default-error.log; trên Linux service cònjournalctl -u blackhole-fwd --since "<thời điểm>"(chỉ chứa stderr) - Cấu hình đang dùng và file
.blackhole-resolved.yamlđi kèm (che API key, token, credential trước khi gửi) - Cách chạy: foreground, service hay container; hệ điều hành và phiên bản
- Các bước tái hiện lỗi và mốc thời gian
Bảng triệu chứng
| Triệu chứng | Mục |
|---|---|
Khởi động thoát ngay: Failed to read file for hashing | Thiếu file cấu hình |
Khởi động thoát ngay: registry.rest_forwarder.enabled=true requires registry.api_key | Thiếu api_key / device id |
| Khởi động thoát ngay, lỗi YAML/parse | Cấu hình sai cú pháp |
Khởi động thoát ngay: Startup blocked due to resource constraints | Bị chặn khi khởi động |
Service already exists. Use --force to overwrite. | Service đã tồn tại |
| Sửa cấu hình không có tác dụng | Service dùng sai cấu hình |
Cảnh báo Failed to pull remote config / Failed to fetch remote configuration | Registry không tới được |
device token not available, you need to authenticate first | Chưa xác thực |
| Service chạy nhưng không có dữ liệu ra sink | Không có dữ liệu |
| Source rsyslog/snmp/grpc không nhận dữ liệu | Thiếu section server |
No broker URL found | MQTT source thiếu broker |
gRPC trả permission_denied | Device bị chặn |
| Có section cấu hình nhưng port không mở | Port bị chiếm |
| Pipeline dừng giữa chừng, process vẫn sống | Bị tạm dừng |
Không docker exec vào được container | Container không có shell |
Lỗi khởi động
Thiếu file cấu hình
Triệu chứng: Lệnh blackhole-fwd start thoát ngay trước khi chạy pipeline, stderr báo:
Failed to read file for hashing: blackhole-fwd.ymlKhi chạy service, process cũng dừng ngay; file log chỉ có vài dòng đầu.
Nguyên nhân: File tại đường dẫn --config (mặc định blackhole-fwd.yml trong thư mục làm việc) không tồn tại. Ngay cả khi process thử config.yml / config.yaml lúc nạp cấu hình, bước khởi tạo watcher vẫn băm (hash) đúng đường dẫn --config nên vẫn thất bại.
Giải pháp:
- Xác định thư mục làm việc của process:
readlink /proc/$(pgrep -x blackhole-fwd)/cwd(Linux). Trên Windows là thư mục chứa executable. - Tạo file
blackhole-fwd.ymltại đúng thư mục đó, hoặc truyền--configtrỏ tới file có thật:blackhole-fwd -c /path/to/blackhole-fwd.yml start. - Với service: đặt
blackhole-fwd.yml(hoặcconfig.yml/config.yaml) vào thư mục chứa executable rồi chạy lạiservice start, service không lưu--config.
Xác minh:
ls -l blackhole-fwd.yml
grep "Entering main processing loop" logs/default.log | tail -1Kỳ vọng: file tồn tại tại đúng đường dẫn --config, không còn thông báo Failed to read file for hashing, và sau khi chạy lại blackhole-fwd start (hoặc service start) log có dòng Entering main processing loop. Press Ctrl+C to stop..
Thiếu api_key hoặc device id
Triệu chứng: Forwarder thoát ngay khi khởi động với một trong hai thông báo:
registry.rest_forwarder.enabled=true requires registry.api_key
device_id is not availableNguyên nhân: Cấu hình có section registry: khiến registry.http_server.enabled (mặc định true) bật HTTP next-hop ở cổng 18080. Lúc đó startup yêu cầu cả registry.api_key lẫn device id, device id chỉ có sau khi đã xác thực (auth --key) và được lưu trong database local.
Giải pháp:
- Xác thực trước khi khởi động:
blackhole-fwd auth --key "<API key>"(cầnregistry.api_urltrong cấu hình). - Thêm
registry.api_keyvào sectionregistry:của file cấu hình:
registry:
api_url: "https://<registry-host>"
api_key: "<API key>"- Không cần next-hop thì tắt nó:
registry.http_server.enabled: false(khi đó cổng 18080 và endpoint/healthcũng không có). - Chạy độc lập, không quản lý tập trung thì xoá hẳn section
registry:rồi khởi động lại.
Xác minh:
# Tái hiện lúc còn lỗi, xem phần stderr:
blackhole-fwd start 2>&1 | grep -E "requires registry.api_key|device_id is not available"
# kỳ vọng: in ra đúng thông báo lỗi đó
# Sau khi khắc phục:
grep "Orchestrator started successfully" logs/default.log | tail -1
# có dòng mới
curl -s http://127.0.0.1:18080/health # nếu vẫn bật listener
# {"status":"ok"}Cấu hình sai cú pháp
Triệu chứng: Process thoát ngay, console in thông báo lỗi YAML hoặc lỗi thiếu trường (ví dụ mapping values are not allowed here, missing field ...). Chạy service thì gần như không thấy gì, file log không có thông báo lỗi.
Nguyên nhân: File cấu hình sai cú pháp YAML hoặc thiếu trường bắt buộc. Việc kiểm tra cấu hình chỉ xảy ra lúc khởi động (và lúc nhận config từ Registry), không có lệnh config validate. Lỗi đọc cấu hình lại diễn ra trước khi hệ thống log khởi tạo nên không ghi vào file log.
Giải pháp:
- Chạy foreground từ đúng thư mục cấu hình để đọc lỗi trực tiếp:
blackhole-fwd start; echo $?- Sửa lỗi theo đúng thông báo (dấu chấm-indent, trường thiếu, kiểu dữ liệu).
- Đối chiếu schema chính thức:
blackhole-fwd configure schemarồi kiểm tra fileconfig.jsonschemanằm cạnh file cấu hình. - Khởi động lại service sau khi đã sửa xong.
Xác minh:
blackhole-fwd start; echo $?Kỳ vọng khi còn lỗi: thông báo lỗi + mã thoát 1. Khi đã đúng: process chạy tiếp, và grep "Orchestrator started successfully" logs/default.log | tail -1 có dòng mới.
Bị chặn khi khởi động do tài nguyên
Triệu chứng: Khởi động thất bại ngay, log có (mức ERROR) và stderr có:
Startup blocked due to resource constraints: CPU usage (92.00%) is at or above threshold (80.00%)Nguyên nhân: Resource guard kiểm tra CPU/memory/disk ngay lúc khởi động. Metric nào đang bật (ngưỡng ≤ 100) mà giá trị hiện tại ≥ ngưỡng thì process không cho chạy tiếp.
Giải pháp:
- Giải phóng tài nguyên máy (đóng process đang chiếm CPU/memory) rồi khởi động lại.
- Hoặc nâng ngưỡng trong
resources_threshold(vd.cpu.threshold_percentage: 95.0). - Hoặc đặt ngưỡng
> 100để tắt theo dõi metric đó, mặc địnhdisk.threshold_percentage: 101.0chính là tắt. - Nhớ khởi động lại: ngưỡng chỉ được đọc một lần lúc khởi động.
Xác minh:
grep "Startup resource check" logs/default.log | tail -2
# kỳ vọng dòng: "Startup resource check passed - all resources within acceptable limits"
grep "Startup blocked due to resource constraints" logs/default.log | tail -1
# chỉ còn các dòng trước khi khắc phụcService
Service đã tồn tại
Triệu chứng: blackhole-fwd service install thất bại với thông báo:
Service already exists. Use --force to overwrite.Nguyên nhân: Service đã được cài trước đó. Lệnh install không ghi đè service hiện có.
Giải pháp:
- Chỉ muốn khởi động service đang có:
blackhole-fwd service start(hoặcsystemctl start blackhole-fwd/Start-Service blackhole-fwd). - Muốn cài lại (ghi đè, uninstall rồi cài mới):
blackhole-fwd service install --force. - Muốn gỡ hẳn:
blackhole-fwd service uninstall.
Xác minh:
blackhole-fwd service install --force
blackhole-fwd service statusKỳ vọng: install thành công không báo lỗi, status in ✅ Service is running.
Service dùng sai cấu hình
Triệu chứng: Đã sửa file cấu hình nhưng không có tác dụng: log, port hoặc pipeline vẫn như cũ. File .blackhole-resolved.yaml bên cạnh file mình sửa không được ghi lại.
Nguyên nhân: service install ghi nhận service là <executable> --service --service-name blackhole-fwd, không có --config nên mọi tham số cấu hình lúc cài bị bỏ qua. Service tự tìm cấu hình từ thư mục làm việc (Linux: thư mục chứa executable; Windows: process tự chuyển về thư mục chứa executable). Ngoài ra, cấu hình có thể đang do Registry quản lý (nguồn remote) hoặc lấy từ database (persisted) nên sửa local bị bỏ qua.
Giải pháp:
- Xác định process đang chạy với tham số nào và thư mục nào:
sudo tr '\0' ' ' < /proc/$(pgrep -x blackhole-fwd)/cmdline; echo
sudo readlink /proc/$(pgrep -x blackhole-fwd)/cwd- Linux: đặt
blackhole-fwd.yml(hoặcconfig.yml/config.yaml) vào thư mục chứa executable, rồiservice stop+service start. - Windows: sửa file nằm ngay cạnh
blackhole-fwd.exe. - Kiểm tra nguồn cấu hình hiệu lực qua log
Resolved config snapshot written (source: ...). Nếu làremote, cấu hình do Registry quản lý, sửa local sẽ bị bỏ qua (Remote config is active — ignoring local config change). - Đọc cấu hình hiệu lực thực tế trong file
.blackhole-resolved.yamlnằm cạnh file cấu hình đang dùng.
Xác minh:
grep "Resolved config snapshot written" logs/default.log | tail -1
# kỳ vọng source: local (hoặc remote nếu chủ đích dùng Registry)
grep "Local config reloaded successfully" logs/default.log | tail -1
# sau khi sửa config đúng chỗ: có dòng mới trong ~6 giâyRegistry và xác thực
Registry không tới được
Triệu chứng: Log có cảnh báo lặp lại:
Failed to pull remote config: ...
Failed to fetch remote configuration: ...Forwarder vẫn chạy với cấu hình local hoặc persisted, không thoát process.
Nguyên nhân: Không kết nối được registry.api_url, do mạng, DNS, firewall, Registry đang dừng hoặc lỗi TLS.
Giải pháp:
- Kiểm tra kết nối HTTP tới Registry:
curl -sS -o /dev/null -w "%{http_code}\n" https://<registry-host>/(kỳ vọng200/301/404, không phải timeout). - Kiểm tra DNS:
nslookup <registry-host>. - Kiểm tra firewall/egress của máy Forwarder với cổng 443 (hoặc cổng của
api_url). - Không cần khởi động lại: process tự retry ở chu kỳ kế tiếp và không bao giờ thoát vì lỗi này. Hết warning khi Registry hồi phục.
Xác minh:
grep "Failed to fetch remote configuration" logs/default.log | tail -3
# các dòng ngừng tăng sau khi Registry hồi phục
blackhole-fwd service status # hoặc: pgrep -x blackhole-fwd
# process vẫn đang chạyChưa xác thực đã push/pull
Triệu chứng:
blackhole-fwd configure pushthất bại:device token not available, you need to authenticate firstblackhole-fwd auth --key ...thất bại:No registry configured
Nguyên nhân: Chưa có device token (chưa auth) hoặc cấu hình thiếu section registry: (tối thiểu registry.api_url).
Giải pháp:
- Thêm section
registry:vớiapi_urlvào file cấu hình:
registry:
api_url: "https://<registry-host>"- Xác thực:
blackhole-fwd auth --key "<API key>". - Kiểm tra log có
Authentication successful!vàConfiguration pushed to remote server successfully. - Chạy lại
blackhole-fwd configure push.
Xác minh:
blackhole-fwd auth --key "<API key>"; echo $?
# kỳ vọng: 0, và log/console có "Authentication successful!"
blackhole-fwd configure push; echo $?
# kỳ vọng: 0Nếu sau auth log vẫn cảnh báo Device is not active thì device chưa được duyệt ở trạng thái Active trên Registry, xem mục Không có dữ liệu.
Không nhận được dữ liệu
Service đã cài nhưng không có dữ liệu
Triệu chứng: Service ở trạng thái chạy (✅ Service is running), không có lỗi, nhưng không có sự kiện nào ra sink. Trong log lặp lại:
Device is not active, no collectors will be startedNguyên nhân: Cấu hình có section registry: nhưng device chưa được xác thực hoặc chưa ở trạng thái Active trên Registry. Khi đó Forwarder khởi động bình thường nhưng không start collector nào, không có gì để thu thập.
Giải pháp:
- Xác thực với API key:
blackhole-fwd auth --key "<API key>". - Xem log auth có
Device is not activekhông, nếu có, device chưa Active: mở Registry, đặt device về trạng tháiActive. - Khởi động lại service:
service stoprồiservice start. - Không dùng Registry thì xoá section
registry:, pipeline chạy hoàn toàn với cấu hình local.
Xác minh:
grep "Device is not active, no collectors will be started" logs/default.log | tail -1
# chỉ còn dòng trước thời điểm auth và restart
grep "Orchestrator started successfully" logs/default.log | tail -1
# có dòng mới
# kiểm tra dữ liệu thật ra sink (file sink ví dụ):
ls -l ./debug-events/ # tùy sink đang cấu hìnhSource không khởi động vì thiếu section server
Triệu chứng: Source khai báo trong sources nhưng không nhận data. Trong log có một trong các cảnh báo:
No rsyslog server configured, rsyslog collector will not be created
No SNMP server configured, SNMP collector will not be created
gRPC server configured but no gRPC sources defined; server will not be startedVới gRPC, dấu hiệu khác: không có gì listen trên cổng 50051 dù đã khai source grpc.
Nguyên nhân: rsyslog và snmp là source thụ động, chúng chỉ chạy khi có embedded server section tương ứng nhận kết nối. grpc_server thì chỉ khởi động khi có ít nhất một source grpc.
Giải pháp:
- Thêm section còn thiếu vào cấu hình:
rsyslog_server:cho sourcersyslog,snmp_server:cho sourcesnmp,grpc_server:cho sourcegrpc. - Với gRPC: đảm bảo có cả
grpc_servervà ít nhất một sourcetype: grpc. - Khởi động lại service, mọi section
*_serverkhông hot-reload. - Kiểm tra port đã mở theo bảng port.
Xác minh:
grep -E "No rsyslog server configured|No SNMP server configured|no gRPC sources defined" logs/default.log | tail -3
# không còn dòng mới sau khi thêm section
sudo ss -tulnp | grep -E ':(514|162|50051)'
# các port tương ứng đã có dòng LISTEN của blackhole-fwdMQTT source bị từ chối: No broker URL found
Triệu chứng: Khởi động thất bại, stderr (và journal khi chạy service) có:
No broker URL foundNguyên nhân: Source có type: mqtt nhưng không khai block broker: nên không có URL để kết nối. Lỗi xảy ra lúc start collector nên pipeline không chạy tiếp.
Giải pháp:
- Bổ sung
broker.urlcho source MQTT:
sources:
mqtt_in:
type: mqtt
broker:
url: "mqtt://<broker-host>:1883"
topics: ["agents/+/data"]- Kiểm tra lại URL đúng chuẩn (
mqtt://hoặcmqtts://) và broker có truy cập được từ máy Forwarder. - Khởi động lại (thay đổi source yêu cầu restart).
Xác minh:
# Tái hiện lúc còn lỗi, xem phần stderr:
blackhole-fwd start 2>&1 | grep "No broker URL found"
# kỳ vọng: in ra thông báo lỗi này
# Sau khi sửa:
grep "Started MQTT client" logs/default.log | tail -1
# kỳ vọng: dòng mới sau khi khởi động lạiDevice bị từ chối bởi device guard
Triệu chứng: Client gRPC kết nối tới Forwarder bị từ chối với permission_denied (device is disabled by supervisor guard), stream đang mở bị ngắt. Trong log có:
Terminating gRPC stream because device token <token> was disabled by supervisor guardNguyên nhân: Device guard là danh sách chặn token giữ trong bộ nhớ, cập nhật từ Registry theo trạng thái device. Device không ở trạng thái Active thì token bị đưa vào danh sách. Lưu ý: danh sách rỗng thì cho phép mọi token, đây là deny-list, không phải allow-list, và không có khóa YAML nào cấu hình nó.
Giải pháp:
- Ở Registry: đặt lại device đó về trạng thái
Active, token được gỡ khỏi deny-list ngay khi trạng thái thay đổi. - Với client đã bị ngắt stream: kết nối lại (stream cũ không tự phục hồi).
- Không cần khởi động lại Forwarder cho lần kiểm tra kế tiếp, nhưng cũng không có lệnh nào "mở chặn" từ phía Forwarder, mọi thứ đi theo trạng thái device ở Registry.
- Nếu token bị sai/thừa ở client: kiểm tra client gửi metadata
x-device-tokenđúng token của chính nó.
Xác minh:
grep "disabled by supervisor guard" logs/default.log | tail -5
# các dòng ngừng xuất hiện sau khi device chuyển sang Active
# thử lại kết nối gRPC từ client: không còn permission_deniedPort, tài nguyên và container
Port bị chiếm hoặc không mở
Triệu chứng: Đã khai section server đầy đủ nhưng ss/netstat không thấy port LISTEN, hoặc server khác báo address already in use. Hay gặp nhất với cổng 8080 (proxy), rất nhiều service web mặc định dùng 8080.
Nguyên nhân:
- Port đã bị process khác chiếm trước.
- Cổng đặc quyền (514, 162) nhưng process không chạy quyền root nên không bind được.
- Thiếu section server, xem Thiếu section server.
Giải pháp:
- Tìm process đang giữ port:
sudo ss -tulnp | grep -E ':(514|162|1883|50051|8080|18080)'- Dừng process kia, hoặc đổi địa chỉ bind của Forwarder trong section tương ứng (
proxy_server.addr,rsyslog_server.udp_addr/tcp_addr,snmp_server.trap_addr,mqtt_server.server.listen,grpc_server.listen_addr,registry.http_server.listen_addr), xem Embedded servers. - Với 514/162: chạy bằng quyền root (chế độ service đã là root).
- Khởi động lại service (mọi section server không hot-reload).
Xác minh:
sudo ss -tulnp | grep -E ':(514|162|1883|50051|8080|18080)'
# kỳ vọng: dòng LISTEN/udp gắn với process blackhole-fwdnetstat -an | findstr ":8080"
# kỳ vọng: dòng LISTENINGPipeline bị tạm dừng bởi resource guard
Triệu chứng: Forwarder vẫn là process sống nhưng ngừng nhận, xử lý và gửi đi một thời gian. Trong log:
PAUSING ORCHESTRATOR due to resource constraintsNguyên nhân: CPU hoặc memory vượt threshold_percentage (mặc định 80%) liên tục hết sustained_secs (mặc định 60 giây). Khi đó pipeline được tạm dừng: collector, transform, shipper dừng và queue được flush, event không bị drop và process không thoát. Disk mặc định tắt (ngưỡng 101.0).
Giải pháp:
- Xem mức sử dụng thực tế (
toptrên Linux, Task Manager trên Windows) và xử lý nguyên nhân (process chiếm tài nguyên, burst sự kiện…). - Hoặc nâng
resources_threshold.cpu.threshold_percentage/memory.threshold_percentagerồi khởi động lại (ngưỡng chỉ đọc lúc khởi động). - Không cần can thiệp nếu máy vừa hồi phục, pipeline tự chạy lại.
- Kiểm tra hàng đợi: event chưa gửi nằm trong database
blackhole-fwd.db, sẽ được gửi tiếp khi resume hoặc ở lần khởi động sau.
Xác minh:
grep -E "PAUSING ORCHESTRATOR|RESUMING ORCHESTRATOR" logs/default.log | tail -10
# kỳ vọng: sau khi resource hạ, có dòng
# "RESUMING ORCHESTRATOR - resources have stabilized"
pgrep -x blackhole-fwd
# process vẫn tồn tại suốt thời gian bị tạm dừngContainer không exec vào được
Triệu chứng: docker exec -it blackhole-fwd sh (hoặc bash, cat, ps) thất bại, ví dụ:
OCI runtime exec failed: exec failed: unable to start container process: exec: "sh": executable file not found in $PATHNguyên nhân: Image ghcr.io/gcsclabs/blackhole-forwarder build trên nền distroless: không có shell, không có package manager, không có tool gỡ rối, và chạy bằng user nonroot (uid 65532). Đây là hành vi bình thường, không phải lỗi.
Giải pháp:
- Đọc log bằng
docker logs:
docker logs -f blackhole-fwd
docker logs --tail 200 blackhole-fwd- Mount volume tại
/home/nonrootkhi chạy container, rồi đọc filelogs/default.logvà database ngay trên host. - Vẫn có thể exec thẳng executable (không cần shell):
docker exec blackhole-fwd /usr/local/bin/blackhole-fwd --version- Muốn thao tác shell thì dùng image build từ source với base khác (developer image), image sản phẩm không kèm shell.
Xác minh:
docker logs --tail 50 blackhole-fwd
# có log runtime, ví dụ "Orchestrator started successfully"
docker exec blackhole-fwd /usr/local/bin/blackhole-fwd --version
# in ra blackhole-fwd <phiên bản>Xem thêm
- ./overview - Forwarder là gì
- ./quickstart - Chạy lần đầu
- ./install - Cài đặt và cài service
- ./configuration - Tham chiếu cấu hình
- ./operation - Vận hành hằng ngày
- /components/agent/overview - Agent là gì
