0
0
Lập trình
TT

Biến dòng log thành cảnh báo hiệu quả trên AWS

Đăng vào 1 tháng trước

• 5 phút đọc

Biến dòng log thành cảnh báo hiệu quả trên AWS

Giới thiệu

Sự thật lạnh lùng: Những vấn đề thường xuất hiện đầu tiên trong các dòng log. Tuy nhiên, điều quan trọng là biến những dòng log “uh-oh” thành những thông báo cảnh báo trong hộp thư của bạn trước khi người dùng cảm thấy khó chịu. Trong bài viết này, chúng ta sẽ cùng tìm hiểu cách biến dòng log thành cảnh báo một cách đơn giản bằng AWS mà không cần xây dựng một hệ thống giám sát lớn.

Cách hoạt động

Hãy tưởng tượng CloudWatch Logs như một dòng sông. Các bộ lọc metric là những cái lưới nhỏ mà bạn thả xuống: “bắt bất cứ điều gì trông giống như ERROR” hoặc “lấy JSON nơi level=ERROR và service=payments.” Mỗi lần bắt được sẽ làm tăng một metric. Các cảnh báo sẽ theo dõi metric đó và bạn sẽ nhận được thông báo qua email, Slack hoặc bất kỳ dịch vụ nào bạn thích.

Giá rẻ. Nhanh chóng. Không thay đổi ứng dụng.

plaintext Copy
App → CloudWatch Logs ──(metric filter)──▶ Metric  
│  
└──▶ Alarm ──▶ SNS ──▶ Email/Slack

Các bước thực hiện

Bước 1: Tạo một chủ đề SNS (để nhận cảnh báo)

bash Copy
aws sns create-topic --name app-alarms
# sao chép "TopicArn" từ kết quả
TOPIC_ARN="arn:aws:sns:REGION:ACCOUNT_ID:app-alarms"

# đăng ký email của bạn (xác nhận email để kích hoạt)
aws sns subscribe \
  --topic-arn "$TOPIC_ARN" \
  --protocol email \
  --notification-endpoint you@example.com

Bước 2: Thêm bộ lọc metric vào nhóm log của bạn

Tùy chọn A — từ khóa đơn giản (“ERROR” nhưng không bao gồm health checks):

bash Copy
LOG_GROUP="/aws/lambda/my-fn"

aws logs put-metric-filter \
  --log-group-name "$LOG_GROUP" \
  --filter-name "ErrorCount" \
  --filter-pattern '"ERROR" -HealthCheck' \
  --metric-transformations \
      metricName=ErrorCount,metricNamespace="App/Alerts",metricValue=1,defaultValue=0

Tùy chọn B — log JSON có cấu trúc (được khuyến nghị):

bash Copy
aws logs put-metric-filter \
  --log-group-name "$LOG_GROUP" \
  --filter-name "PaymentsErrors" \
  --filter-pattern '{ $.level = "ERROR" && $.service = "payments" }' \
  --metric-transformations \
      metricName=PaymentsErrorCount,metricNamespace="App/Alerts",metricValue=1

Bước 3: Tạo một cảnh báo cho metric đó

Cảnh báo nếu chúng ta thấy ≥ 1 lỗi mỗi phút trong 3 phút:

bash Copy
aws cloudwatch put-metric-alarm \
  --alarm-name "LambdaErrorBurst" \
  --metric-name ErrorCount \
  --namespace "App/Alerts" \
  --statistic Sum \
  --period 60 \
  --evaluation-periods 3 \
  --threshold 1 \
  --comparison-operator GreaterThanOrEqualToThreshold \
  --treat-missing-data notBreaching \
  --alarm-actions "$TOPIC_ARN" \
  --ok-actions "$TOPIC_ARN"

Bước 4: Kiểm tra (đừng bỏ qua)

  1. Ghi một ERROR phù hợp với bộ lọc của bạn.
  2. Trong CloudWatch Metrics → App/Alerts, đảm bảo metric tăng lên.
  3. Theo dõi cảnh báo chuyển sang ALARM và kiểm tra email của bạn.

Nếu không có gì xảy ra, hãy vào Nhóm Log → Bộ lọc metric → Kiểm tra mẫu và dán một dòng log thực tế. Nó sẽ cho bạn biết liệu mẫu của bạn có khớp hay không.

Nếu bạn thích Terraform, đây là toàn bộ phần

hcl Copy
resource "aws_sns_topic" "app_alarms" {
  name = "app-alarms"
}

resource "aws_sns_topic_subscription" "email" {
  topic_arn = aws_sns_topic.app_alarms.arn
  protocol  = "email"
  endpoint  = "you@example.com"
}

resource "aws_cloudwatch_log_metric_filter" "errors" {
  name           = "ErrorCount"
  log_group_name = "/aws/lambda/my-fn"
  pattern        = "\"ERROR\" -HealthCheck"

  metric_transformation {
    name          = "ErrorCount"
    namespace     = "App/Alerts"
    value         = "1"
    default_value = "0"
  }
}

resource "aws_cloudwatch_metric_alarm" "error_alarm" {
  alarm_name          = "LambdaErrorBurst"
  namespace           = "App/Alerts"
  metric_name         = "ErrorCount"
  statistic           = "Sum"
  period              = 60
  evaluation_periods  = 3
  threshold           = 1
  comparison_operator = "GreaterThanOrEqualToThreshold"
  treat_missing_data  = "notBreaching"
  alarm_actions       = [aws_sns_topic.app_alarms.arn]
  ok_actions          = [aws_sns_topic.app_alarms.arn]
}

Những điều cần lưu ý

Những điều thường gặp (học được từ thực tế)

  • Chú ý đến ký tự hoa thường: ERROR ≠ error. Hãy khớp với những gì bạn thực sự ghi lại.
  • Khớp theo dòng: Các bộ lọc xem xét từng dòng một. Nếu stack trace kéo dài qua nhiều dòng, hãy dựa vào một trường level trong JSON.
  • Tài khoản/khu vực đúng: Các bộ lọc metric phải nằm trong nhóm log.
  • Không làm tăng độ cardinality: Giữ một metric cho mỗi tín hiệu; không đưa ID vào tên metric.
  • Không có cảnh báo trong thời gian yên tĩnh: Cài đặt “treat missing data” là giải pháp hữu ích để tránh nhận cảnh báo không cần thiết.

Những biến thể bạn có thể muốn

  • Slack/Teams: SNS → lambda → Slack (chỉ cần nhấp chuột).
  • PagerDuty/Opsgenie: SNS → EventBridge → công cụ sự cố của bạn.
  • Ng eş ngưỡng thông minh: Thử cảnh báo Phát hiện Anomaly khi bạn có lưu lượng cơ bản.
  • Cảnh báo tổng hợp: “Chỉ cảnh báo nếu lỗi tăng và độ trễ p50 xấu.”

Bạn không cần phải xây dựng lại một hệ thống giám sát lớn để nhận được cảnh báo hữu ích. Hãy bắt đầu với một hoặc hai mẫu tín hiệu cao như timeouts, 5xx, “thanh toán thất bại” và tiếp tục cải tiến.

Nỗ lực nhỏ. Mạng lưới an toàn lớn.

Kết luận

Việc chuyển đổi dòng log thành cảnh báo nhanh chóng và hiệu quả không quá phức tạp. Bằng cách sử dụng CloudWatch Logs, metric filters, và SNS, bạn có thể nhận được thông báo ngay lập tức khi có lỗi xảy ra. Hãy thử nghiệm với các mẫu khác nhau và điều chỉnh cho phù hợp với nhu cầu của bạn. Nếu bạn cần thêm trợ giúp, đừng ngần ngại liên hệ với cộng đồng hoặc tham khảo các tài liệu AWS.

Câu hỏi thường gặp

1. Làm thế nào để tôi biết liệu cảnh báo của tôi có hoạt động không?

Bạn có thể kiểm tra bằng cách ghi lại một lỗi mà bạn đã cấu hình bộ lọc để nhận diện.

2. Tôi có thể sử dụng dịch vụ khác thay vì SNS không?

Có, bạn có thể sử dụng Lambda hoặc các dịch vụ khác để gửi cảnh báo đến các nền tảng như Slack hay PagerDuty.

3. Có cách nào để tối ưu hóa việc giám sát không?

Sử dụng các ngưỡng thông minh hoặc cảnh báo tổng hợp để giảm thiểu cảnh báo giả và chỉ nhận cảnh báo khi thực sự cần thiết.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào