# RCAEval 學習筆記
## 1. RCAEval 基本概念
RCAEval 是一個開源的基準測試工具,專為微服務系統中的根因分析(Root Cause Analysis, RCA)而設計。根據 arXiv 上發表的論文《RCAEval: A Benchmark for Root Cause Analysis of Microservice Systems with Telemetry Data》,這個工具提供了全面的數據集和評估環境,用於評估各種 RCA 方法的效能。
### 1.1 RCAEval 的目的
RCAEval 的主要目的是評估因果發現(causal discovery)和根因分析(RCA)方法在微服務系統中的性能。它解決了當前領域中缺乏標準基準測試的問題,提供了:
- 三個全面的數據集,包含來自三個微服務系統的 735 個故障案例
- 覆蓋各種在現實世界中觀察到的故障類型
- 包含 15 個可重現的基線方法的評估框架
- 支持粗粒度和細粒度 RCA 的評估能力
### 1.2 微服務系統中的根因分析問題
在複雜的微服務架構中,當系統發生故障時,快速準確地識別根本原因變得非常具有挑戰性:
- 微服務之間存在複雜的依賴關係
- 故障可能在系統中迅速傳播
- 監控系統產生大量的指標數據
- 手動排查非常耗時且容易出錯
RCAEval 旨在幫助研究人員和實踐者開發和評估能夠自動識別故障根因的方法,從而減少系統恢復時間並提高可靠性。
## 2. 因果推斷與根因分析的理論基礎
### 2.1 因果推斷基礎
因果推斷是研究事件之間因果關係的科學方法,在根因分析中起著核心作用。在微服務系統中,因果推斷主要涉及:
- **因果圖 (Causal Graph)**: 描述系統中變量間因果關係的有向圖
- **時間序列數據**: 系統中各組件隨時間變化的監控指標
- **干預 (Intervention)**: 系統故障可視為對某些組件的干預
- **反事實推理 (Counterfactual Reasoning)**: 推斷若故障未發生系統會如何運行
### 2.2 常見的因果發現算法
RCAEval 評估了多種因果發現算法,這些算法用於從觀察數據中學習因果結構:
1. **基於約束的方法**:
- **PC 算法**: 通過條件獨立性檢驗構建因果圖
- **FCI 算法**: PC 算法的擴展,能處理潛在變量
2. **基於評分的方法**:
- **GES (Greedy Equivalence Search)**: 基於評分函數貪心搜索因果結構
3. **基於函數的方法**:
- **LiNGAM**: 假設線性非高斯累加噪聲模型來發現因果關係
4. **基於時間序列的方法**:
- **Granger 因果**: 利用時間序列預測能力判斷因果關係
- **PCMCI+**: 結合 PC 算法和條件獨立性檢驗處理時間序列數據
### 2.3 RCA 方法分類
根據論文,RCA 方法可以分為以下幾類:
1. **基於異常檢測的方法**:
- **NSigma**: 基於統計閾值檢測異常
- **BARO**: 利用隨機森林檢測異常並排序可能的根因
2. **基於因果推斷的方法**:
- **CausalRCA**: 結合因果發現和異常檢測
- **CIRCA**: 通過因果圖和異常評分識別根因
- **MicroCause**: 特別為微服務系統設計的因果 RCA 方法
3. **基於圖算法的方法**:
- **RCD (Root Cause Diagnosis)**: 利用服務依賴圖定位根因
- **E-Diagnosis**: 基於信息熵的根因定位
4. **混合方法**:
- **RUN**: 結合異常檢測和圖算法的方法
## 3. RCAEval 數據集
RCAEval 提供了兩類數據集:合成數據集和真實微服務系統數據集。這些數據集用於評估不同 RCA 方法的效能。
### 3.1 合成數據集
合成數據集主要用於評估因果發現算法的性能,它們具有已知的真實因果結構。RCAEval 包含以下合成數據集:
1. **CIRCA10 & CIRCA20**:
- 10/20 個節點的因果圖
- 基於線性結構方程模型 (SEMs) 生成
- 包含不同類型的干預(如單點或多點故障)
2. **RCD10 & RCD20**:
- 10/20 個節點的因果圖
- 模擬微服務監控指標的時間序列
- 包含不同類型的故障注入
3. **CausIL10 & CausIL20**:
- 10/20 個節點的因果圖
- 使用 pyAgrum 生成隨機有向無環圖 (DAG)
- 支持不同噪聲模型的數據生成
這些合成數據集的優勢在於:
- 提供已知的真實因果關係作為評估基準
- 能夠控制實驗變量(如圖的大小、噪聲水平等)
- 允許系統地評估算法在不同條件下的表現
### 3.2 基準微服務數據集
RCAEval 包含來自三個真實微服務系統的數據:
1. **Sock Shop**:
- 包含 13 個微服務的電子商務應用
- 182 個監控指標
- 60 個故障案例,覆蓋多種故障類型
2. **Online Boutique**:
- Google 開發的示範性電子商務平台
- 11 個微服務,115 個監控指標
- 75 個故障案例
3. **Train Ticket**:
- 中國復旦大學開發的鐵路訂票系統
- 41 個微服務,212 個監控指標
- 600 個故障案例
每個數據集包含以下故障類型:
- **CPU 壓力**: 模擬 CPU 資源耗盡
- **內存壓力**: 模擬內存資源耗盡
- **磁盤壓力**: 模擬磁盤 I/O 壓力
- **網絡延遲**: 模擬服務間通信延遲增加
- **網絡丟包**: 模擬網絡連接不穩定導致的數據包丟失
### 3.3 數據收集與標注
RCAEval 的數據收集過程遵循以下步驟:
1. **部署微服務系統**:
- 使用 Kubernetes 和 Istio 部署微服務
- 設置 Prometheus 和 cAdvisor 收集監控指標
2. **故障注入**:
- 使用 Istio 故障注入機制引入網絡故障
- 使用定制腳本引入資源壓力故障
3. **數據標注**:
- 記錄故障注入的服務和指標作為根因
- 為每個故障案例生成標準答案(Ground Truth)
4. **數據預處理**:
- 時間序列對齊和重採樣
- 異常值處理和特徵標準化
- 生成時間窗口數據(用於評估不同長度的時間序列)
## 4. RCAEval 安裝與設置
要開始使用 RCAEval,需要先進行安裝和環境設置。本節介紹如何設置 RCAEval 環境並開始運行實驗。
### 4.1 系統需求
根據 RCAEval 的 GitHub 倉庫資訊,推薦的系統配置為:
- **處理器**:至少 8 核 CPU
- **內存**:至少 16GB RAM
- **存儲**:至少 50GB 空間(用於存儲數據集和實驗結果)
- **操作系統**:推薦 Linux(如 Ubuntu 18.04+),但也支持 Windows 和 macOS
### 4.2 軟件依賴
RCAEval 依賴以下主要軟件和庫:
Ubuntu 22.04
1. **Python 環境**:
- Python 3.8 或更高版本
- 依賴庫:numpy, pandas, scikit-learn, matplotlib, networkx, scipy
2. **因果發現庫**:
- causal-learn:用於實現 PC、FCI 等算法
- tigramite:用於時間序列因果發現(PCMCI+)
- pygam:用於實現 LiNGAM 和相關方法
3. **深度學習庫**(可選):
- PyTorch:用於實現一些基於深度學習的 RCA 方法
- TensorFlow:某些方法的可選依賴
### 4.3 安裝步驟
https://github.com/phamquiluan/RCAEval/blob/main/README.md
按照以下步驟安裝 RCAEval:
```
sudo apt update
sudo apt install -y python3.10-dev build-essential libffi-dev libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev liblzma-dev libgomp1
```
1. **克隆倉庫**:
```bash
git clone https://github.com/phamquiluan/RCAEval.git
cd RCAEval
```
2. **創建虛擬環境**(推薦):
```bash
python -m venv rcaeval-env
sudo apt install -y python3.10-venv # 在 Linux 上
python3 -m venv rcaeval-env # 在 Linux 上
source rcaeval-env/bin/activate # 在 Linux/macOS 上
# 或
rcaeval-env\Scripts\activate # 在 Windows 上
```
關閉與重建
```
deactivate
rm -rf ~/RCAEval/rcaeval-env
python3.10 -m venv ~/RCAEval/rcaeval-env
source ~/RCAEval/rcaeval-env/bin/activate
python -m pip install --upgrade pip wheel
python -m pip install -r requirements.txt
```
3. **安裝依賴**:
```bash
sudo apt update
sudo apt install -y build-essential libffi-dev libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev liblzma-dev libgomp1
source ~/RCAEval/rcaeval-env/bin/activate
python -m pip install --upgrade pip wheel
python -m pip install numpy==1.23.5 matplotlib==3.7.1
python3 -m pip install -r requirements.txt #in Linux
```
**TEST**
`python -m pytest tests/test.py::test_basic`
4. **下載數據集**:
RCAEval 的數據集可從 Zenodo 下載,或使用提供的腳本自動下載:
```bash
# 確保您在 RCAEval 倉庫根目錄
python -c "from RCAEval.utility import download_re1_dataset, download_re2_dataset, download_re3_dataset; download_re1_dataset()"
python -c "from RCAEval.utility import download_re1_dataset, download_re2_dataset, download_re3_dataset; download_re2_dataset()"
python -c "from RCAEval.utility import download_re1_dataset, download_re2_dataset, download_re3_dataset; download_re3_dataset()"
```
### 4.4 目錄結構
安裝完成後,RCAEval 的主要目錄結構如下:
```
RCAEval/
├── RCAEval/ # 主要源代碼
│ ├── causal_discovery/ # 因果發現算法實現
│ ├── rca/ # RCA 方法實現
│ ├── datasets/ # 數據集處理模塊
│ └── evaluation/ # 評估指標和工具
├── data/ # 數據集存儲位置
│ ├── synthetic/ # 合成數據集
│ └── microservices/ # 微服務數據集
├── experiments/ # 實驗配置和腳本
├── results/ # 實驗結果存儲位置
├── scripts/ # 輔助腳本
└── examples/ # 使用示例
```
### 4.5 基本配置
在開始運行實驗前,可能需要進行一些基本配置:
1. **配置數據路徑**:
編輯 `config.py` 文件,設置數據集路徑和結果輸出路徑。
2. **選擇 GPU**(如果可用):
對於支持 GPU 的方法,可通過環境變量指定 GPU:
```bash
export CUDA_VISIBLE_DEVICES=0 # 使用第一個 GPU
```
3. **調整並行處理**:
編輯配置文件,設置並行處理的線程數(根據您的 CPU 核心數)。
## 5. 運行 RCAEval 實驗
本節介紹如何使用 RCAEval 運行因果發現和根因分析實驗。
### 5.1 運行因果發現實驗
因果發現實驗主要用於評估不同算法在識別系統中因果關係的能力。以下是運行因果發現實驗的步驟:
1. **選擇數據集**:
根據實驗需求選擇適當的合成數據集,如 CIRCA10、RCD10 等。
2. **選擇因果發現算法**:
可以選擇單個算法或多個算法進行比較。
3. **運行命令**:
```bash
python main-causal.py --dataset circa10 --method pc
```
其中 `--dataset` 指定使用的數據集,`--method` 指定使用的因果發現算法。
4. **查看結果**:
實驗結果將保存在 `results/` 目錄下,包括學習到的因果圖和性能指標(如準確率、召回率、F1 分數)。
**示例**:評估不同算法在 CIRCA10 數據集上的表現:
```bash
# 運行 PC 算法
python main-causal.py --dataset circa10 --method pc
# 運行 FCI 算法
python main-causal.py --dataset circa10 --method fci
# 運行 Granger 因果
python main-causal.py --dataset circa10 --method granger
```
### 5.2 運行 RCA 實驗
RCA 實驗評估不同方法在識別故障根因的能力。以下是運行 RCA 實驗的步驟:
1. **選擇數據集**:
選擇微服務數據集,如 sock-shop、online-boutique 或 train-ticket。
2. **選擇 RCA 方法**:
選擇一個或多個 RCA 方法進行評估。
3. **運行命令**:
```bash
python main-ase.py --dataset online-boutique --method baro
```
其中 `--dataset` 指定使用的數據集,`--method` 指定使用的 RCA 方法。
4. **查看結果**:
實驗結果將保存在 `results/` 目錄下,包括每種故障類型的 Avg@5 分數和運行時間。
**示例**:比較不同 RCA 方法在 Online Boutique 數據集上的表現:
```bash
# 運行 BARO 方法
python main-ase.py --dataset online-boutique --method baro
# 運行 NSigma 方法
python main-ase.py --dataset online-boutique --method nsigma
# 運行 CIRCA 方法
python main-ase.py --dataset online-boutique --method circa
```
### 5.3 實驗參數設置
RCAEval 提供了多種參數設置,用於調整實驗配置:
1. **時間延遲參數** (`--tdelta`):
模擬異常檢測延遲的參數,影響 RCA 方法的性能:
```bash
python main-ase.py --dataset online-boutique --method baro --tdelta 60
```
上述命令模擬了 60 秒的異常檢測延遲。
2. **時間序列長度** (`--length`):
設置時間序列的長度,用於評估數據長度對方法性能的影響:
```bash
python main-ase.py --dataset online-boutique --method baro --length 300
```
上述命令使用長度為 300 的時間序列數據。
3. **測試模式** (`--test`):
快速測試模式,僅運行部分實驗,用於驗證設置是否正確:
```bash
python main-ase.py --dataset online-boutique --method baro --test
```
### 5.4 實驗結果分析
RCAEval 提供了多種工具來分析和可視化實驗結果:
1. **性能指標**:
- **Avg@5**:前 5 個預測中包含真實根因的平均分數
- **精確率**:預測根因的準確性
- **召回率**:找到真實根因的能力
- **F1 分數**:精確率和召回率的調和平均
- **運行時間**:方法執行所需的時間
2. **故障類型分析**:
RCAEval 分析不同方法在各種故障類型上的性能,如 CPU、內存、磁盤、網絡延遲和網絡丟包。
3. **結果可視化**:
```bash
python scripts/visualize_results.py --results_dir results/online-boutique
```
此命令將生成各種可視化圖表,幫助比較不同方法的性能。
4. **結果匯總**:
```bash
python scripts/summarize_results.py --results_dir results
```
此命令將生成匯總報告,包括所有實驗的關鍵結果。
## 6. RCAEval 進階使用與自定義
本節介紹如何深入理解 RCAEval 的實現細節,並進行自定義和擴展。
### 6.1 自定義 RCA 方法
RCAEval 允許用戶實現和評估自己的 RCA 方法。以下是實現新方法的步驟:
1. **創建新方法**:
在 `RCAEval/rca/` 目錄下創建新的 Python 文件,例如 `my_method.py`。
2. **實現方法接口**:
新方法需要實現標準接口,包括 `detect` 和 `localize` 方法:
```python
class MyMethod:
def __init__(self, params=None):
self.params = params or {}
# 初始化方法參數
def detect(self, data):
# 實現異常檢測邏輯
# 輸入: data - 時間序列數據
# 輸出: 異常時間點
return anomaly_timestamps
def localize(self, data, anomaly_timestamps):
# 實現根因定位邏輯
# 輸入: data - 時間序列數據, anomaly_timestamps - 異常時間點
# 輸出: 根因排名列表
return ranked_root_causes
```
3. **註冊方法**:
在 `RCAEval/rca/__init__.py` 中註冊您的方法:
```python
from .my_method import MyMethod
# 更新方法字典
METHODS = {
# 現有方法...
'my_method': MyMethod,
}
```
4. **運行新方法**:
```bash
python main-ase.py --dataset online-boutique --method my_method
```
### 6.2 自定義因果發現算法
類似地,您可以實現和評估自己的因果發現算法:
1. **創建新算法**:
在 `RCAEval/causal_discovery/` 目錄下創建新的 Python 文件。
2. **實現算法接口**:
```python
class MyAlgorithm:
def __init__(self, params=None):
self.params = params or {}
def discover(self, data):
# 實現因果發現邏輯
# 輸入: data - 時間序列數據
# 輸出: 學習到的因果圖(鄰接矩陣或圖對象)
return causal_graph
```
3. **註冊算法**:
在 `RCAEval/causal_discovery/__init__.py` 中註冊您的算法。
4. **運行新算法**:
```bash
python main-causal.py --dataset circa10 --method my_algorithm
```
### 6.3 生成自定義數據集
RCAEval 支持生成和評估自定義數據集:
1. **合成數據集生成**:
使用 RCAEval 提供的工具生成合成數據:
```python
from RCAEval.datasets import SyntheticDataGenerator
# 設定參數
params = {
'n_nodes': 15,
'edge_density': 0.3,
'noise_type': 'gaussian',
'interventions': ['single', 'multiple'],
}
# 生成數據
generator = SyntheticDataGenerator(params)
data, ground_truth = generator.generate()
# 保存數據
generator.save('data/synthetic/my_dataset')
```
2. **使用真實微服務系統**:
您也可以部署自己的微服務系統,收集監控數據:
- 使用 Kubernetes 和 Istio 部署服務
- 設置 Prometheus 收集指標
- 編寫故障注入腳本
- 預處理和標注數據
3. **註冊數據集**:
在配置文件中註冊新數據集,使其可用於實驗。
### 6.4 擴展評估指標
RCAEval 允許添加自定義評估指標,以滿足特定需求:
1. **實現新指標**:
在 `RCAEval/evaluation/` 目錄下創建新的評估指標:
```python
def my_metric(predictions, ground_truth):
# 實現評估邏輯
# 輸入: predictions - 方法預測結果, ground_truth - 真實根因
# 輸出: 評估分數
return score
```
2. **註冊指標**:
在評估模塊中註冊新指標,使其可用於結果分析。
3. **使用新指標**:
修改結果分析腳本,使用新指標評估方法性能。
### 6.5 高級分析技術
RCAEval 支持一些高級分析技術,用於深入理解 RCA 方法的行為:
1. **敏感性分析**:
評估方法對參數變化的敏感性:
```bash
python scripts/sensitivity_analysis.py --method baro --parameter alpha --range 0.1,0.5,0.1
```
2. **跨數據集分析**:
分析方法在不同數據集上的表現一致性:
```bash
python scripts/cross_dataset_analysis.py --method baro,nsigma,circa
```
3. **統計顯著性測試**:
使用統計測試確定方法間性能差異的顯著性:
```bash
python scripts/significance_test.py --methods baro,nsigma --metric avg5
```
### 6.6 與其他系統集成
RCAEval 可以與其他系統集成,擴展其功能:
1. **與監控系統集成**:
- 與 Prometheus、Grafana 等工具集成
- 實時收集和分析數據
- 自動觸發 RCA 流程
2. **與 CI/CD 流程集成**:
- 在部署過程中自動評估 RCA 方法
- 持續監測方法性能
- 自動選擇最佳方法