Tự động hóa phân tích Log: Kết hợp Vector, DeepSeek-R1 và Telegram để ‘nhàn thân’ khi On-call

Artificial Intelligence tutorial - IT technology blog
Artificial Intelligence tutorial - IT technology blog

Bối cảnh: Tại sao mình chọn bộ ba Vector – DeepSeek – Telegram?

Sau hơn 6 tháng vận hành hệ thống microservices, mình đối mặt với một cơn ác mộng: Hơn 50GB log sinh ra mỗi ngày nhưng 99% trong số đó là dữ liệu vô nghĩa. Quy trình xử lý lỗi cũ của mình rất thủ công. Đầu tiên là nhận thông báo, sau đó SSH vào server để grep log, và cuối cùng là copy-paste vào ChatGPT. Cách làm này cực kỳ mệt mỏi, nhất là khi sự cố xảy ra vào lúc 2 giờ sáng.

Khi tìm kiếm giải pháp thay thế, mình đã cân nhắc ELK Stack. Tuy nhiên, ELK quá nặng nề cho các cụm server vừa và nhỏ vì ngốn tới vài GB RAM chỉ để khởi động. Cuối cùng, mình chọn Vector. Đây là công cụ thu thập log viết bằng Rust, siêu nhẹ và chỉ tiêu tốn khoảng 20-30MB RAM. Kết hợp với DeepSeek-R1 (cái tên đang gây bão với khả năng suy luận) và Telegram, mình đã tạo ra một “trợ lý” trực chiến 24/7.

Điểm ăn tiền nhất của DeepSeek-R1 là khả năng đọc hiểu ngữ cảnh log. Nó không chỉ báo lỗi Internal Server Error vô hồn. Nó sẽ chỉ đích danh: “Connection pool của database bị tràn, hãy tăng max_connections hoặc kiểm tra rò rỉ kết nối”. Nhờ vậy, team mình đã giảm được 70% thời gian xử lý sự cố (MTTR).

Cài đặt các thành phần cốt lõi

1. Cài đặt Vector

Vector đóng vai trò là “người vận chuyển” dữ liệu. Nó gom log từ file hoặc Docker container rồi đẩy về phía AI. Trên Linux, bạn có thể cài đặt nhanh trong vòng 30 giây:

curl --proto '=https' --tlsv1.2 -sSf https://sh.vector.dev | sh

2. Chạy DeepSeek-R1 local qua Ollama

Để bảo mật dữ liệu và tránh rò rỉ log nhạy cảm lên cloud, mình chạy DeepSeek-R1 ngay trên server nội bộ. Nếu server không có GPU, bạn hãy dùng bản 7B hoặc 14B để chạy mượt mà trên CPU.

# Cài đặt Ollama
curl -fsSL https://ollama.com/install.sh | sh

# Kéo model DeepSeek-R1 về
ollama run deepseek-r1:7b

3. Thiết lập Telegram Bot

Bạn chỉ cần chat với @BotFather để lấy Bot Token. Sau đó, dùng @userinfobot để lấy Chat ID cá nhân. Đây sẽ là kênh nhận các bản tin phân tích lỗi theo thời gian thực.

Cấu hình hệ thống phân tích

Trái tim của hệ thống nằm ở file vector.yaml. Thay vì đẩy toàn bộ log đi gây lãng phí tài nguyên, mình chỉ lọc ra các log có level ERROR hoặc CRITICAL.

Bước 1: Lọc và định dạng log

Đoạn cấu hình sau sẽ theo dõi file log và loại bỏ các thông tin dư thừa trước khi gửi cho AI.

sources:
  app_logs:
    type: "file"
    include:
      - "/var/log/myapp/*.log"
    read_from: "beginning"

transforms:
  error_filter:
    type: "filter"
    inputs:
      - "app_logs"
    condition: |
      includes(["ERROR", "CRITICAL", "EXCEPTION"], upcase!(string!(.message) ?? ""))

  log_formatter:
    type: "remap"
    inputs:
      - "error_filter"
    source: |
      .content = "Hệ thống gặp lỗi sau: " + .message
      del(.file)
      del(.host)

Bước 2: Xây dựng cầu nối AI (AI Bridge)

Hiện tại Vector chưa hỗ trợ gọi trực tiếp vào Ollama theo dạng hội thoại. Vì vậy, mình viết một script Python nhỏ để làm trung gian. Script này nhận log, hỏi DeepSeek-R1, rồi bắn kết quả sang Telegram.

import requests
from flask import Flask, request

app = Flask(__name__)

OLLAMA_URL = "http://localhost:11434/api/generate"
TELEGRAM_TOKEN = "YOUR_BOT_TOKEN"
CHAT_ID = "YOUR_CHAT_ID"

def ask_deepseek(log_content):
    prompt = f"Bạn là chuyên gia DevOps. Hãy phân tích lỗi sau và đưa ra nguyên nhân, cách khắc phục ngắn gọn: {log_content}"
    payload = {"model": "deepseek-r1:7b", "prompt": prompt, "stream": False}
    response = requests.post(OLLAMA_URL, json=payload)
    return response.json().get("response", "Không thể phân tích lỗi.")

@app.route('/alert', methods=['POST'])
def handle_log():
    log_data = request.json
    analysis = ask_deepseek(log_data.get("content", ""))
    
    msg = f"🚨 *CẢNH BÁO LỖI HỆ THỐNG*\n\n📝 *Log:* {log_data['content']}\n\n💡 *Phân tích:*\n{analysis}"
    requests.post(f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendMessage", 
                  data={"chat_id": CHAT_ID, "text": msg, "parse_mode": "Markdown"})
    return "OK", 200

if __name__ == '__main__':
    app.run(port=5000)

Thành quả thực tế

Để kiểm chứng, mình thử giả lập một lỗi mất kết nối Database bằng lệnh:

echo "2024-05-20 15:30:00 ERROR: Connection timeout to database 10.0.0.5:5432" >> /var/log/myapp/app.log

Chưa đầy 5 giây sau, Telegram báo tin nhắn mới. Nội dung cực kỳ chi tiết:

🚨 CẢNH BÁO LỖI HỆ THỐNG
📝 Log: Connection timeout to database 10.0.0.5:5432
💡 Phân tích:
Nguyên nhân có thể do firewall đang chặn port 5432 hoặc Database server bị treo. Bạn nên kiểm tra lệnh `nc -zv 10.0.0.5 5432` để xác minh kết nối mạng.

Kinh nghiệm thực tế cho thấy DeepSeek-R1 thường trả về phần suy luận (thẻ <think>) khá dài. Bạn nên tinh chỉnh prompt để AI chỉ tập trung vào kết quả cuối cùng. Ngoài ra, hãy thiết lập rate_limit trong Vector sink. Điều này giúp tránh tình trạng “spam” tin nhắn khi hệ thống gặp lỗi dây chuyền.

Hệ thống này đã chạy ổn định nửa năm nay và thực sự là cứu cánh cho những team ít nhân sự. Chúc các bạn triển khai thành công!

Share: