Skip to content

Trước khi bắt đầu ​

Trang này dành cho vận hành hằng ngày: khởi động, dừng, đọc log, hot-reload, chặn tài nguyên, sao lưu và kiểm tra phiên bản. Cài đặt và cài service lần đầu xem ./install, chạy thử xem ./quickstart, tham chiếu từng trường cấu hình xem ./configuration.

Một vài điểm cần nhớ khi vận hành Agent:

  • Agent không mở port nào để nghe, không có endpoint giám sát, không có giao diện người dùng. Nó chỉ gửi dữ liệu đi.
  • Agent không có embedded server nên không mở port lắng nghe nào. Về transform: Agent vẫn nhận section transforms: trong file cấu hình, nhưng đây không phải vai trò chính của Agent — tham khảo danh sách transform để biết các loại và tham số.
  • Metric hệ thống (CPU, memory, disk) đến từ collector apm, đó là dữ liệu Agent gửi đi, không phải bề mặt giám sát của Agent.

Các lệnh dưới đây dùng tên binary blackhole-agt (Windows là .\blackhole-agt.exe). Khi làm việc với service, chạy terminal bằng quyền administrator/root.

Thao tácLệnh
Chạy foregroundblackhole-agt start
Cài và khởi động serviceblackhole-agt service install
Dừng serviceblackhole-agt service stop
Trạng thái serviceblackhole-agt service status
Xác thực với Registryblackhole-agt auth --key <KEY>
Xem phiên bảnblackhole-agt --version

Khởi động và dừng Agent ​

Chạy ở foreground ​

bash
# Linux, chạy trong thư mục chứa binary
./blackhole-agt start
powershell
# Windows (PowerShell)
.\blackhole-agt.exe start

Chỉ định file cấu hình bằng cờ toàn cục -c, đặt trước lệnh start:

bash
# Đặt trước lệnh start, thay bằng đường dẫn thực tế
./blackhole-agt -c /path/to/blackhole-agt.yml start
powershell
.\blackhole-agt.exe -c "D:\blackhole\blackhole-agt.yml" start

Không truyền -c thì Agent tìm file theo thứ tự: blackhole-agt.yml trong thư mục làm việc, rồi ./config.yml, rồi ./config.yaml.

⚠️
Nếu file tại đường dẫn `-c` không tồn tại, tiến trình dừng ngay trước khi chạy với thông báo:
text
Failed to read file for hashing: blackhole-agt.yml

Muốn log chi tiết hơn cho một lần chạy, dùng -v (tương đương --verbose), nó buộc logging.level sang debug cho lần chạy đó:

bash
./blackhole-agt -v start

Xác minh:

bash
pgrep -x blackhole-agt      # Linux, in ra PID của tiến trình
tail -n 20 logs/default.log  # thấy các dòng khởi động của pipeline
powershell
Get-Process blackhole-agt                          # Windows, có dòng trả về PID
Get-Content .\logs\default.log -Tail 20            # có dòng log mới

Kỳ vọng pgrep in ra một PID, Get-Process liệt kê process blackhole-agt, và logs/default.log có dòng mới.

Chạy như service ​

bash
./blackhole-agt service install    # cài đặt và khởi động luôn
./blackhole-agt service status
powershell
.\blackhole-agt.exe service install
.\blackhole-agt.exe service status

Tên service là blackhole-agt. Trên Linux, file unit là /etc/systemd/system/blackhole-agt.service với Restart=on-failure, cài service cần quyền root và systemd hoặc OpenRC.

⚠️
`service install` đã kèm thao tác khởi động, nên không cần chạy `service start` ngay sau đó.

Cài lại khi service đã tồn tại phải thêm --force, nếu không sẽ nhận:

text
Service already exists. Use --force to overwrite.
⚠️
`--config` truyền lúc `service install` **không được lưu lại**. Service được ghi nhận đúng dạng `blackhole-agt --service --service-name blackhole-agt` (lệnh gốc không kèm `--config`) và tự giải quyết file cấu hình từ thư mục của chính nó. Sau khi cài, muốn đổi cấu hình thì đặt file đúng chỗ process tìm, xem [Tìm cấu hình và thư mục làm việc](#tim-cau-hinh-va-thu-muc-lam-viec).
📝
Service chạy bằng root trên Linux hoặc LocalSystem trên Windows. Hiện chưa có cơ chế hạ quyền (privilege dropping), nên Agent có toàn quyền trên các file nó đọc và ghi. Hãy hạn chế quyền đọc file cấu hình vì trong đó có API key đăng ký thiết bị.

Xác minh:

bash
systemctl status blackhole-agt
powershell
Get-Service -Name blackhole-agt

Kỳ vọng Active: active (running) trên Linux hoặc Status: Running trên Windows, và log ghi nhận các collector đã khởi động.

Dừng Agent ​

Dừng foreground bằng Ctrl+C trong terminal, hoặc gửi tín hiệu kết thúc tới PID:

bash
kill -TERM $(pgrep -x blackhole-agt)
powershell
Stop-Process -Name blackhole-agt
⚠️
Dừng bằng `Ctrl+C` hoặc SIGTERM là một **fast stop**: collector và shipper dừng ngay nhưng **không flush**. Tin nhắn còn nằm trong hàng đợi cục bộ sẽ được gửi lại (redelivery) ở lần khởi động kế tiếp. Đừng coi đây là dừng sạch, dữ liệu không mất nhưng có thể đến muộn.

Dừng service:

bash
./blackhole-agt service stop
# Hoặc
sudo systemctl stop blackhole-agt
powershell
.\blackhole-agt.exe service stop
# Hoặc
Stop-Service -Name blackhole-agt

Agent không có lệnh khởi động lại service. Muốn khởi động lại thì service stop rồi service start, hoặc systemctl restart blackhole-agt trên Linux.

Xác minh:

bash
pgrep -x blackhole-agt || echo "da dung"    # kỳ vọng in ra "da dung"
systemctl status blackhole-agt              # kỳ vọng Active: inactive (dead)
powershell
Get-Service -Name blackhole-agt             # kỳ vọng Status: Stopped

Tìm cấu hình và thư mục làm việc ​

Gần như mọi đường dẫn runtime đều resolve tương đối so với thư mục làm việc:

  • Chạy foreground: thư mục bạn đứng khi gọi lệnh.
  • Chạy service: thư mục chứa binary, trên cả Windows service và systemd.

Xác định thư mục làm việc của service trên Linux:

bash
systemctl show blackhole-agt -p WorkingDirectory --value
# Hoặc đọc trực tiếp file unit
grep WorkingDirectory /etc/systemd/system/blackhole-agt.service

Kỳ vọng in ra thư mục chứa binary, tức là nơi bạn đặt file blackhole-agt.

Trên Windows, đối chiếu với thư mục chứa blackhole-agt.exe, rồi tìm file snapshot cấu hình được ghi bên cạnh file cấu hình đang dùng:

powershell
$exe = (Get-Process blackhole-agt).Path | Split-Path
Get-ChildItem -Path $exe -Recurse -Force -Filter ".blackhole-resolved.yaml"
bash
find . -name ".blackhole-resolved.yaml"

Kỳ vọng thấy một file .blackhole-resolved.yaml, thời điểm sửa đổi được cập nhật sau mỗi lần nạp lại cấu hình. File này nằm cạnh file cấu hình đang dùng, nên nó cũng là cách để biết Agent đang đọc file nào.

Các tập tin vận hành:

Tập tinVị tríÝ nghĩa
Cấu hình./blackhole-agt.yml trong thư mục làm việc, hoặc đường dẫn -cNguồn cấu hình chính
Snapshot cấu hình.blackhole-resolved.yaml cạnh file cấu hìnhBản đã resolve, ghi lại mỗi lần nạp
Local database./blackhole-agt.dbChứa hàng đợi tin nhắn bền vững
Log chính./logs/default.logLog của process
Log lỗi./logs/default-error.logLog lỗi riêng
JSON schema./config.jsonschema cạnh file cấu hìnhTạo bằng configure schema

Xác minh:

bash
ls -la blackhole-agt.yml blackhole-agt.db logs/
powershell
Get-ChildItem -Force blackhole-agt.yml, blackhole-agt.db, logs

Kỳ vọng thấy đủ ba mục, nếu thiếu file cấu hình thì đó là file mà start sẽ tìm đầu tiên.

Xem log ​

Cấu hình log ​

TrườngMặc địnhGhi chú
levelinfotrace, debug, info, warn, error, cả per-target như collectors=trace
dir./logsTương đối so với thư mục làm việc
filedefault.logLog chính
error_filedefault-error.logLog lỗi
max_size_mb10Tổng dung lượng, quyết định kích thước mỗi file rotation
📝

dir mặc định là ./logs, tức là trong thư mục làm việc. Agent không tự tạo một thư mục log riêng ở cấp hệ điều hành. Khi chạy service, thư mục làm việc là thư mục binary nên đường dẫn thực tế là <thư-mục-binary>\logs\default.log trên Windows và $(WorkingDirectory)/logs/default.log trên systemd. Dùng lệnh ở mục Tìm cấu hình và thư mục làm việc để xác nhận.

Xem log trực tiếp ​

bash
WD=$(systemctl show blackhole-agt -p WorkingDirectory --value)
ls -lh "$WD/logs"
tail -f "$WD/logs/default.log"
grep -E "ERROR|WARN" "$WD/logs/default-error.log"
powershell
$exe = (Get-Process blackhole-agt).Path | Split-Path
Get-ChildItem "$exe\logs"
Get-Content "$exe\logs\default.log" -Tail 50 -Wait
Select-String -Path "$exe\logs\default-error.log" -Pattern "ERROR|WARN"
⚠️
Ở chế độ service, stdout bị tắt nên **file log là nơi duy nhất** có output của Agent. `journalctl -u blackhole-agt` chỉ chứa tin nhắn khởi động của systemd, không chứa log ứng dụng. Agent cũng không đăng ký nguồn Windows Event Log nào, nên mở Event Viewer sẽ không thấy dữ liệu của Agent.

Mức log và verbose ​

Đổi logging.level trong file cấu hình rồi nạp lại theo hot-reload, hoặc chạy với -v để buộc debug trong lần chạy đó.

bash
./blackhole-agt -v start
grep -c "DEBUG" logs/default.log

Kỳ vọng số lớn hơn 0. Với logging.level mặc định là info và không chạy -v, kết quả là 0.

Dung lượng và rotation ​

Rotation luôn bật, không có công tắc tắt.

LogSố file rotationDung lượng mỗi file
default.log5max_size_mb / 5, mặc định 10 MB nên mỗi file khoảng 2 MB
default-error.log10max_size_mb, mặc định 10 MB nên tổng có thể tới khoảng 100 MB

Xác minh:

bash
du -sh logs/
ls -lh logs/
powershell
$exe = (Get-Process blackhole-agt).Path | Split-Path
Get-ChildItem "$exe\logs" | Measure-Object -Property Length -Sum

Kỳ vọng tổng dung lượng nhóm default.log* dừng lại quanh mức max_size_mb, còn nhóm default-error.log* có thể lớn hơn gấp nhiều lần vì mỗi file riêng đã bằng max_size_mb.

Khi process chết bất thường ​

Bản release được build với panic = "abort" và không giữ ký hiệu symbol, nên khi process chết vì lỗi nội bộ sẽ không có backtrace nào được in ra. Các dòng log cuối cùng là bằng chứng duy nhất.

powershell
Get-Content "$exe\logs\default-error.log" -Tail 30
bash
tail -n 30 "$WD/logs/default-error.log"

Hot-reload ​

Agent phát hiện thay đổi cấu hình local bằng cách poll SHA-256 mỗi hot_reload.poll_interval_ms (mặc định 5000 ms), kèm debounce_ms 1000 ms, và enabled mặc định là true. Không dùng inotify, không có tín hiệu SIGHUP.

Sửa file cấu hình local làm được gì ​

  1. Đọc lại file cấu hình vào bộ nhớ của process đang chạy.
  2. Ghi lại snapshot .blackhole-resolved.yaml.
  3. Ghi log Local config reloaded successfully.
⚠️
Hot-reload local **không dựng lại collector, transform hay sink nào đang chạy**. Nó chỉ nạp cấu hình vào bộ nhớ. Sửa file cấu hình local vì vậy không làm pipeline dùng cấu hình mới, muốn áp dụng cho pipeline thì phải restart service hoặc chạy lại ở foreground. Đây là điểm dễ hiểu nhầm nhất khi vận hành.

Nếu file mới không parse được hoặc không validate, Agent ghi warning và tiếp tục chạy với cấu hình cũ.

Các trường hợp khác ​

Tình huốngKết quả
Nguồn cấu hình đang dùng là RegistryChỉnh local bị bỏ qua hoàn toàn, log Remote config is active — ignoring local config change
Update đẩy từ RegistryThực hiện diff theo identifier, thêm, gỡ hoặc restart từng component riêng lẻ
File local mới sai cú pháp hoặc sai validationWarning, giữ nguyên cấu hình cũ, process không dừng

Không hot-reload được, bắt buộc restart ​

SectionLý do
loggingĐã áp ngay khi process khởi động
hot_reloadChính cài đặt poll này
registryKết nối với Registry dựng lúc khởi động
resources_thresholdNgưỡng chỉ đọc một lần lúc khởi động
channel_buffersKích thước channel dựng lúc khởi động

Những section này không được áp dụng khi đang chạy, dù chỉnh local hay nhận từ Registry.

Xác minh:

bash
tail -f logs/default.log | grep -E "Local config reloaded|Remote config is active"

Chỉnh file cấu hình (thêm một dòng chú thích là đủ) và chờ khoảng 6 giây, kỳ vọng thấy Local config reloaded successfully, đồng thời không có dòng nào báo restart component, vì pipeline vẫn giữ cấu hình cũ.

Chặn tài nguyên (resource guard) ​

Agent theo dõi CPU, memory và disk theo section resources_threshold:

Thông sốMặc địnhGhi chú
cpu.threshold_percentage80.0Bật giám sát CPU
memory.threshold_percentage80.0Bật giám sát memory
disk.threshold_percentage101.0Trên 100 nên giám sát disk bị tắt mặc định
sustained_secs60Thời gian vượt ngưỡng liên tục trước khi tạm dừng
check_interval10Chu kỳ kiểm tra, tính bằng giây

Một metric chỉ được bật khi threshold_percentage <= 100. Cú pháp cấu hình chi tiết xem ./configuration.

Tại thời điểm khởi động ​

Nếu một metric đang bật có giá trị tại hoặc trên ngưỡng, Agent từ chối khởi động:

text
Startup blocked due to resource constraints: CPU usage (x%) is at or above threshold (80.00%)

Lỗi được đưa ra ở mức cao hơn:

text
Cannot start orchestrator: system resources are overloaded.

Xác minh:

bash
grep -E "Startup blocked|Cannot start orchestrator" logs/default.log
./blackhole-agt service status

Kỳ vọng thấy dòng lỗi trong log và service ở trạng thái failed hoặc dừng.

Trong lúc đang chạy ​

Khi một metric bật vượt ngưỡng liên tục đủ sustained_secs (60 giây), guard tạm dừng pipeline: tất cả collector, transform và shipper dừng, hàng đợi bền vững được flush. Sự kiện không bị drop và process không thoát.

Khi tài nguyên ổn định trở lại ​

Agent khởi động lại các component và ghi log:

text
RESUMING ORCHESTRATOR - resources have stabilized

Nhận biết pipeline đang tạm dừng ​

  • service status vẫn báo process đang chạy, vì process không thoát.
  • Log không còn ghi nhận hoạt động của collector và shipper.
  • Tìm dòng vượt ngưỡng và dòng resume trong log:
bash
grep -E "Startup blocked|RESUMING ORCHESTRATOR" logs/default.log

Kỳ vọng sau khi tải hạ, log xuất hiện RESUMING ORCHESTRATOR - resources have stabilized và dữ liệu tiếp tục được gửi từ hàng đợi.

Kết nối Registry và xác thực ​

Xác thực ​

bash
./blackhole-agt auth --key "<API_KEY>"

Lệnh này cần section registry: với ít nhất api_url, thiếu thì báo No registry configured. Khi thành công, Agent đăng ký thiết bị rồi đẩy cấu hình local lên Registry.

Xác minh:

bash
./blackhole-agt auth --key "<API_KEY>"
./blackhole-agt configure push

Kỳ vọng không có lỗi. Nếu đẩy cấu hình trước khi xác thực, bạn sẽ nhận device token not available, you need to authenticate first.

Hành vi khi registry: đã cấu hình ​

Tình huốngHành viLog
Chưa xác thựcProcess chạy nhưng không start collector nàoDevice is not active, no collectors will be started
Registry không liên lạc được lúc khởi độngWarning, tiếp tục chạy với cấu hình localDòng warning kết nối
Sau khởi độngRetry theo interval, process không bao giờ thoát vì lỗi RegistryDòng warning lặp lại

Xác minh:

bash
grep -E "Device is not active|no collectors" logs/default.log

Nếu gặp dòng này nghĩa là Agent đang chạy nhưng không thu thập gì, hãy chạy lại auth --key rồi restart.

Cấu hình từ xa ​

bash
# Tải cấu hình từ Registry và ghi ra file để kiểm tra
./blackhole-agt configure pull --output ./pulled-config.yml

# Không truyền --output thì cấu hình được lưu nội bộ, không có file nào được ghi
./blackhole-agt configure pull

# Đẩy cấu hình local lên Registry, cần đã auth
./blackhole-agt configure push

# Tạo JSON schema cạnh file cấu hình
./blackhole-agt configure schema

Xác minh:

bash
./blackhole-agt configure pull --output ./pulled-config.yml
ls -l pulled-config.yml        # file tồn tại, có dung lượng

Kỳ vọng lệnh in Configuration file pulled to: <đường dẫn>. Khi chạy configure pull không có --output, log là Remote configuration pulled and persisted (no output file requested). Với configure schema, kiểm tra config.jsonschema nằm cạnh file cấu hình:

bash
ls -l config.jsonschema

Backup và khôi phục ​

Nội dung cần sao lưu ​

Thành phầnĐường dẫnGhi chú
File cấu hình./blackhole-agt.yml hoặc đường dẫn -cBắt buộc
Snapshot cấu hình.blackhole-resolved.yamlTự ghi lại khi chạy, optional
Local database./blackhole-agt.dbChứa hàng đợi tin nhắn
JSON schema./config.jsonschemaTạo lại được bằng configure schema

Dừng service trước khi sao lưu database, vì file này đang được ghi liên tục.

Sao lưu ​

Chạy các lệnh trong thư mục làm việc của Agent, tức là thư mục chứa binary.

powershell
.\blackhole-agt.exe service stop
New-Item -ItemType Directory -Force -Path ".\backup" | Out-Null
Copy-Item ".\blackhole-agt.yml" ".\backup\blackhole-agt.yml.$(Get-Date -Format yyyyMMdd)"
Copy-Item ".\blackhole-agt.db" ".\backup\blackhole-agt.db" -Recurse
.\blackhole-agt.exe service start
bash
./blackhole-agt service stop
tar -czf ~/blackhole-backup-$(date +%Y%m%d).tar.gz blackhole-agt.yml blackhole-agt.db
./blackhole-agt service start

Xác minh:

powershell
Get-ChildItem .\backup
bash
tar -tzf ~/blackhole-backup-$(date +%Y%m%d).tar.gz
./blackhole-agt service status

Kỳ vọng thấy file cấu hình và database trong bản sao lưu, service chạy lại bình thường sau khi start.

Khôi phục ​

Chạy trong thư mục làm việc của Agent:

bash
./blackhole-agt service stop
tar -xzf ~/blackhole-backup-20250101.tar.gz -C .
./blackhole-agt service start
powershell
.\blackhole-agt.exe service stop
Copy-Item ".\backup\blackhole-agt.yml" ".\blackhole-agt.yml" -Force
Copy-Item ".\backup\blackhole-agt.db" ".\blackhole-agt.db" -Recurse -Force
.\blackhole-agt.exe service start
📝
Hàng đợi tin nhắn nằm trong `blackhole-agt.db`. Khôi phục database cũ nghĩa là lấy lại hàng đợi tại thời điểm backup, nên một số tin nhắn có thể bị gửi lại và tin nhắn sau thời điểm backup có thể mất. Hãy ưu tiên sao lưu file cấu hình, database chỉ cần backup khi có yêu cầu cụ thể.

Xác minh:

bash
./blackhole-agt service status
tail -f logs/default.log

Kỳ vọng service ở trạng thái chạy và log ghi nhận các collector khởi động lại với cấu hình vừa khôi phục.

Nâng cấp binary ​

bash
./blackhole-agt service stop
# sao lưu cấu hình như trên, rồi thay binary trong thư mục cài đặt
./blackhole-agt service start
./blackhole-agt --version

Kỳ vọng lệnh cuối in ra phiên bản mới. Agent không có chức năng tự cập nhật từ xa, nên việc thay binary luôn làm thủ công.

Kiểm tra phiên bản ​

bash
blackhole-agt --version
# Hoặc
blackhole-agt -V

Kỳ vọng in ra phiên bản của binary đang dùng. Đối chiếu với phiên bản trong ./install trước khi nâng cấp, và đính kèm phiên bản này khi báo lỗi theo ./troubleshooting.

bash
blackhole-agt --help

Kỳ vọng in ra danh sách lệnh đầy đủ: configure, service, auth, start. Nếu lệnh bạn định dùng không có trong danh sách, nghĩa là lệnh đó không tồn tại.

Xem thêm ​

Released under the MIT License.