Vector 是一款以 Rust 撰寫的高效能資料收集器,官方宣稱資料處理速度可達同類開源專案的十倍。它不限於 Log,從 Metrics 到 Traces 同樣能處理,能對接的儲存與輸出包含 Loki、Elasticsearch、Kafka、AWS S3、Google Cloud Storage、Azure、Datadog、StatsD、TCP、UDP、檔案與 Console,覆蓋面相當廣。
Vector 最早於 2018 年由 Ben Johnson 創立的 Timber.io 開發,主要關注 Log 處理。2020 年 Timber.io 被 Datadog 收購,Vector 也正式成為 Datadog 旗下的開源專案之一。
核心概念#
Pipeline#
Vector 的 Pipeline 由三個角色組成:
- Source:定義資料的來源,例如檔案、Kafka、Container Log。
- Transform:負責資料加工與篩選,例如修改欄位、移除不需要的事件。
- Sink:指定資料輸出的目的地,例如 Loki、Elasticsearch、Kafka、Datadog。
一條完整的 Pipeline 就是把多個 Source、Transform、Sink 透過 inputs 串接起來;Vector 也允許 Sink 接收多個來源,或一個 Source 同時被多條 Transform 使用。
Config#
Vector 支援以 TOML、YAML 或 JSON 撰寫設定檔,並提供 Vector CLI 的 validate 指令做語法與語意檢查。多組 sources、transforms、sinks 之間用 inputs 欄位串接,形成一張小型 DAG。
以下範例展示三段 Pipeline 的串連:
- Source:用 Demo Logs 產生假的 JSON 格式資料。
- Transform:用 Filter 只保留
method欄位為GET的事件。 - Sink:用 Console 把篩選後的事件輸出到標準輸出。
sources:
my_demo_logs:
type: demo_logs
format: json
decoding:
codec: json
lines:
- line1
transforms:
my_demo_logs_get:
type: filter
condition: '.method == "GET"'
inputs:
- my_demo_logs
sinks:
my_demo_stdout:
type: console
encoding:
codec: json
inputs:
- my_demo_logs_get在 Vector 中,元件的「相依關係」是透過
inputs欄位顯式宣告的,而不是依賴設定檔的撰寫順序。這讓你可以把同一個 Source 同時餵給多個 Transform,或讓多個 Transform 匯入同一個 Sink,組出較複雜的處理流程。
Lab 重點#
原文 Lab 提供兩組情境,可作為動手練習的方向:
- Basic:以 Demo Logs 為 Source 產生假資料,用 Filter Transform 留下
method為GET的事件,再透過 Console Sink 輸出。 - Container Log with Loki:以 Docker Logs 為 Source 收 Container Log,僅篩選帶有
logger=vectorLabel 的 Container;透過 Loki Sink 寫入 Loki,過程中移除container_created_at、container_id、labels等不需要的欄位,並以container_name作為 Loki 的 Label。
小結#
Vector 在效能與彈性上都很搶眼,已被 T-Mobile、Discord、Fastly、CVS、Visa 等企業採用,最大用量的客戶每日吞吐量超過 30TB。Red Hat OpenShift 的官方文件也將 Vector 列為 Fluentd 的替代方案,反映出社群對其穩定度的信心。
回頭看整個 Logs 篇,可以發現一個共同主題:資料收集工具普遍走向「開放、不綁定後端」的設計哲學,並把支援範圍擴展到 Metrics 與 Traces。對使用者而言,這代表更高的選擇彈性,也讓未來在切換儲存與分析工具時,不必把整套 Pipeline 推翻重建。
原文出處#
- 原書/iThome:https://ithelp.ithome.com.tw/articles/10332767