Friday, September 20, 2024

Bộ ba quyền lực OpenTelemetry, ELK, Kafka cho việc thu thập và phân tích dữ liệu

-

1. Tổng quan.

Bài viết này tôi sẽ giúp bạn hiểu rõ hơn về OpenTelemetry, ELK, Kafka và sự so sánh giữa OpenTelemetry với Filebeat.

2. OpenTelemetry là gì?

OpenTelemetry là một dự án mã nguồn mở nhằm cung cấp một bộ công cụ và API chuẩn hóa để thu thập và xuất các telemetry data (dữ liệu đo lường) từ các hệ thống phân tán. Telemetry data bao gồm logs (log), metrics (thống kê) và traces (trace). OpenTelemetry giúp các nhà phát triển dễ dàng thêm vào các công cụ thu thập dữ liệu vào ứng dụng của họ, đồng thời cung cấp một cách thức thống nhất để gửi dữ liệu đến các hệ thống back-end khác nhau, chẳng hạn như ELK.

3. ELK là gì?

ELK là viết tắt của ElasticSearch, Logstash và Kibana. Đây là một bộ công cụ mạnh mẽ được sử dụng rộng rãi để thu thập, phân tích và trực quan hóa dữ liệu log.

  • ElasticSearch: Một hệ cơ sở dữ liệu NoSQL phân tán, được sử dụng để lưu trữ và tìm kiếm dữ liệu log với tốc độ cao.
  • Logstash: Một công cụ để thu thập, lọc và chuyển đổi dữ liệu log trước khi đưa vào ElasticSearch.
  • Kibana: Một giao diện người dùng web mạnh mẽ để trực quan hóa dữ liệu trong ElasticSearch, tạo các dashboard và thực hiện các truy vấn phức tạp.

4. Kafka là gì?

Kafka là một hệ thống truyền thông tin theo chủ đề phân tán, được sử dụng để xây dựng các ứng dụng xử lý luồng dữ liệu ở quy mô lớn. Kafka thường được sử dụng để truyền các telemetry data từ các ứng dụng đến các hệ thống back-end khác như ELK.

5. So sánh OpenTelemetry và Filebeat.

  • Filebeat: Là một agent nhẹ, được sử dụng để thu thập dữ liệu log từ các file trên hệ thống và gửi đến các hệ thống như ElasticSearch. Filebeat có cấu hình đơn giản và dễ sử dụng, nhưng lại có khả năng tùy biến hạn chế hơn so với OpenTelemetry.
  • OpenTelemetry: Là một giải pháp toàn diện hơn, cho phép thu thập không chỉ log mà còn metrics và traces. OpenTelemetry cung cấp nhiều khả năng tùy biến hơn và có thể tích hợp với nhiều hệ thống back-end khác nhau.

6. Khi nào nên sử dụng OpenTelemetry và khi nào nên sử dụng Filebeat?

  • Sử dụng Filebeat khi:
    • Bạn chỉ cần thu thập dữ liệu log từ các file.
    • Bạn cần một giải pháp đơn giản và dễ cài đặt.
    • Bạn không cần các tính năng nâng cao như phân bố trace hay thu thập metrics.
  • Sử dụng OpenTelemetry khi:
    • Bạn cần một giải pháp toàn diện để thu thập và xuất các telemetry data.
    • Bạn muốn có nhiều khả năng tùy biến và tích hợp với các hệ thống khác.
    • Bạn đang xây dựng các ứng dụng phân tán và cần theo dõi hiệu năng của chúng.

7. Kiến trúc điển hình.

Một kiến trúc điển hình bao gồm OpenTelemetry, ELK và Kafka có thể trông như sau:

  • OpenTelemetry SDK: Được cài đặt trong các ứng dụng để thu thập telemetry data.
  • OpenTelemetry Collector: Nhận dữ liệu từ các SDK và chuyển tiếp đến các back-end khác nhau.
  • Kafka: Nhận dữ liệu từ OpenTelemetry Collector và lưu trữ dưới dạng các topic.
  • Filebeat: Đọc dữ liệu từ các topic Kafka và gửi đến Logstash.
  • Logstash: Phân tích và chuẩn hóa dữ liệu trước khi đưa vào ElasticSearch.
  • ElasticSearch: Lưu trữ dữ liệu.
  • Kibana: Trực quan hóa dữ liệu.

8. Ví dụ triển khai cơ bản về OpenTelemetry, ELK, Kafka.

8.1 Trên Server (10.237.7.81)

Dưới đây là một ví dụ về cấu hình cho otel-collector-config.yml, được thiết kế để thu thập log từ file /var/log/auth.log trên các server và gửi chúng đến Kafka. Lưu ý rằng cấu hình cụ thể có thể cần được điều chỉnh tùy thuộc vào yêu cầu và môi trường cụ thể của bạn.

cat > otel-collector-config.yml << 'OEF'
receivers:
  filelog:
    include: ["/var/log/auth.log"]
    start_at: beginning

exporters:
  kafka:
    brokers:
      - 10.237.7.81:9092
    topic: auth-logs
    encoding: otlp_proto

service:
  pipelines:
    logs:
      receivers: [filelog]
      exporters: [kafka]
OEF

Giải thích cấu hình:

  • Receivers: Phần này cấu hình filelog để thu thập log từ file /var/log/auth.logstart_at: beginning chỉ định rằng việc thu thập sẽ bắt đầu từ đầu file. 
  • Exporters: Định nghĩa kafka exporter để gửi log đến Kafka. Bạn cần chỉ định địa chỉ của broker Kafka (10.237.7.81:9092 trong trường hợp này) và topic mà bạn muốn gửi log đến (auth-logs).
  • Service: Định nghĩa pipeline từ receivers đến exporters. Trong trường hợp này, pipeline xử lý log, sử dụng filelog làm receiver và kafka làm exporter.

Stack dưới đây được sử dụng Kafka để thu thập dữ liệu log, Logstash để xử lý và chuyển dữ liệu đó vào Elasticsearch, nơi dữ liệu được lưu trữ và có thể được truy vấn hoặc trực quan hóa bằng Kibana. OpenTelemetry Collector được sử dụng để thu thập và chuyển tiếp dữ liệu quan sát, có thể bao gồm metrics, traces và logs từ các ứng dụng và hạ tầng.

cat > docker-compose.yml << 'OEF'
version: '3.7'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka:
    image: wurstmeister/kafka
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: 10.237.7.81
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.9.3
    environment:
      - discovery.type=single-node
    ports:
      - "9200:9200"
      - "9300:9300"
  logstash:
    image: docker.elastic.co/logstash/logstash:7.9.3
    volumes:
      - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
    depends_on:
      - elasticsearch
  kibana:
    image: docker.elastic.co/kibana/kibana:7.9.3
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch
  opentelemetry-collector:
    image: otel/opentelemetry-collector-contrib
    command: ["--config=/etc/otel-collector-config.yml"]
    volumes:
      - ./otel-collector-config.yml:/etc/otel-collector-config.yml
      - /var/log/auth.log:/var/log/auth.log
    depends_on:
      - kafka
OEF

Trong đó:

  • Zookeeper: Dùng cho quản lý cluster Kafka.
  • Kafka: Một hệ thống xử lý stream dữ liệu, được cấu hình để quảng cáo địa chỉ host là 10.237.7.81 và kết nối với Zookeeper.
  • Elasticsearch: Một công cụ tìm kiếm và phân tích dữ liệu phân tán, được cấu hình để chạy như một node đơn.
  • Logstash: Dùng để xử lý và chuyển tiếp dữ liệu log, được cấu hình để đọc từ Kafka và ghi vào Elasticsearch.
  • Kibana: Một giao diện web cho Elasticsearch, cho phép trực quan hóa dữ liệu.
  • OpenTelemetry Collector: Thu thập, xử lý và chuyển tiếp dữ liệu quan sát, được cấu hình để đọc dữ liệu log từ file và có thể được cấu hình để gửi dữ liệu đến các dịch vụ khác như Kafka.

Phân quyền cho phép container đọc được file /var/log/auth.log.

chmod -R 775 /var/log/auth.log

Tạo file logstash.conf với nội dung input và output như dưới.

cat > logstash.conf << 'OEF'
input {
  kafka {
    bootstrap_servers => "10.237.7.81:9092"
    topics => ["auth-logs"]
  }
}

output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "auth-logs-%{+YYYY.MM.dd}"
  }
}
OEF
  • Input: Định nghĩa Kafka như là nguồn dữ liệu đầu vào, với địa chỉ server là 10.237.7.81:9092 và đọc từ topic auth-logs.
  • Output: Định nghĩa Elasticsearch như là điểm đích cho dữ liệu đầu ra, với địa chỉ host là elasticsearch:9200 và lưu dữ liệu vào index có tên mẫu là auth-logs-%{+YYYY.MM.dd}.

Chạy file docker-compose này.

docker-compose up -d

8.2 .Trên client (10.237.7.71 và 10.237.7.72).

Để thu thập /var/log/auth.log từ các server 10.237.7.71 và 10.237.7.72 sử dụng OpenTelemetry trong môi trường Docker Compose, bạn cần một cách để truy cập file log này từ bên trong container OpenTelemetry Collector. Tuy nhiên, vì /var/log/auth.log là file log hệ thống trên máy chủ vật lý, bạn không thể trực tiếp “mount” nó vào container mà không có bước trung gian.

Phân quyền cho phép container đọc được file /var/log/auth.log.

chmod -R 775 /var/log/auth.log

Một giải pháp là sử dụng một volume để chia sẻ file log giữa máy chủ và container. Tuy nhiên, điều này chỉ khả thi nếu OpenTelemetry Collector chạy trên cùng một máy chủ với file log. Đối với việc thu thập log từ các máy chủ khác nhau, bạn sẽ cần một cơ chế thu thập log phân tán, như cài đặt agents trên mỗi máy chủ để gửi log về OpenTelemetry Collector, hoặc sử dụng các công cụ như Fluentd, Filebeat, hoặc Logstash để thu thập và gửi log đến OpenTelemetry Collector hoặc trực tiếp đến Kafka.

Nếu bạn muốn “mount” /var/log/auth.log từ máy chủ vào container OpenTelemetry Collector trong một môi trường thử nghiệm, bạn có thể thêm một volume vào định nghĩa service opentelemetry-collector trong docker-compose.yml như sau:

cat > docker-compose.yml << 'OEF'
version: '3.7'
services:
  opentelemetry-collector:
    image: otel/opentelemetry-collector-contrib
    command: ["--config=/etc/otel-collector-config.yml"]
    volumes:
      - ./otel-collector-config.yml:/etc/otel-collector-config.yml
      - /var/log/auth.log:/var/log/auth.log
OEF

Tạo file otel-collector-config.yml như trên server 10.237.7.81 nhé.

cat > otel-collector-config.yml << 'OEF'
receivers:
  filelog:
    include: ["/var/log/auth.log"]
    start_at: beginning

exporters:
  kafka:
    brokers:
      - 10.237.7.81:9092
    topic: auth-logs
    encoding: otlp_proto

service:
  pipelines:
    logs:
      receivers: [filelog]
      exporters: [kafka]
OEF

Chạy file docker-compose này.

docker-compose up -d

9. Kết quả.

Index trên Kibana.

Log trên Discover của Kibana.

10. Tham khảo file cấu hình nâng cao OpenTelemetry Collector.

File cấu hình otel-collector-config.yml này được sử dụng để cấu hình OpenTelemetry Collector, một công cụ có thể thu thập, xử lý và xuất dữ liệu quan sát (logs, metrics, traces) đến các dịch vụ khác nhau.

receivers:
  filelog/syslog:
    include: [/var/log/auth.log]
    start_at: end
    resource:
    - service: otel_agent
    - farm: farm.demo
    - host_ip: 10.237.7.81
    - log_type: ubuntu_auth_logs
    operators:
    - type: regex_parser
      regex: '^(?P<timestamp>[A-Za-z]{3}.*\d{1,2} \d{2}:\d{2}:\d{2}) (?P<hostname>[^\s]+)\s(?P<appname>[^\[]+)(?:\[(?P<process_id>\d+)\])?:\s(?P<message>.+)$'
      timestamp:
        parse_from: attributes.timestamp
        layout_type: strptime
        layout: '%b %e %H:%M:%S'

exporters:
  kafka/ubuntu_auth_logs:
    brokers:
    - 10.237.7.81:9092
    topic: auth-logs
    # auth:
    #   sasl:
    #     mechanism: mechanism
    #     username: hoanghd
    #     password: Hoanghd164

    sending_queue:
      enabled: true
      num_consumers: 20
      queue_size: 100
    producer:
      max_message_bytes: 1048576
      compression: zstd

  logging:
    verbosity: detailed

processors:
  batch:
    send_batch_size: 100
    timeout: 2s

service:
  pipelines:
    logs/ubuntu_auth_logs:
      receivers:
      - filelog/syslog
      processors:
      - batch
      exporters:
      - kafka/ubuntu_auth_logs
      - logging

Dưới đây là cách hoạt động của nó.

Receivers.

  • filelog/syslog: Định nghĩa một receiver để thu thập log từ file. Cụ thể, nó sẽ đọc log từ file /var/log/auth.log.
    • include: Đường dẫn đến file log cần thu thập.
    • start_at: Bắt đầu đọc log từ cuối file, giúp chỉ thu thập log mới.
    • resource: Thêm metadata vào log thu thập được, bao gồm servicefarmhost_ip và log_type.
    • operators: Sử dụng một regex parser để phân tích cú pháp log dựa trên biểu thức chính quy định nghĩa, trích xuất các trường như timestamphostnameappnameprocess_id và message.

Exporters.

  • kafka/ubuntu_auth_logs: Định nghĩa một exporter để gửi log đến Kafka.
    • brokers: Địa chỉ của broker Kafka.
    • topic: Tên topic mà log sẽ được gửi đến.
    • sending_queue: Cấu hình hàng đợi gửi, bao gồm số lượng consumers và kích thước hàng đợi.
    • producer: Cấu hình cho producer Kafka, bao gồm kích thước message tối đa và phương thức nén.
  • logging: Định nghĩa một exporter để log thông tin chi tiết về quá trình xử lý của collector.

Processors.

  • Phần batch trong cấu hình OpenTelemetry Collector đề cập đến một processor được sử dụng để tối ưu hóa việc gửi dữ liệu bằng cách tổng hợp nhiều bản ghi dữ liệu (ví dụ: logs, metrics) thành một khối (batch) trước khi gửi chúng đến đích cuối cùng (ví dụ: một hệ thống lưu trữ hoặc phân tích dữ liệu). Điều này giúp giảm bớt số lượng yêu cầu mạng và có thể cải thiện hiệu suất bằng cách giảm overhead liên quan đến việc gửi dữ liệu.
  • Trong cấu hình batch, bạn có thể tùy chỉnh hai tham số chính:
  • send_batch_size: Kích thước tối đa của mỗi khối dữ liệu. Điều này xác định số lượng bản ghi dữ liệu tối đa được gửi trong một lô. Nếu số lượng bản ghi dữ liệu thu thập được vượt qua giá trị này, chúng sẽ được gửi ngay lập tức dưới dạng một khối.
  • timeout: Thời gian chờ tối đa trước khi một khối dữ liệu được gửi đi, ngay cả khi kích thước của khối chưa đạt đến send_batch_size. Điều này đảm bảo rằng dữ liệu sẽ không bị giữ lại quá lâu trước khi được gửi đi, giúp giảm độ trễ trong việc xử lý dữ liệu.
  • Ví dụ, nếu bạn cấu hình send_batch_size là 100 và timeout là 2 giây, thì processor sẽ tổng hợp dữ liệu vào một khối và gửi khối đó đi khi nó chứa 100 bản ghi dữ liệu hoặc khi đã qua 2 giây kể từ khối dữ liệu trước, tùy điều kiện nào đến trước. Điều này giúp cân bằng giữa việc giảm độ trễ và tối ưu hóa hiệu suất mạng.

Service.

  • pipelines/logs/ubuntu_auth_logs: Định nghĩa một pipeline xử lý log.
    • receivers: Sử dụng receiver filelog/syslog.
    • processors: Áp dụng processor batch để xử lý log.
    • exporters: Gửi log đã xử lý đến các exporter kafka/ubuntu_auth_logs và logging.

Như vậy file cấu hình này thiết lập một pipeline trong OpenTelemetry Collector để thu thập log từ file /var/log/auth.log, xử lý chúng (ví dụ: phân tích cú pháp, batching) và sau đó gửi chúng đến một topic Kafka cũng như log ra thông tin chi tiết về quá trình xử lý.

9. Kết luận.

OpenTelemetry, ELK và Kafka là những công cụ mạnh mẽ giúp bạn xây dựng một nền tảng thu thập và phân tích dữ liệu hiệu quả. Việc lựa chọn công cụ nào phụ thuộc vào yêu cầu cụ thể của dự án. Nếu bạn cần một giải pháp toàn diện và linh hoạt, OpenTelemetry là một lựa chọn tuyệt vời. Nếu bạn chỉ cần thu thập dữ liệu log từ các file, Filebeat có thể đáp ứng được nhu cầu của bạn.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories