0

Bài học 8: Biến hóa dữ liệu với GeoIP và User Agent

Chào mừng bạn đến với Bài học 8. Tính đến lúc này, hệ thống của chúng ta đã thu thập log Nginx an toàn qua Filebeat, chống mất mát bằng Hàng đợi (PQ) và cắt gọn dữ liệu bằng Grok.

Tuy nhiên, có những thông tin trong log Nginx nếu chỉ để nguyên thì chưa mang lại giá trị cao nhất. Ví dụ: từ một địa chỉ IP như 8.8.8.8, làm sao để trên màn hình Kibana hiển thị được đó là người dùng đến từ Mỹ?

Đây là lúc chúng ta sử dụng kỹ thuật "Làm giàu" dữ liệu (Data Enrichment) bằng hai bộ lọc siêu phàm của Logstash: GeoIP và UserAgent.

1. GeoIP Filter - Định vị bản đồ (Mapping)

Trong log Nginx, bạn luôn thu thập được địa chỉ IP của người dùng (client_ip). Plugin geoip của Logstash sẽ sử dụng một cơ sở dữ liệu nội bộ (thường là MaxMind) để tra cứu địa chỉ IP đó và tự động sinh ra các thông tin về vị trí địa lý.

Cách cấu hình:

filter {
  geoip {
    # Khai báo trường đang chứa địa chỉ IP của người dùng
    source => "client_ip"
    # Nơi lưu kết quả định vị (tạo ra một trường mới tên là geo)
    target => "geo"
  }
}

Phép màu xảy ra: Từ một IP khô khan ban đầu, Logstash sẽ "đẻ" thêm cho bạn một loạt dữ liệu như: Tên Quốc gia (Vietnam), Tên Thành phố (Ho Chi Minh City), và quan trọng nhất là Tọa độ kinh độ/vĩ độ (location). Chính nhờ tọa độ này, Kibana mới có thể vẽ các đốm sáng lên bản đồ thế giới!

2. UserAgent Filter - Phân tích thiết bị người dùng

Nếu bạn nhìn vào log Nginx đầy đủ, nó luôn chứa một đoạn văn bản dài loằng ngoằng ở cuối gọi là User-Agent, ví dụ:

"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"

Kibana không thể phân tích được cái chuỗi hỗn độn này. Nhưng plugin useragent của Logstash thì có thể. Nó sẽ mổ xẻ chuỗi này thành các thành phần có ý nghĩa.

Cách cấu hình:

filter {
  useragent {
    # Khai báo trường đang chứa đoạn User-Agent thô
    source => "user_agent_string"
    # Nơi lưu kết quả sau khi mổ xẻ
    target => "user_agent"
  }
}

3. Tích hợp vào quy trình xử lý Log Nginx thực tế

Chúng ta sẽ nâng cấp khối filter của Bài học 4 bằng cách thêm hai plugin này vào cuối quy trình (sau khi Grok đã bóc tách được client_ip và user_agent_string).

filter {
  # 1. Cắt nhỏ log thô
  grok {
    match => { "message" => "%{IP:client_ip} - - \[%{HTTPDATE:time_local}\] \"%{WORD:method} %{DATA:request} HTTP/%{NUMBER:http_version}\" %{NUMBER:response_code} %{NUMBER:body_bytes_sent} \"%{DATA:user_agent_string}\"" }
  }

  # 2. Làm giàu dữ liệu vị trí địa lý
  geoip {
    source => "client_ip"
    target => "geo"
  }

  # 3. Làm giàu dữ liệu thiết bị/trình duyệt
  useragent {
    source => "user_agent_string"
    target => "user_agent"
  }

  # 4. Dọn dẹp trường rác
  mutate {
    remove_field => [ "message", "user_agent_string" ]
  }
}

4. Kết quả đầu ra (JSON) - Dữ liệu đã được "lên đời"

Giờ đây, Kibana sẽ nhận được một gói dữ liệu cực kỳ phong phú và chi tiết:

{
  "client_ip": "115.79.x.x",
  "method": "GET",
  "response_code": "200",
  "geo": {
    "country_name": "Vietnam",
    "city_name": "Ho Chi Minh City",
    "location": {
      "lat": 10.823,
      "lon": 106.6296
    }
  },
  "user_agent": {
    "name": "Chrome",
    "version": "114.0.0.0",
    "os": "Windows",
    "device": "Other"
  }
}

Từ bộ dữ liệu này, kỹ sư vận hành và đội ngũ Marketing có thể ngay lập tức tạo ra các biểu đồ giá trị:

  • Bản đồ nhiệt (Heatmap) hiển thị lượng truy cập tập trung ở quốc gia nào.
  • Biểu đồ tròn (Pie chart) thống kê tỷ lệ người dùng sử dụng Chrome vs Safari, hoặc Windows vs MacOS.

Đến đây, bạn đã nắm trong tay những kỹ năng quan trọng nhất để thiết lập và xử lý dữ liệu với Logstash. Trong hệ thống thực tế, nếu bạn phải xử lý đồng thời log của Nginx, MySQL, và Backend App, file cấu hình (config) sẽ trở nên khổng lồ và rất khó bảo trì nếu nhét chung vào một chỗ.

Bạn có muốn Bài học 9 tiếp tục với cách tách nhỏ hệ thống bằng tính năng Multiple Pipelines (Đa luồng) để quản lý dễ dàng hơn không?


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí