Bài 3: Tìm Kiếm Và Phân Tích Dữ Liệu Với Elasticsearch

Giới Thiệu Về Elasticsearch Trong ELK Stack

Elasticsearch là “trái tim” của ELK Stack, chịu trách nhiệm lưu trữ, tìm kiếm, và phân tích dữ liệu với tốc độ cao. Trong DevOps, Elasticsearch được sử dụng để xử lý log, metric, và dữ liệu thời gian thực, giúp phát hiện sự cố nhanh chóng và hỗ trợ ra quyết định. Ở bài trước, bạn đã học cách dùng Logstash để thu thập và gửi log đến Elasticsearch. Bây giờ, chúng ta sẽ đi sâu vào cách tạo index, thực hiện truy vấn, và phân tích dữ liệu hiệu quả với Elasticsearch, đảm bảo bạn làm chủ công cụ này trong quy trình DevOps.

Yêu Cầu Trước Khi Bắt Đầu

  • Đã cài đặt và cấu hình ELK Stack (Bài 1), Logstash đang gửi dữ liệu đến Elasticsearch (Bài 2).
  • Có quyền truy cập terminal với Elasticsearch chạy trên localhost:9200.
  • Dữ liệu đã được gửi đến Elasticsearch (VD: index auth-log-* từ Bài 2).

Hướng Dẫn Tìm Kiếm Và Phân Tích Với Elasticsearch

Bước 1: Tạo Index Và Mapping

Index là nơi Elasticsearch lưu trữ dữ liệu, tương tự bảng trong cơ sở dữ liệu. Mapping định nghĩa cấu trúc dữ liệu (các trường và kiểu dữ liệu). Tạo index thủ công để kiểm soát cấu trúc:

curl -X PUT "localhost:9200/my-app-log" -H 'Content-Type: application/json' -d '
{
  "mappings": {
    "properties": {
      "timestamp": { "type": "date" },
      "message": { "type": "text" },
      "level": { "type": "keyword" },
      "source": { "type": "keyword" }
    }
  }
}'
  • timestamp: Lưu thời gian log.
  • message: Nội dung log (text để tìm kiếm toàn văn).
  • levelsource: Keyword để lọc chính xác.

Kiểm tra index:

curl -X GET "localhost:9200/my-app-log?pretty"

Nếu thấy JSON với thông tin mapping, index đã tạo thành công.

Bước 2: Gửi Dữ liệu Vào Index

Sửa file cấu hình Logstash từ Bài 2 (/etc/logstash/conf.d/logstash.conf) để gửi dữ liệu vào index mới:

input {
  file {
    path => "/var/log/myapp.log"
    start_position => "beginning"
    sincedb_path => "/dev/null"
  }
}
filter {
  grok {
    match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:message}" }
  }
  mutate {
    add_field => { "source" => "myapp" }
  }
}
output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "my-app-log"
  }
  stdout { codec => rubydebug }
}

Tạo file log mẫu /var/log/myapp.log:

sudo sh -c 'echo "2024-03-02T10:00:00 INFO Application started" >> /var/log/myapp.log'
sudo sh -c 'echo "2024-03-02T10:01:00 ERROR Failed to connect DB" >> /var/log/myapp.log'

Khởi động lại Logstash:

sudo systemctl restart logstash

Kiểm tra dữ liệu:

curl -X GET "localhost:9200/my-app-log/_search?pretty"

Bạn sẽ thấy JSON chứa các bản ghi log vừa gửi.

Bước 3: Thực Hiện Truy Vấn Cơ Bản

Elasticsearch hỗ trợ nhiều loại truy vấn để tìm kiếm và phân tích. Dưới đây là một số ví dụ phổ biến:

  • Truy vấn Match (Tìm kiếm toàn văn):
    curl -X GET "localhost:9200/my-app-log/_search?pretty" -H 'Content-Type: application/json' -d '
    {
    "query": {
      "match": {
        "message": "failed"
      }
    }
    }'

    Kết quả trả về bản ghi chứa “Failed to connect DB”.

  • Truy vấn Term (Lọc chính xác):
    curl -X GET "localhost:9200/my-app-log/_search?pretty" -H 'Content-Type: application/json' -d '
    {
    "query": {
      "term": {
        "level": "ERROR"
      }
    }
    }'

    Lọc các log có mức độ ERROR.

  • Truy vấn Range (Lọc theo thời gian):
    curl -X GET "localhost:9200/my-app-log/_search?pretty" -H 'Content-Type: application/json' -d '
    {
    "query": {
      "range": {
        "timestamp": {
          "gte": "2024-03-02T10:00:00",
          "lte": "2024-03-02T10:01:00"
        }
      }
    }
    }'

    Lọc log trong khoảng thời gian cụ thể.

Bước 4: Phân Tích Dữ Liệu Với Aggregation

Aggregation cho phép tổng hợp dữ liệu để phân tích. Ví dụ: Đếm số log theo mức độ level:

curl -X GET "localhost:9200/my-app-log/_search?pretty" -H 'Content-Type: application/json' -d '
{
  "aggs": {
    "by_level": {
      "terms": {
        "field": "level"
      }
    }
  },
  "size": 0
}'

Kết quả sẽ hiển thị số lượng log INFOERROR.

bar-chart

Bảng So Sánh Các Loại Truy Vấn Trong Elasticsearch

Loại Truy Vấn Mô Tả Ví Dụ Ứng Dụng Ưu Điểm Nhược Điểm
Match Tìm kiếm toàn văn Tìm log chứa “error” Linh hoạt, dễ dùng Không chính xác tuyệt đối
Term Lọc chính xác theo giá trị Lọc log mức độ ERROR Nhanh, chính xác Không tìm kiếm mờ
Range Lọc theo khoảng giá trị Lọc log trong 1 giờ cụ thể Hữu ích cho thời gian Cần định dạng đúng
Bool Kết hợp nhiều truy vấn Tìm log ERROR từ 10h-11h Rất linh hoạt Cú pháp phức tạp

Mẹo Tối Ưu Hóa Truy Vấn Và Phân Tích

  • Định Nghĩa Mapping Rõ Ràng: Đảm bảo các trường (VD: levelkeyword) để truy vấn nhanh hơn.
  • Sử Dụng Index Đúng: Tạo index theo thời gian (VD: my-app-log-2024.03.02) để dễ quản lý.
  • Kiểm Tra Hiệu Suất: Dùng _search với profile: true để phân tích tốc độ truy vấn.

Lợi Ích Khi Sử Dụng Elasticsearch Trong DevOps

  • Tìm kiếm nhanh chóng: Xử lý hàng triệu bản ghi trong vài giây.
  • Phân tích sâu sắc: Aggregation giúp phát hiện xu hướng và vấn đề tiềm ẩn.
  • Tích hợp mượt mà: Kết nối với Kibana để trực quan hóa dữ liệu.

Thực Hành

Thêm log mới vào /var/log/myapp.log (VD: “2024-03-02T10:02:00 WARN Database overload”), chạy truy vấn match để tìm “overload” và aggregation để đếm log theo level. Kiểm tra kết quả trên terminal hoặc Kibana. Nếu gặp khó khăn, nhắn mình để cùng giải quyết. Bài tiếp theo, chúng ta sẽ khám phá Kibana để trực quan hóa dữ liệu – hẹn gặp bạn!

Điều hướng chuỗi bài viết<< Bài 2: Thu Thập Dữ Liệu Với Logstash
>> Bài 4: Trực Quan Hóa Dữ Liệu Với Kibana
Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận