Tổng quan.
Timber.io Vector là một công cụ thu thập, xử lý và chuyển tiếp dữ liệu log và metric. Nó được thiết kế để xây dựng các pipeline dữ liệu quy mô lớn, đơn giản và đáng tin cậy. Vector cung cấp một API đơn giản nhưng mạnh mẽ cho việc xây dựng các đường ống dữ liệu tùy chỉnh, cho phép bạn chọn từ nhiều nguồn, biến đổi và đích.
Tên chính xác của công cụ này là “Vector”, nhưng nó thường được gọi là “Timber.io Vector” để chỉ rõ rằng nó là một sản phẩm của công ty Timber.io.
Timber.io Vector và Filebeat.
Cả Timber.io Vector và Filebeat đều là công cụ thu thập log, nhưng chúng có một số khác biệt quan trọng.
Filebeat, một sản phẩm của Elastic, được thiết kế để thu thập và gửi log đến Elasticsearch hoặc Logstash. Nó nhẹ nhàng, dễ cài đặt và cấu hình và tốt cho việc thu thập log từ các file log trên hệ thống.
Trong khi đó, Timber.io Vector không chỉ thu thập log mà còn có khả năng xử lý và chuyển tiếp dữ liệu log và metric. Vector cung cấp một API mạnh mẽ hơn cho việc xây dựng các pipeline dữ liệu tùy chỉnh, cho phép bạn chọn từ nhiều nguồn, biến đổi và đích.
Vì vậy, trong khi cả hai đều có chức năng thu thập log, Vector cung cấp một tập hợp các chức năng mạnh mẽ và linh hoạt hơn so với Filebeat.
Nền tảng hỗ trợ.
Timber.io Vector hỗ trợ đẩy log qua nhiều nền tảng khác nhau. Dưới đây là một số nền tảng mà Vector hỗ trợ:
- Amazon S3: Vector có thể đẩy log đến một bucket S3.
- Apache Kafka: Vector có thể đẩy log đến một topic Kafka.
- ClickHouse: Vector có thể đẩy log đến một bảng ClickHouse.
- Console: Vector có thể in log ra console.
- Elasticsearch: Vector có thể đẩy log đến một index Elasticsearch.
- Google Cloud Storage: Vector có thể đẩy log đến một bucket GCS.
- HTTP: Vector có thể đẩy log qua một endpoint HTTP.
- Prometheus: Vector có thể đẩy metric đến một Prometheus server.
- Datadog: Vector có thể đẩy log và metric đến Datadog.
Và nhiều nền tảng khác. Bạn có thể tham khảo danh sách đầy đủ tại trang web chính thức của Vector.
Phương thức hỗ trợ.
Timber.io Vector hỗ trợ nhiều phương thức để đẩy log, bao gồm:
- TCP: Vector có thể đẩy log qua kết nối TCP.
- UDP: Vector cũng hỗ trợ đẩy log qua kết nối UDP.
- HTTP: Vector có thể đẩy log qua một endpoint HTTP.
- gRPC: Vector hỗ trợ đẩy log qua gRPC.
- Kafka: Vector có thể đẩy log đến một topic Kafka.
- File: Vector có thể ghi log vào một file trên hệ thống.
Điều này giúp Vector linh hoạt và có thể sử dụng trong nhiều môi trường và cấu hình khác nhau.
Vector cũng hoạt động chia làm 3 bước chính như Logtash.
Vector hoạt động tương tự như Logstash trong việc xử lý log với ba bước chính: input, filter (hoặc transform trong trường hợp của Vector) và output.
- Input (Nguồn): Vector nhận log từ một hoặc nhiều nguồn. Nguồn có thể là các file log, các socket, các endpoint HTTP, v.v.
- Filter/Transform (Biến đổi): Vector sau đó xử lý và biến đổi log. Điều này có thể bao gồm việc thêm, xóa, hoặc thay đổi các trường, hoặc thực hiện các biến đổi phức tạp hơn như việc phân tích cú pháp log.
- Output (Điểm đích): Cuối cùng, Vector đẩy log đã được xử lý đến một hoặc nhiều điểm đích. Điểm đích có thể là các hệ thống lưu trữ log như Elasticsearch, các dịch vụ log dựa trên cloud như AWS CloudWatch, hoặc các hệ thống xử lý sự kiện như Kafka.
Ví dụ cho cấu đẩy log theo phương thức TCP.
Khi bạn cấu hình một sink Kafka trong Vector, mặc định nó sẽ sử dụng phương thức TCP để giao tiếp với Kafka bootstrap server. Điều này được xác định bởi cách Kafka hoạt động: Kafka sử dụng TCP như là giao thức mạng cơ bản để truyền dữ liệu giữa các client và server.
Trong cấu hình này bootstrap_servers = "10.14.22.123:9092"
chỉ định rằng Vector nên kết nối đến Kafka server tại địa chỉ IP 10.14.22.123
và cổng 9092
sử dụng TCP.
Dưới đây là cách cấu hình Vector để đọc log từ /var/log/auth.log
và đẩy chúng đến một topic Kafka.
[sources.my_source]
type = "file" # specifies that the source should be a file
include = ["/var/log/auth.log"] # specifies the path to the log file
[transforms.my_transform]
type = "remap" # specifies that the transform should be a remap
inputs = ["my_source"] # specifies the data source
source = '''
.host = get_hostname()
.timestamp = now()
''' # adds the host and timestamp fields to each event
[sinks.my_sink]
type = "kafka" # specifies that the sink should be kafka
inputs = ["my_transform"] # specifies the data source
bootstrap_servers = "10.14.22.123:9092" # specifies the kafka bootstrap server
topic = "my_topic" # specifies the kafka topic
Trong cấu hình này, my_source
là một nguồn dữ liệu đọc từ /var/log/auth.log
, my_transform
là một biến đổi thêm các trường host và timestamp vào mỗi sự kiện và my_sink
là một sink gửi dữ liệu đến một topic Kafka.
Dưới đây là giải thích chi tiết cho từng block trong cấu hình Vector:
[sources.my_source]
: Block này định nghĩa một nguồn dữ liệu. Trong trường hợp này, nguồn dữ liệu là một file.type = "file"
: Định nghĩa rằng nguồn dữ liệu này là một file.include = ["/var/log/auth.log"]
: Đường dẫn đến file log mà Vector sẽ đọc.
[transforms.my_transform]
: Block này định nghĩa một biến đổi dữ liệu. Trong trường hợp này, biến đổi là thêm các trường host và timestamp vào mỗi sự kiện log.type = "remap"
: Định nghĩa rằng biến đổi này sẽ thay đổi cấu trúc của dữ liệu.inputs = ["my_source"]
: Định nghĩa rằng dữ liệu đầu vào cho biến đổi này sẽ đến từ nguồn “my_source”.source
: Định nghĩa cách thay đổi cấu trúc dữ liệu. Trong trường hợp này, nó thêm các trường host và timestamp vào mỗi sự kiện.
[sinks.my_sink]
: Block này định nghĩa một điểm đích cho dữ liệu. Trong trường hợp này, điểm đích là một topic Kafka.type = "kafka"
: Định nghĩa rằng điểm đích này là một topic Kafka.inputs = ["my_transform"]
: Định nghĩa rằng dữ liệu đầu vào cho điểm đích này sẽ đến từ biến đổi “my_transform”.bootstrap_servers = "10.14.22.123:9092"
: Địa chỉ của Kafka bootstrap server.topic = "my_topic"
: Tên của topic Kafka mà dữ liệu sẽ được gửi đến.
Vector không hỗ trợ trực tiếp việc đẩy log đến Kafka qua UDP hoặc HTTP API.
Vector không hỗ trợ trực tiếp việc đẩy log đến Kafka qua UDP hoặc HTTP API. Kafka sử dụng giao thức TCP riêng của mình để giao tiếp giữa các client và server và Vector tuân thủ theo điều này.
Tuy nhiên, bạn có thể cấu hình Vector để nhận log qua UDP hoặc HTTP API từ các nguồn khác, sau đó đẩy chúng đến Kafka.
Dưới đây là các ví dụ:
Nhận log qua UDP, sau đó đẩy đến Kafka:
[sources.my_source]
type = "socket" # specifies that the source should be a socket
mode = "udp" # specifies that the socket should use UDP
address = "0.0.0.0:9000" # specifies the address and port to listen on
[transforms.my_transform]
type = "remap"
inputs = ["my_source"]
source = '''
.host = get_hostname()
.timestamp = now()
'''
[sinks.my_sink]
type = "kafka"
inputs = ["my_transform"]
bootstrap_servers = "10.14.22.123:9092"
topic = "my_topic"
Nhận log qua HTTP API, sau đó đẩy đến Kafka:
[sources.my_source]
type = "http" # specifies that the source should be an HTTP endpoint
address = "0.0.0.0:9000" # specifies the address and port to listen on
[transforms.my_transform]
type = "remap"
inputs = ["my_source"]
source = '''
.host = get_hostname()
.timestamp = now()
'''
[sinks.my_sink]
type = "kafka"
inputs = ["my_transform"]
bootstrap_servers = "10.14.22.123:9092"
topic = "my_topic"
Trong cả hai ví dụ trên, Vector sẽ lắng nghe log từ một socket UDP hoặc một endpoint HTTP, sau đó thêm các trường host và timestamp vào mỗi sự kiện log và cuối cùng đẩy chúng đến một topic Kafka.
Điều này là do Kafka sử dụng giao thức TCP riêng của mình để giao tiếp giữa các client và server. Vector tuân thủ theo điều này và sử dụng TCP để đẩy log đến Kafka, bất kể nó nhận log từ nguồn nào.