Tinh chỉnh tham số dự báo để giảm False Positive
Trong môi trường AIOps thực tế, các mô hình LLM thường báo động giả (false positive) khi gặp nhiễu dữ liệu hoặc biến động nhỏ không đáng lo ngại. Bạn cần điều chỉnh ngưỡng (threshold) và độ tin cậy (confidence) trong logic ra quyết định.
Tại sao: Việc này giúp giảm tải cho đội vận hành (SRE) và tập trung vào các sự cố thực sự, tránh hiện tượng "cảnh báo mệt mỏi" (alert fatigue).
Kết quả mong đợi: Tỷ lệ cảnh báo chính xác tăng lên, số lượng cảnh báo giả giảm dưới 5% tổng số cảnh báo.
Đầu tiên, bạn cần xác định file cấu hình logic xử lý cảnh báo trong ứng dụng AIOps của mình. Giả sử ứng dụng này chạy trên Python và sử dụng thư viện `pydantic` để validate đầu ra của LLM.
Chỉnh sửa file cấu hình tham số dự báo tại đường dẫn:
cat > /opt/aio-predict/config/thresholds.yaml
Sau khi cập nhật file, bạn cần restart service xử lý dự báo để áp dụng cấu hình mới.
systemctl restart aio-predict-worker
Để verify kết quả, hãy kiểm tra logs xem hệ thống có lọc được các cảnh báo có độ tin cậy thấp không.
journalctl -u aio-predict-worker -f | grep -E "confidence|skipped|alert_triggered" | tail -20
Trong log, bạn sẽ thấy các dòng ghi nhận việc bỏ qua (skipped) các dự báo có `risk_score` dưới 0.85 hoặc chưa đủ `consecutive_violations`.
Xử lý lỗi kết nối Prometheus - Thanos - LLM
Hệ thống AIOps phụ thuộc vào chuỗi: Prometheus (Real-time) -> Thanos (Long-term) -> LLM (Inference). Một điểm yếu trong chuỗi sẽ làm gián đoạn toàn bộ pipeline. Bạn cần thiết lập cơ chế Circuit Breaker và Retry logic.
Tại sao: Để hệ thống tự động phục hồi (self-healing) khi một thành phần tạm thời mất kết nối mà không cần can thiệp thủ công.
Kết quả mong đợi: Khi Thanos hoặc LLM API down, hệ thống AIOps sẽ tự động chuyển sang chế độ "Degraded Mode" (dùng cache hoặc data cũ) thay vì crash.
Bạn cần cấu hình cơ chế Circuit Breaker trong ứng dụng Python của mình. Sử dụng thư viện `tenacity` cho retry và `pybreaker` cho circuit breaker.
Chỉnh sửa file xử lý kết nối tại:
cat > /opt/aio-predict/src/connectivity_handler.py dict:
url = os.getenv("LLM_API_URL")
headers = {"Authorization": f"Bearer {os.getenv('LLM_API_KEY')}"}
response = requests.post(url, json={"prompt": prompt}, headers=headers, timeout=10)
response.raise_for_status()
return response.json()
def query_metrics_safe(query: str, range_seconds: int = 3600):
"""
An toàn khi query Thanos. Nếu Thanos down, fallback sang Prometheus local.
"""
try:
with thanos_breaker:
# Giả định logic query Thanos
logger.info(f"Querying Thanos: {query}")
# code logic query thanos real...
return {"source": "thanos", "data": []}
except CircuitBreakerError as e:
logger.warning(f"Circuit breaker triggered for Thanos. Fallback to Prometheus local.")
# Fallback logic
return {"source": "prometheus_local", "data": []}
except Exception as e:
logger.error(f"Unexpected error in Thanos query: {e}")
return {"source": "fallback", "data": []}
EOF
Để test cơ chế này, bạn cần mô phỏng lỗi bằng cách tắt service Thanos Query hoặc chặn port.
systemctl stop thanos-query
# Chạy script test
python3 -c "from src.connectivity_handler import query_metrics_safe; print(query_metrics_safe('up'))"
Verify kết quả: Kiểm tra log, bạn sẽ thấy dòng "Circuit breaker triggered" và hệ thống chuyển sang dùng "prometheus_local" hoặc "fallback" mà không báo lỗi dừng chương trình.
tail -n 20 /var/log/aio-predict/worker.log | grep -E "Circuit breaker|Fallback|Fallback to"
Tối ưu hóa chi phí Token khi sử dụng LLM
Khi gửi toàn bộ lịch sử metrics (vài năm) vào LLM, chi phí token sẽ tăng vọt và vượt quá giới hạn context window. Bạn cần áp dụng chiến lược "Summarization" và "Sampling" trước khi gửi đến LLM.
Tại sao: Giảm chi phí vận hành (OpEx) và tăng tốc độ phản hồi bằng cách chỉ gửi dữ liệu có ý nghĩa thống kê.
Kết quả mong đợi: Giảm 60-80% số lượng token tiêu thụ trên mỗi lần dự báo mà vẫn giữ độ chính xác.
Áp dụng kỹ thuật "Downsampling" và "Anomaly Extraction" trong pipeline ETL. Chỉ gửi các điểm dữ liệu bất thường (anomalies) hoặc các điểm thống kê (max, min, avg) cho LLM.
Chỉnh sửa script xử lý dữ liệu tại:
cat > /opt/aio-predict/src/token_optimizer.py str:
"""
Chuyển đổi chuỗi metrics thô thành văn bản tóm tắt để giảm token.
1. Tính thống kê: Mean, Std, Min, Max.
2. Chỉ giữ các điểm lệch > 2 Std (Anomalies).
3. Format thành chuỗi ngắn gọn.
"""
if not raw_metrics:
return "No data available."
values = np.array([m['value'] for m in raw_metrics])
timestamps = [m['timestamp'] for m in raw_metrics]
# Tính toán thống kê
mean_val = np.mean(values)
std_val = np.std(values)
min_val = np.min(values)
max_val = np.max(values)
# Xác định các điểm bất thường
anomalies = []
for i, val in enumerate(values):
if abs(val - mean_val) > 2 * std_val:
anomalies.append({
"time": timestamps[i],
"value": val,
"deviation": (val - mean_val) / std_val if std_val > 0 else 0
})
# Xây dựng prompt ngắn gọn
summary = f"Stats: mean={mean_val:.2f}, std={std_val:.2f}, min={min_val:.2f}, max={max_val:.2f}. "
summary += f"Total points: {len(values)}, Anomalies found: {len(anomalies)}."
if len(anomalies) > 0:
# Chỉ gửi tối đa 5 anomaly gần nhất để tiết kiệm token
summary += f" Recent anomalies: "
for a in anomalies[-5:]:
summary += f"[{a['time']}: {a['value']:.2f} (dev: {a['deviation']:.2f})], "
else:
summary += " No anomalies detected in this window."
return summary
# Test function
if __name__ == "__main__":
# Giả lập dữ liệu
mock_data = [{"value": 100 + i*0.5, "timestamp": f"2023-10-27T10:{i:02d}:00"} for i in range(100)]
# Thêm một spike
mock_data[50]["value"] = 500
print(optimize_metrics_for_llm(mock_data))
EOF
Chạy script test để xem lượng token giảm như thế nào so với gửi toàn bộ mảng JSON.
cd /opt/aio-predict/src && python3 token_optimizer.py
Verify kết quả: So sánh độ dài chuỗi đầu ra. Thay vì gửi 1000 dòng JSON (khoảng 5000+ tokens), bạn chỉ gửi một đoạn văn bản tóm tắt (khoảng 200-300 tokens).
python3 -c "import token_optimizer; result = token_optimizer.optimize_metrics_for_llm(token_optimizer.mock_data); print(f'Token estimate: {len(result)//4} chars approx'); print(result)"
Các tips bảo mật cho API Keys và dữ liệu nhạy cảm
Hệ thống AIOps chứa nhiều secret: API Key của LLM, credentials của Prometheus, và dữ liệu log nội bộ. Tuyệt đối không hardcode vào file source code hoặc config file trên disk.
Tại sao: Ngăn chặn rò rỉ thông tin nếu repository code bị leak hoặc file config bị đọc bởi user không có quyền.
Kết quả mong đợi: Các secret được quản lý qua Vault hoặc Kubernetes Secrets, không xuất hiện dưới dạng plain text trong code hoặc log.
Sử dụng Kubernetes Secrets (hoặc HashiCorp Vault nếu có) để lưu trữ API Keys. Trong ứng dụng, chỉ đọc thông qua biến môi trường (Environment Variables) được inject bởi Kubernetes.
Tạo file secret.yaml cho Kubernetes (chạy trên server thực tế, đảm bảo base64 đã được encode đúng):
cat > /opt/aio-predict/deploy/secrets.yaml
Áp dụng secret vào cluster (thay thế namespace nếu khác):
kubectl create secret generic aio-llm-credentials --from-literal=LLM_API_KEY="sk-your-actual-openai-key-here" --from-literal=PROMETHEUS_BEARER_TOKEN="your-prometheus-auth-token" -n aios-platform
Trong code Python, sử dụng `os.getenv` và đảm bảo log không in ra giá trị của secret. Chỉnh sửa file logging config:
cat > /opt/aio-predict/config/logging_config.yaml
Tạo module lọc log để tự động che giấu secret trong log (SecureLogFilter):
cat > /opt/aio-predict/src/aio_logging.py
Verify kết quả: Chạy lại ứng dụng và cố tình in một secret trong log (để test filter), sau đó kiểm tra file log.
python3 -c "import logging; from aio_logging import setup_logging; setup_logging(); logging.info('My key is ' + open('/opt/aio-predict/deploy/secrets.yaml').read())" 2>&1 | grep -E "sk-|REDACTED"
Bạn sẽ thấy trong log xuất hiện `***REDACTED***` thay vì chuỗi key thực tế, đảm bảo an toàn ngay cả khi file log bị truy cập trái phép.
Điều hướng series:
Mục lục: Series: Xây dựng nền tảng AIOps với Prometheus, Thanos và LLM để dự báo sự cố
« Phần 5: Phát triển giao diện AIOps Dashboard và hệ thống cảnh báo thông minh