Giới thiệu
Trong thời đại hiện nay, các ứng dụng hiện đại tạo ra một lượng lớn log từ thời gian phản hồi API đến các lỗi nghiêm trọng. Thay vì theo dõi log một cách thủ công, chúng ta cần một giải pháp giúp:
- Tập trung log ở một nơi
- Truy vấn log dễ dàng
- Nhận thông báo trên Slack khi có sự cố xảy ra
Để thực hiện điều này, tôi đã thiết lập Grafana Loki làm nơi lưu trữ log, tích hợp nó với Python và thêm thông báo Slack cho các lỗi sản xuất. Bài viết này sẽ hướng dẫn bạn từng bước thiết lập đầy đủ:
- Cài đặt Loki
- Cấu hình logging Python với Loki
- Truy vấn Loki bằng Python
- Gửi thông báo đến Slack khi xảy ra lỗi
Bước 1: Cài Đặt Loki
Đầu tiên, bạn cần cài đặt Loki và Promtail (Promtail sẽ thu thập log và gửi chúng đến Loki).
Sử Dụng Docker Compose
Tạo một tệp docker-compose.yml:
yaml
version: "3"
services:
loki:
image: grafana/loki:latest
ports:
- "3100:3100"
command: -config.file=/etc/loki/local-config.yaml
promtail:
image: grafana/promtail:latest
volumes:
- /var/log:/var/log
command: -config.file=/etc/promtail/config.yml
Khởi động Loki:
bash
docker-compose up -d
Giờ đây, Loki sẽ chạy tại:
👉 http://localhost:3100
Bước 2: Cấu Hình Promtail
Công việc của Promtail là gửi log vào Loki. Dưới đây là một ví dụ về tệp config.yml:
yaml
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
__path__: /var/log/*.log
Cấu hình này sẽ gửi log từ /var/log/*.log vào Loki.
Bước 3: Logging Python đến Loki
Bây giờ, chúng ta sẽ đẩy log từ ứng dụng Python vào Loki. Đầu tiên, bạn cần cài đặt bộ xử lý log cho Loki:
bash
pip install logging-loki
Cập nhật ứng dụng Python của bạn (app.py):
python
import logging
from logging_loki import LokiHandler
# URL của Loki (điều chỉnh theo cấu hình của bạn)
LOKI_URL = "http://localhost:3100/loki/api/v1/push"
# Cấu hình logger
logger = logging.getLogger("python-app")
logger.setLevel(logging.ERROR)
handler = LokiHandler(
url=LOKI_URL,
tags={"application": "my-python-app"},
version="1",
)
logger.addHandler(handler)
# Ví dụ: mô phỏng lỗi
try:
1 / 0
except Exception as e:
logger.error("🚨 Lỗi sản xuất xảy ra", exc_info=True)
Giờ đây, bất cứ khi nào ứng dụng của bạn gặp lỗi, nó sẽ được đẩy trực tiếp vào Loki với metadata có cấu trúc.
Bước 4: Truy Vấn Loki bằng Python
Đôi khi, bạn có thể muốn truy vấn Loki một cách lập trình (ví dụ, kiểm tra thời gian phản hồi API hoặc lỗi).
python
import requests
LOKI_QUERY_URL = "http://localhost:3100/loki/api/v1/query"
query = '{application="my-python-app"} |= "error"'
response = requests.get(LOKI_QUERY_URL, params={"query": query})
if response.status_code == 200:
results = response.json()["data"]["result"]
for log in results:
print(log)
Điều này cho phép bạn lấy log lỗi trực tiếp trong Python.
Bước 5: Thông Báo Slack cho Lỗi
Cuối cùng, chúng ta sẽ thông báo cho Slack khi có sự cố xảy ra.
Tạo Webhook trên Slack
- Đi đến Slack → Ứng dụng → Tạo ứng dụng → Incoming Webhooks
- Sao chép URL Webhook
Mã Python gửi thông báo
python
import requests
import json
import logging
from logging_loki import LokiHandler
# URL webhook Slack
SLACK_WEBHOOK_URL = "https://hooks.slack.com/services/XXX/YYY/ZZZ"
def send_slack_alert(message: str):
payload = {"text": message}
headers = {"Content-Type": "application/json"}
res = requests.post(SLACK_WEBHOOK_URL, data=json.dumps(payload), headers=headers)
if res.status_code != 200:
print(f"Thông báo Slack thất bại: {res.text}")
# Logger Loki
LOKI_URL = "http://localhost:3100/loki/api/v1/push"
logger = logging.getLogger("python-app")
logger.setLevel(logging.ERROR)
logger.addHandler(LokiHandler(url=LOKI_URL, tags={"app": "python-app"}, version="1"))
# Ví dụ: mô phỏng lỗi sản xuất
try:
result = 1 / 0
except Exception as e:
error_message = f"🚨 Lỗi trong sản xuất: {str(e)}"
logger.error(error_message, exc_info=True) # gửi đến Loki
send_slack_alert(error_message) # gửi đến Slack
Quy Trình Cuối Cùng
- Ứng dụng Python chạy trong môi trường sản xuất
- Mọi lỗi → Được ghi lại vào Loki
- Lỗi tương tự → Được kích hoạt như một thông báo Slack
Điều này mang đến cho tôi hai lớp giám sát:
- Lịch sử log đầy đủ trong Loki (qua bảng điều khiển Grafana)
- Thông báo thời gian thực trong Slack
✅ Kết Luận
Kết hợp Loki, Python và Slack, tôi đã có một hệ thống ghi nhận và cảnh báo tập trung:
- Loki thu thập và lập chỉ mục tất cả log
- Python đẩy lỗi có cấu trúc trực tiếp
- Slack ngay lập tức thông báo cho nhóm khi có sự cố xảy ra
Cấu hình này đã giúp tôi tiết kiệm thời gian gỡ lỗi và đảm bảo rằng tôi không bao giờ bỏ lỡ vấn đề sản xuất nào.