Mở đầu
Trong quá trình quản lý hệ thống, việc theo dõi logs là một trong những nhiệm vụ quan trọng, đặc biệt là khi hệ thống gặp sự cố hoặc cần phân tích hành vi người dùng. Đối với những hệ thống chạy trên nền tảng AWS, AWS CloudWatch trở thành một công cụ không thể thiếu trong việc quản lý và phân tích logs. Bài viết này sẽ giới thiệu về AWS Log Insights, một tính năng mạnh mẽ của CloudWatch, giúp bạn thực hiện phân tích và lọc logs một cách hiệu quả. Chúng ta sẽ cùng khám phá một số patterns và use cases hữu ích thường được áp dụng trong các tình huống thực tế.
Kiến thức nền tảng
Cú Pháp Truy Vấn
CloudWatch Logs Insights sử dụng một ngôn ngữ truy vấn đặc biệt cho phép người dùng thực hiện nhiều tác vụ như thao tác số học, so sánh, sử dụng regular expressions (regex), và nhiều lệnh khác để lọc logs. Cú pháp cơ bản của truy vấn bao gồm:
- Ký tự (|): Dùng để kết nối nhiều lệnh trong một truy vấn.
- Chú thích: Được bắt đầu bằng ký tự thăng (#).
Một số lệnh phổ biến
- filter: Dùng để lọc kết quả theo một pattern nhất định.
- limit: Giới hạn số lượng kết quả trả về.
- sort: Sắp xếp kết quả theo thứ tự nhất định.
Ví dụ đơn giản
Khi tester vào trang homepage và gặp lỗi 5xx, developer sẽ cần sử dụng truy vấn sau để tìm kiếm logs có chứa từ "ERROR":
fields @timestamp, @message, @logStream, @log
| filter @message like "ERROR"
| sort @timestamp desc
| limit 10
Truy vấn này sẽ tìm kiếm các logs chứa từ "ERROR" và sắp xếp theo thời gian giảm dần. Bạn có thể sử dụng khoảng thời gian cụ thể như sau:
| filter @timestamp between 1627824000000 and 1627910399999
Sử dụng pattern để nhóm logs
Lệnh pattern cho phép bạn nhóm các logs có cấu trúc tương tự. Ví dụ, nếu bạn có những logs sau:
ERROR 2024-08-25T12:34:56 Unable to connect to database server at db.example.com
INFO 2024-08-25T12:35:00 User JohnDoe logged in from IP 192.168.1.1
WARN 2024-08-25T12:36:22 Memory usage is at 85% on server web01
INFO 2024-08-25T12:36:45 User JaneDoe logged in from IP 192.168.1.2
ERROR 2024-08-25T12:37:01 Unable to connect to database server at db.example.com
Bạn có thể sử dụng lệnh pattern như sau:
fields @message
| pattern @message /(?<level>[A-Z]+) (?<timestamp>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}) (?<message>.+)/
| display level, timestamp, message
Kết quả sẽ hiển thị các log được xác định rõ ràng với các trường như mức độ (level), thời gian (timestamp) và nội dung thông điệp (message).
Lệnh parse
Lệnh parse cho phép bạn trích xuất dữ liệu từ một trường log để tạo ra các trường mới. Ví dụ, để trích xuất thông tin người dùng và địa chỉ IP từ một log dài:
fields @message
| parse @message "User * logged in from IP *" as username, ip_address
| display username, ip_address
Lệnh stats
Lệnh stats giúp bạn thực hiện các thao tác thống kê như count, sum, avg. Ví dụ, bạn có thể ước lượng lưu lượng truy cập của người dùng theo từng giờ:
Các lệnh khác
- display: Hiển thị các trường cụ thể trong kết quả truy vấn.
- fields: Lựa chọn và hiển thị các trường cụ thể từ dữ liệu log.
- diff: So sánh các sự kiện log giữa hai khoảng thời gian khác nhau để phát hiện sự khác biệt.
Một vài usecases
Trong quá trình làm việc thực tế, có nhiều tình huống mà chúng ta cần sử dụng logs để tìm lỗi hoặc phân tích các vấn đề. Dưới đây là một số truy vấn hữu ích:
1. Truy vấn lỗi theo màn hình chứa lỗi:
fields @timestamp, @message
| filter extra.url like /products\/sales/ and @message like /Error/
| sort @timestamp desc
| limit 120
2. Tính số request dựa trên path:
fields @timestamp, @message
| parse @message "request=\"GET *\"" as request
| stats count(*) as num_request by request
| sort num_request desc
| limit 20
3. Thống kê số lượng request theo thời gian:
filter @message like /homepage/
| stats count(*) as num_request by bin(1h)
| sort num_request desc
4. Truy vấn slow query từ logs của RDS:
parse @message /# Time:\s(?<Time>.*?)\sUser@Host: (?<User>.*)\[.*?\]\s@ \s\.(?<Host>.*?). Id: \d*\s# Query_time: (?<Query_time>.*?)\s Lock_time: (?<Lock_time>.*?)\sRows_sent: (?<Rows_sent>.*?)\sRows_examined: (?<Rows_examined>.*?)\s(?<Query>.*)/
| filter User like 'db_user'
| filter Query_time > 4
| sort Query_time desc
5. Thống kê số lượng slow query trong mỗi 10 phút:
parse @message /# Time:\s(?<Time>.*?)\sUser@Host: (?<User>.*)\[.*?\]\s@ \s\.(?<Host>.*?). Id: \d*\s# Query_time: (?<Query_time>.*?)\s Lock_time: (?<Lock_time>.*?)\sRows_sent: (?<Rows_sent>.*?)\sRows_examined: (?<Rows_examined>.*?)\s(?<Query>.*)/
| filter Query_time > 5
| stats count(*) as count_total by bin(10m) as block_time
| sort count_total desc
Lưu ý quan trọng
Khi thực hiện lọc logs, hãy luôn thu hẹp phạm vi thời gian để giảm thiểu chi phí không đáng có. Việc quét quá nhiều logs có thể gây tốn kém. Hãy cẩn trọng và lập kế hoạch cho việc điều tra logs của bạn.
Kết luận
AWS CloudWatch Log Insights là một công cụ mạnh mẽ giúp bạn quản lý và phân tích logs hiệu quả. Bằng việc sử dụng cú pháp và lệnh truy vấn phù hợp, bạn có thể nhanh chóng phát hiện và xử lý các vấn đề trong hệ thống của mình. Hy vọng rằng bài viết này đã cung cấp thông tin bổ ích cho bạn. Nếu bạn có thêm bất kỳ truy vấn hay nào, hãy bình luận để chúng ta cùng học hỏi nhé!
source: viblo