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 可以使用 TOML、YAML 或 JSON 格式撰寫。若要確認設定檔的正確性,可以透過 Vector CLI 的 validate 指令進行驗證。

sources、transforms 和 sinks 都可以定義多個,再透過 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,只保留 method 為 GET 的資料
    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_at、container_id、labels,並使用 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 — 看系統,一個兩個三個四個,連成線
系列文
時光之鏡:透視過去、現在與未來的 Observability 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言