iT邦幫忙

2023 iThome 鐵人賽

DAY 17
1
Cloud Native

時光之鏡:透視過去、現在與未來的 Observability系列 第 17

Vector — 速度至上的資料收集界新星

  • 分享至 

  • xImage
  •  

Logo

資訊處理流程 生成 收集 儲存 使用
Vector

Vector 是一款使用 Rust 所撰寫的高效能資料收集器,據稱其資料處理速度是市面上其他開源專案的 10 倍之多。Vector 可以從各種不同來源爬取資料,經過加工與篩選後,再將資料輸出至各式儲存服務,例如 Loki、Elasticsearch、Kafka、AWS S3、GCS、Azure、Datadog、StatsD、TCP、UDP、File 和 Console 等。由於其高度可擴展和彈性,Vector 不僅適用於 Log 資料,也能處理 Metrics 和 Traces。

Pipeline

Vector 最早由 Ben Johnson 創立的 Timber.io 在 2018 年開發,主要專注於 Log 處理。2020年,Timber.io 被 DataDog 收購,Vector 因此成為了 DataDog 的開源專案之一。

Concepts

Pipeline

Vector 的 Pipeline 主要分為三大階段:Source、Transform 和 Sink。

  1. Source:定義資料的來源,如 File、Kafka、Container Log 等。
  2. Transform:負責資料的加工和篩選,例如更改資料內容或移除不需要的 Log。
  3. Sink:指定資料輸出的目的地,如 Loki、Elasticsearch、Kafka、DataDog 等。

Vector Pipeline

Config

Vector 的 Config 可以使用 TOMLYAMLJSON 格式撰寫。若要確認設定檔的正確性,可以透過 Vector CLIvalidate 指令進行驗證。

sourcestransformssinks 都可以定義多個,再透過 inputs 串連不同的 Components 組成 Pipeline,例如以下範例:

  1. Demo Logs 作為 Source,生成假的 JSON 格式 Log。
  2. Filter 作為 transform,只保留 method 欄位為 GET 的資料。
  3. Console 作為 sink,將篩選過的資料輸出至 Console。
sources:
  my_demo_logs:
    type: demo_logs
    format: json
    decoding:
      codec: json # 使用 json codec 解析資料
    lines:
      - line1

transforms:
  my_demo_logs_get:
    type: filter
    condition: '.method == "GET"' # 使用 `.` 選取欄位
    inputs:
      - my_demo_logs # 這裡使用 my_demo_logs 作為 input

sinks:
  my_demo_stdout:
    type: console
    encoding:
      codec: json # 使用 json codec 輸出資料
    inputs:
      - my_demo_logs_get # 這裡使用 my_demo_logs_get 作為 input

Demo Pipeline

Lab

範例程式碼:17-vector

Quick Start

Basic

  1. 啟動所有服務

    docker-compose -f docker-compose.loki.yaml up -d
    
  2. 檢視服務

    1. Nginx: http://localhost:8080
      1. 瀏覽 Nginx 時會生成 Access Log
    2. Grafana: http://localhost:3000,登入帳號密碼為 admin/admin
      1. 點擊左上 Menu > Explore,左上 Data Source 選擇 Loki,在 Label Filter 中 Label 選擇 app,Value 選擇 nginx,即可看到 nginx Container 的 Log

      2. 若要生成更多 Log 也可以使用 k6 發送更多 Request

        k6 run --vus 1 --duration 300s k6-script.js
        
  3. 關閉所有服務

    docker-compose down
    

Container Log with Loki

  1. 啟動所有服務

    docker-compose -f docker-compose.loki.yaml up -d
    
  2. 檢視服務

    1. Nginx: http://localhost:8080
      1. 瀏覽 Nginx 時會生成 Access Log
    2. Grafana: http://localhost:3000,登入帳號密碼為 admin/admin
      1. 點擊左上 Menu > Explore,左上 Data Source 選擇 Loki,在 Label Filter 中 Label 選擇 container_name,Value 選擇 nginx,即可看到 nginx Container 的 Log

      2. 若要生成更多 Log 也可以使用 k6 發送更多 Request

        k6 run --vus 1 --duration 300s k6-script.js
        
  3. 關閉所有服務

    docker-compose down
    

Goals

Basic

  1. 建立 Vector
    1. 使用 Demo Logs 作為 source,生成假的 JSON 格式 Log
    2. 使用 Filter 作為 transform,只保留 methodGET 的資料
    3. 使用 Console 作為 sink,將資料輸出至 Console

Container Log with Loki

  1. 建立 Vector
    1. 使用 Docker Logs 作為 source,收集 Docker Container 的 Log,只篩選含有 logger=vector Label 的 Container
    2. 使用 Loki 作為 sink,將資料輸出至 Loki,移除不使用的 Field:container_created_atcontainer_idlabels,並使用 container_name 作為 Loki 的 Label
  2. 建立 Loki,負責收取 Vector 傳送的 Log
  3. 建立 Grafana,讀取 Loki 的資料
  4. 建立 Nginx,產生 Log

小結

Vector 以其出色的效能和靈活性贏得了眾多開發者的喜愛。大型企業與新創如 T-Mobile、Discord、Fastly、CVS 和 Visa 等都是 Vector 的使用者之一。其中,用量最大的使用者每天透過 Vector 處理超過 30TB 的資料。這些實例都證明了 Vector,儘管是一個相對年輕的開源專案,卻已具備應對大規模系統和生產環境的能力。此外,Red Hat 的 Kubernetes 產品 OpenShift文件也有介紹 Vector,推薦它作為 Fluentd 的替代方案。

因為 Logs 是歷史悠久的領域,所以有很多不同的工具可以選擇,在 Logs 系列中我們主要著重於 Loki 和資料收集工具。可以看到資料收集工具的設計理念大多都是以開放的生態系為主,不會限制最後輸出的服務,甚至也將可處理的資料放大到了 Metrics 與 Traces,這對於我們在打造系統時是一個很大的優勢,能夠選擇最適合我們當下情境的儲儲存服務。未來如果有新的儲存與使用工具出現時,也可以輕鬆的切換。

參考資料

  1. Centralized logs with Loki and Vector

上一篇
Fluent Bit — 資料收集界的萬能瑞士刀
下一篇
Traces — 看系統,一個兩個三個四個,連成線
系列文
時光之鏡:透視過去、現在與未來的 Observability30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言