0

Series Nâng cao Kibana & Elastic APM #2: Thiết lập "Báo động Đỏ" (Alerting) và Tích hợp Telegram/Slack

1. Chuẩn bị "Đường ống liên lạc" (Connectors)

Để Kibana có thể gửi tin nhắn ra thế giới bên ngoài, chúng ta cần thiết lập một Connector. Ở đây, Webhook (gửi qua HTTP POST) là cách thông dụng nhất để bắn thông báo vào Telegram, Slack hoặc Microsoft Teams.

  1. Trong Kibana, mở menu bên trái, cuộn xuống phần Stack Management -> Chọn Rules and Connectors.
  2. Chuyển sang tab Connectors và bấm Create connector.
  3. Chọn Webhook.
  4. Khai báo các thông tin:
  • Name: Telegram_DevOps_Alert
  • Method: POST
  • URL: Điền URL API của Telegram Bot (VD: [https://api.telegram.org/bot](https://api.telegram.org/bot)<TOKEN>/sendMessage)
  • Headers: Bỏ trống hoặc cấu hình Content-Type: application/json nếu cần.
  1. Bấm Save & Test. Kibana đã sẵn sàng làm người đưa tin.

2. Định nghĩa "Ranh giới đỏ" (APM Rules)

Bây giờ, chúng ta sẽ dạy Kibana biết thế nào là một "sự cố". Quay lại giao diện APM Dashboard -> Bấm vào nút Alerts and rules ở góc trên bên phải -> Chọn Create rule.

Kibana APM cung cấp sẵn 3 loại Rule cực kỳ lợi hại:

  • APM Error rate threshold: Tỷ lệ lỗi vượt quá % cho phép.
  • APM Transaction error rate threshold: Tỷ lệ lỗi của một nhóm API cụ thể.
  • APM Transaction duration threshold: API chạy chậm hơn ranh giới quy định.

Ví dụ thực chiến: Thiết lập cảnh báo API đồng bộ bị chậm.

  • Rule type: Chọn APM Transaction duration threshold.
  • Environment: production.
  • Service: AFC_Core_API (Đã định nghĩa ở Bài 1).
  • Transaction type: request (HTTP Request).
  • Transaction name: POST /api/v1/hitachi/sync.
  • Conditions: Kích hoạt cảnh báo nếu thời gian phản hồi (Transaction duration) lớn hơn 2000 ms trong vòng 5 phút liên tục.

Cấu hình này cực kỳ thông minh: Nó không báo động nếu chỉ có 1 request bị kẹt (do mạng lag cục bộ), mà chỉ rú còi khi tình trạng chậm chạp kéo dài 5 phút, biểu hiện của việc Database quá tải hoặc server đối tác có vấn đề.

3. Cấu hình Tin nhắn Cảnh báo (Message Formatting)

Khi ranh giới đỏ bị phá vỡ, Kibana sẽ gọi cái Connector mà chúng ta tạo ở Bước 1. Bạn cần định nghĩa cấu trúc JSON (Payload) để bắn vào API của Telegram.

Trong phần Actions của Rule vừa tạo, chọn Connector Telegram_DevOps_Alert, định dạng Body (JSON) chứa các biến động mà Kibana nội suy ra được:

{
  "chat_id": "-100123456789",
  "text": "🚨 [BÁO ĐỘNG METRO] API Đang Chậm Bất Thường!\n\n🔴 Service: {{context.serviceName}}\n⏳ Môi trường: {{context.environment}}\n⚠️ API: {{context.transactionName}}\n⏱️ Tốc độ hiện tại: {{context.transactionDuration}} ms (Vượt mốc 2000ms)\n\n🔍 Click để xem chi tiết Trace: {{context.kibanaBaseUrl}}/app/apm/..."
}

Nhờ các biến {{context...}}, khi có sự cố, team Dev sẽ nhận được tin nhắn báo đích danh API nào đang chết, mức độ nghiêm trọng ra sao, kèm theo một đường link bấm thẳng vào biểu đồ Trace trên Kibana.

4. Xử lý khủng hoảng (Incident Response) với APM Trace

Khi tin nhắn Telegram nổ liên tục báo API /api/v1/hitachi/sync mất tới 3 giây, bạn bấm vào link. Kibana sẽ đưa bạn đến màn hình Waterfall Trace.

Ở đây, sức mạnh nội soi của APM bắt đầu tỏa sáng. Bạn sẽ nhìn thấy một trục thời gian (Timeline) từ giây số 0 đến giây số 3.0.

  • 0s - 0.2s: Laravel khởi động Framework, chạy Middleware.
  • 0.2s - 0.3s: Query SELECT * FROM transactions WHERE status = 'offline'. (APM bắt được chính xác câu SQL này và báo nó mất 100ms).
  • 0.3s - 2.8s: HTTP POST https://api.hitachi.partner/sync. Khối này màu đỏ rực, kéo dài 2.5 giây!

Kết luận: Nút thắt cổ chai không nằm ở đoạn code PHP bạn viết, không nằm ở Database của chúng ta, mà do đầu API của đối tác đang bị thắt nghẽn. Bạn lập tức chụp lại biểu đồ Waterfall này trên Kibana và đính kèm vào email Defect Notification gửi sang cho nhà thầu làm bằng chứng đanh thép, yêu cầu họ cấp tốc kiểm tra lại hạ tầng.

Bằng việc kết hợp APM Server để đo đạc và Rules/Alerting để báo động, hệ thống của bạn đã chuyển từ trạng thái Bị động (Phát hiện lỗi khi khách hàng kêu) sang Chủ động (Phát hiện và xử lý lỗi trước khi hệ thống sập toàn diện).

Để khép lại Series này, ở Bài 3, bạn muốn chúng ta tìm hiểu cách tự định nghĩa các Custom Spans (Đo thời gian chạy của những khối code/thuật toán phức tạp bên trong một hàm) thay vì chỉ đo request chung chung, hay muốn học cách tích hợp Log và APM để khi bấm vào 1 API bị chậm, nó sẽ lọc ra đúng dòng log sinh ra trong 3 giây chậm chạp đó?


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.