🕵️ RCAEval: A Benchmark for Root Cause Analysis
PhD Thesis | FSE 2026 TORAI | FSE 2026 EventADL | WWW 2025 RCAEval | ASE 2024 RCAEval v1 | FSE 2024 BARO
RCAEval is an open-source benchmark that offers nine datasets with 735 real failure cases, and an evaluation framework for root cause analysis (RCA) in microservice systems. It includes many reproducible baselines covering metric-based, trace-based, and multi-source RCA methods.
Prerequisites
We recommend using machines equipped with at least 8 cores, 16GB RAM, and ~50GB available disk space with Ubuntu 22.04 or 24.04, and Python 3.14 (Python 3.12 and 3.13 also work).
Installation
The default environment, which is used for most methods, can be easily installed as follows. Detailed installation instructions for all methods are in SETUP.md.
Open your terminal and run the following commands
sudo apt update -y
sudo apt install -y build-essential \
libxml2 libxml2-dev zlib1g-dev \
python3-tk graphviz
Clone RCAEval from GitHub
git clone https://github.com/phamquiluan/RCAEval.git && cd RCAEval
Create a virtual environment with Python 3.14 (refer to SETUP.md to see how to install Python 3.14 and its headers, python3.14-dev, on Ubuntu)
python3.14 -m venv env
. env/bin/activate
Install RCAEval using pip
pip install -e .[default]
optional, on machines without a GPU: use CPU-only torch instead (skips ~5GB of CUDA packages)
pip install -e .[default] --extra-index-url https://download.pytorch.org/whl/cpu
Or, install RCAEval from PyPI
# Install RCAEval from PyPI
pip install RCAEval[default]
Test the installation
python -m pytest tests/test.py::test_basic
Expected output after running the above command (it takes less than 1 minute)
``bash
$ pytest tests/test.py::test_basic
============================= test session starts ==============================
platform linux -- Python 3.14.9, pytest-9.2.0, pluggy-1.7.0
rootdir: /home/ubuntu/RCAEval
collected 1 item
tests/test.py . [100%]
============================== 1 passed in 7.16s ===============================
bash rcaeval-convert metrics --prometheus-url http://localhost:9090 --queries docs/examples/prometheus_queries.json \ --start 2024-01-15T21:12:00Z --end 2024-01-15T21:36:00Z --out case rcaeval-convert traces otel-traces.jsonl --out case rcaeval-convert logs loki.jsonl --field container=labels.container --field message=line --out case rcaeval-convert derive case --inject-time 2024-01-15T21:24:00Z## How-to-usepandas.DataFrameData format
The telemetry data must be presented as
. We require the data to have a column namedtimethat stores the timestep. A sample of valid data could be downloaded using thedownload_data()ordownload_multi_source_data()method that we will demonstrate shortly below.pip install RCAEval[convert]Converting your own telemetry
With
,rcaeval-convertbuilds a case directory in the format above from your own system: metrics from Prometheus, traces from OpenTelemetry (OTLP/JSON, which Jaeger, Zipkin and SkyWalking can export through the OpenTelemetry Collector), and logs from a JSON Lines, JSON or CSV export of any log store (ELK, Loki, Fluentd, ...). It also derives the log and trace time series the multi-source methods read. See docs/CONVERT.md.
### Basic usage example
A basic example to use BARO, a metric-based RCA baseline, to perform RCA are presented as follows,
python
You can put the code here to a file named test.py
from RCAEval.e2e import baro from RCAEval.utility import download_data, read_datadownload a sample data to data.csv
download_data()read data from data.csv
data = read_data("data.csv") anomaly_detected_timestamp = 1692569339perform root cause analysis
root_causes = baro(data, anomaly_detected_timestamp)["ranks"]print the top 5 root causes
print("Top 5 root causes:", root_causes[:5])Expected output after running the above code (it takes around 1 minute)
$ python test.py
Downloading data.csv..: 100%|████████████████████| 570k/570k [00:00<00:00, 19.8MiB/s]
Top 5 root causes: ['emailservice_mem', 'recommendationservice_mem', 'cartservice_mem', 'checkoutservice_latency', 'cartservice_latency']
bash rcaeval-agent export --dataset re2-ob --out agent_tasks python docs/examples/baro_agent.py agent_tasks/re2-ob preds.jsonl # replace with your agent rcaeval-agent evaluate --tasks agent_tasks/re2-ob --predictions preds.jsonlA tutorial of using Multi-source BARO to diagnose failure using multi-source telemetry data (metrics, logs, and traces) is presented in docs/multi-source-rca-demo.ipynb.main.pyA tutorial of using BARO to diagnose code-level faults is presented in docs/code-level-rca.ipynb.
Evaluating LLM agents
To evaluate an LLM agent, or any RCA method that does not run inside
, export a dataset as a blind task view, run your agent over it, and score the predictions file it writes:
python from huggingface_hub import snapshot_downloadThe task view renames every case to an anonymised id (the raw case directories are named after their root cause) and keeps the labels in a separate answers file. Predictions are scored with the same AC@k and Avg@k asmain.py.pip install RCAEval[agent]With
, RCAEval also ships the agents themselves.rcaeval-agent run --model <any LiteLLM model>runs a reference LLM agent over the task view.rcaeval-agent run-cli --agent claude-codelets an agent CLI investigate each case through RCAEval's MCP server. Both use the same tools for querying metrics, logs and traces, and both report cost and whether the agent looked at the root-cause service. See docs/AGENTS.md.{benchmark}_{service}_{fault}_{instance}Available Datasets
RCAEval benchmark includes nine datasets organized into three benchmark suites (RE1, RE2, RE3), each covering three microservice systems (Online Boutique, Sock Shop, Train Ticket). Together, these datasets feature 735 failure cases with 11 fault types. Each failure case includes annotated root cause service and root cause indicator (e.g., specific metric or log indicating the root cause).
| Dataset | System | Cases | Fault Types | Metrics | Logs | Traces | |---------|--------|-------|-------------|---------|------|--------| | RE1-OB | Online Boutique | 125 | cpu, mem, disk, delay, loss | 49-59 | N/A | N/A | | RE1-SS | Sock Shop | 125 | cpu, mem, disk, delay, loss | 57-63 | N/A | N/A | | RE1-TT | Train Ticket | 125 | cpu, mem, disk, delay, loss | 198-238 | N/A | N/A | | RE2-OB | Online Boutique | 90 | cpu, mem, disk, delay, loss, socket | 69-77 | Yes | Yes | | RE2-SS | Sock Shop | 90 | cpu, mem, disk, delay, loss, socket | 74-82 | Yes | N/A | | RE2-TT | Train Ticket | 90 | cpu, mem, disk, delay, loss, socket | 340-376 | Yes | Yes | | RE3-OB | Online Boutique | 30 | f1, f2, f3, f4, f5 | 68-101 | Yes | Yes | | RE3-SS | Sock Shop | 30 | f1, f2, f3, f4 | 80-107 | Yes | N/A | | RE3-TT | Train Ticket | 30 | f1, f2, f3, f4 | 294-322 | Yes | Yes | | TORAI-OB | Online Boutique | 90 | cpu, mem, disk, delay, loss, socket | 69-77 | Yes | Yes | | TORAI-SS | Sock Shop | 90 | cpu, mem, disk, delay, loss, socket | 74-82 | Yes | N/A | | TORAI-TT | Train Ticket | 90 | cpu, mem, disk, delay, loss, socket | 340-376 | Yes | Yes |
RE1 Datasets (375 cases): Metric-only data supporting metric-based RCA methods. Five fault types (CPU, MEM, DISK, DELAY, LOSS) across five services per system, with five repetitions per fault-service pair.
RE2 Datasets (270 cases): Multi-source data (metrics, logs, traces) supporting multi-source RCA methods. Six fault types (adds SOCKET) across five services per system, with three repetitions per fault-service pair.
RE3 Datasets (90 cases): Multi-source data focusing on code-level faults (F1-F5). Supports diagnosing code-level faults through telemetry data, e.g., leveraging stack traces in logs or response codes in traces.
File Structure
Each dataset directory follows the naming convention:
metrics.json: Time-series metrics datainject_time.txt: Fault injection timestamp (Unix timestamp)logs.csv: Log data (RE2 and RE3 only)traces.csv: Trace data (RE2 and RE3 only) Our datasets and their description are publicly available with the following information:metrics.jsonThe Hugging Face copy stores the same 735 cases as Parquet instead of
- Hugging Face (recommended): https://huggingface.co/datasets/phamquiluan/RCAEval (Parquet, 3.4GB on disk, downloadable one suite or one case at a time)
- Figshare: https://figshare.com/articles/dataset/RCAEval_A_Benchmark_for_Root_Cause_Analysis_of_Microservice_Systems/31048672 (more structured format, with additional preprocessed series)
- Zenodo: https://zenodo.org/records/14590730 (DOI for citation: https://doi.org/10.5281/zenodo.14590730)
/logs.csv/traces.csv. It is 3.4GB to download against 5.2GB of zip archives on Zenodo, and about eleven times smaller once extracted, since those archives expand to roughly 38GB. Unlike a zip archive it can also be fetched a suite or a single case at a time, so you never download telemetry you will not use:
one suite (use "re2" or "re3" for the others, or omit to get all 735 cases)
snapshot_download( repo_id="phamquiluan/RCAEval", repo_type="dataset", allow_patterns="re1*", local_dir="data", )python import pandas as pdcases.parquetin that repository indexes all 735 cases with their ground-truth root cause service, fault type, injection time, and telemetry sizes, so you can select a subset before downloading any telemetry:
idx = pd.read_parquet("hf://datasets/phamquiluan/RCAEval/cases.parquet") print(idx[idx.dataset == "RE2-TT"][["case", "root_cause_service", "fault", "n_metrics"]])
python from RCAEval.utility import read_metricsRCAEval.utility.read_metrics,read_logsandread_tracesread either layout, so code written against the original files works unchanged with the Parquet copy:
df = read_metrics("data/re1ob_adservice_cpu_1") # metrics.parquet or metrics.json
python from RCAEval.utility import ( download_re1_dataset, download_re2_dataset, download_re3_dataset, )We also provide utility functions to download our datasets using Python. The downloaded datasets will be available at directorydata.
download_re1_dataset() download_re2_dataset() download_re3_dataset()
<details>
<summary>Expected output after running the above code (it takes half an hour to download and extract the datasets. )</summary>
$ python test.py
Downloading RE1.zip..: 100%|█████████████████████| 390M/390M [01:02<00:00, 6.22MiB/s]
Downloading RE2.zip..: 100%|███████████████████| 4.21G/4.21G [11:23<00:00, 6.17MiB/s]
Downloading RE3.zip..: 100%|█████████████████████| 534M/534M [01:29<00:00, 5.97MiB/s]
python main.py [-h] [--dataset DATASET] [--method METHOD]</details>e2eAvailable Baselines
RCAEval stores all the RCA methods in the
module (implemented inRCAEval.e2e). There are many RCA baselines available: RUN, CausalRCA, CIRCA, RCD, MicroCause, MSCRED, BARO, 𝜖-Diagnosis, TraceRCA, MicroRank, Multi-source BARO, Multi-source RCD, Multi-source CIRCA, TORAI, EventADL.main.pyBenchmark
We provide a script named
to assist in reproducing the results from our RCAEval paper. This script can be executed using Python with the following syntax:
The available options and their descriptions are as follows:
options:
-h, --help Show this help message and exit
--dataset DATASET Choose a dataset. Valid options:
[re2-ob, re2-ss, re2-tt, etc.]
--method METHOD Choose a method (causalrca, microcause, e_diagnosis, baro, rcd, circa, etc.)
MicroCause and CloudRanger start their search from the SLI, which main.py sets to the entry service's latency. Their paper numbers were produced by RCAEval 1.11.0 and earlier, which used the root-cause service's latency instead (#88), so this version's numbers for these two methods differ from the paper.
For example, in Table 6, BARO achieves Avg@5 of 0.72, 0.99, 1, 0.83, 0.64, and 0.8 for CPU, MEM, DISK, SOCKET, DELAY, LOSS, and AVERAGE on the Train Ticket dataset. To reproduce these results, you can run the following commands:
bash
python main.py --method baro --dataset re2-tt
The expected output should be exactly as presented in the paper (it takes less than 1 minute to run the code)
$ python main.py --method baro --dataset re2-tt --length 20
100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 90/90 [00:45<00:00, 1.98it/s]
--- Evaluation results ---
Avg@5-CPU: 0.72
Avg@5-MEM: 0.99
Avg@5-DISK: 1.0
Avg@5-SOCKET: 0.83
Avg@5-DELAY: 0.63
Avg@5-LOSS: 0.64
Avg speed: 0.51
We can replace the baro method with other methods (e.g., circa) and substitute re2-tt with other datasets to replicate the corresponding results shown in Table 6. This reproduction process is also integrated into our Continuous Integration (CI) setup. For more details, refer to the .circleci/config.yml file.
Multi-source RCA benchmark
The multi-source methods (Multi-source BARO, Multi-source RCD, and Multi-source CIRCA) consume metrics, logs, and traces together. They run on the RE2/RE3 datasets, which include the required
logts.csv, tracets_err.csv, and tracets_lat.csv files in each failure case:
bash
Multi-source BARO (Python 3.14, default environment)
python main.py --method mmbaro --dataset re2-ob
Multi-source CIRCA (Python 3.14, default environment)
python main.py --method mmcirca --dataset re2-ob
Multi-source RCD (requires the RCD environment: Python 3.8,
pip install -e .[rcd], see docs/SETUP.md)
python main.py --method mmrcd --dataset re2-ob
A function-level tutorial using Multi-source BARO on a single failure case is available in docs/multi-source-rca-demo.ipynb.
For TORAI Paper
TORAI Datasets (270 cases): A processed version of the RE2 datasets, containing pre-aggregated time-series for metrics, logs, and traces (where available). These datasets are used by the TORAI method and are available separately on Figshare: https://doi.org/10.6084/m9.figshare.31925976.
TORAI requires a separate Python 3.8 environment and its own datasets. For full instructions, see docs/TORAI.md for installation and reproducibility instructions.
bash
python main.py --method torai --dataset torai-ob --length 10
<details>
<summary>Expected output (it takes less than 1 minute)</summary>
--- Evaluation results ---
Avg@5-CPU: 0.96
Avg@5-MEM: 0.93
Avg@5-DISK: 1.0
Avg@5-SOCKET: 0.93
Avg@5-DELAY: 0.8
Avg@5-LOSS: 0.84
</details>
For EventADL Paper
EventADL localizes root-cause actors/resources over CloudTrail-style API-call event logs, rather than the metrics/traces/logs used by other RCAEval methods. It runs in the default environment. For full instructions, see docs/EVENTADL.md for installation and usage instructions.
bash
python main.py --method eventadl --dataset eventadl-falcon
`
Publications
Anomaly Detection and Root Cause Analysis for Microservice Systems
PhD Thesis, RMIT University, 2026 · Luan Pham
EventADL: Open-Box Anomaly Detection and Localization Framework for Events in Cloud-Based Service Systems
FSE 2026 · Luan Pham, Victor Nicolet, Joey Dodds, Hui Guan, Daniel Kroening
TORAI: Multi-source Root Cause Analysis for Blind Spots in Microservice Service Call Graph
FSE 2026 · Luan Pham, Huong Ha, Xiuzhen Zhang, Hongyu Zhang
Where Root Cause Analysis Fails: A Retrieval-Reranking Decomposition
NeurIPS 2026 (Evaluations and Datasets Track) · Hada Melino Muhammad, Luan Pham, Laure Barrière, Sachin Shetty, Leonardo Pulga, Flora D. Salim
RCAEval: A Benchmark for Root Cause Analysis of Microservice Systems with Telemetry Data
WWW 2025 (Companion) · Luan Pham, Hongyu Zhang, Huong Ha, Flora Salim, Xiuzhen Zhang
Root Cause Analysis for Microservice System based on Causal Inference: How Far Are We?
ASE 2024 · Luan Pham, Huong Ha, Hongyu Zhang
BARO: Robust Root Cause Analysis for Microservices via Multivariate Bayesian Online Change Point Detection
FSE 2024 · Luan Pham, Huong Ha, Hongyu Zhang
Licensing
This repository includes code from various sources with different licenses. We have included their corresponding LICENSE into the LICENSES directory:
- BARO: Licensed under the MIT License. Original source: BARO GitHub Repository.
- CausalRCA: No License. Original source: CausalRCA GitHub Repository.
- CIRCA: Licensed under the BSD 3-Clause License. Original source: CIRCA GitHub Repository.
- E-Diagnosis: Licensed under the BSD 3-Clause License. Original source: PyRCA GitHub Repository.
- MicroCause: Licensed under the Apache License 2.0. Original source: MicroCause GitHub Repository.
- RCD: Licensed under the MIT License. Original source: RCD GitHub Repository.
- RUN: No License. Original source: RUN GitHub Repository.
For the code implemented by us and for our datasets, we distribute them under the MIT LICENSE.
Acknowledgments
We would like to express our sincere gratitude to the researchers and developers who created the baselines used in our study. Their work has been instrumental in making this project possible. We deeply appreciate the time, effort, and expertise that have gone into developing and maintaining these resources. This project would not have been feasible without their contributions.
Change Logs
- [Oct 2026] Added LLM agent onboarding.
rcaeval-agent export writes a blind task view of a dataset, and rcaeval-agent evaluate scores a predictions file from any agent with the same AC@k and Avg@k as main.py. See docs/AGENTS.md.
[Sep 2026] Added the retrieval–reranking decomposition of Where Root Cause Analysis Fails (NeurIPS'26). main.py --report-decomposition K prints Retrieval@K and Rerank@1 beneath each Avg@5; K=all uses the whole returned ranking.
[Sep 2026] Fixed PageRank-based methods and CIRCA silently falling back to column order (scikit-network ≥0.32 and networkx ≥3.0 API removals, and a duplicate time column in 50 RE1-OB cases). The fallback now reports its error on stderr.
[Sep 2026] Added an opt-in chance-level baseline to the evaluator. main.py --report-chance prints Chance@5 and Lift@5 beneath each Avg@5, so an absolute score can be read against the floor a random ranker would reach on the same candidate set. Contributed by @mateenali66 in #79.
[Aug 2026] Published all nine datasets (735 cases) on Hugging Face as Parquet, 3.4GB on disk and downloadable one suite or one case at a time, with a cases.parquet index of every case and its ground-truth root cause. Added read_metrics, read_logs and read_traces, which read either the original or the Parquet layout.
[Jul 2026] Made the multi-source RCA benchmark runnable via main.py` (Multi-source BARO/RCD/CIRCA) and fixed PyPI packaging so wheels include all subpackages.