---
slug: airflow
title: Airflow
description: Investigate DAG failures and extract execution context from Apache Airflow.
---

## Overview

The Airflow integration enables OpenSRE to investigate DAG failures and extract execution context directly from an Apache Airflow instance.

It supports:

- DAG run inspection
- Task instance retrieval
- Failure detection
- Evidence collection for RCA generation

This integration is designed for **incident-driven workflows**, where an alert referencing a DAG triggers an investigation.

---

## Architecture

The Airflow integration participates in the investigation pipeline as follows:

1. **Alert ingestion**
2. **Planner selects relevant tools**
3. **Airflow API is queried**
4. **Evidence is collected**
5. **RCA is generated**

```
Alert → Planner → Airflow tools → Evidence → RCA
```

---

## Configuration

### Required Environment Variables

```bash
AIRFLOW_BASE_URL=http://localhost:8080

# Authentication (choose one)

# Basic Auth
AIRFLOW_USERNAME=your_username
AIRFLOW_PASSWORD=your_password

# Token-based (if supported)
AIRFLOW_AUTH_TOKEN=your_token

# Optional
AIRFLOW_TIMEOUT_SECONDS=15
AIRFLOW_VERIFY_SSL=true
AIRFLOW_MAX_RESULTS=50
```

### Setup Example

Start Airflow locally:

```bash
docker run -p 8080:8080 apache/airflow:2.8.1 standalone
```

Create a failing DAG:

```python
from airflow import DAG
from airflow.operators.python import PythonOperator
from datetime import datetime

def fail_task():
    raise Exception("Intentional failure")

with DAG(
    dag_id="test_fail_dag",
    start_date=datetime(2024, 1, 1),
    schedule=None,
    catchup=False,
) as dag:
    PythonOperator(
        task_id="fail_task",
        python_callable=fail_task,
    )
```

Trigger the DAG:

```bash
airflow dags trigger test_fail_dag
```

---

## Investigation Flow

Run the investigation CLI:

```bash
python -m cli investigate
```

Provide the alert payload:

```json
{
  "source": "airflow",
  "message": "Airflow DAG test_fail_dag failed",
  "metadata": {
    "dag_id": "test_fail_dag"
  }
}
```

---

## Capabilities

| Capability | Description |
|---|---|
| List DAG runs | Fetch execution history |
| Get task instances | Inspect task-level failures |
| Detect failures | Identify recent failing runs |
| RCA support | Provide structured evidence for root cause analysis |

---

## Planner Behavior

When `source = airflow`, the planner:

- Prioritizes Airflow-related actions
- Seeds Airflow tools into the action space

However:

- Tool selection is LLM-driven
- Exact ordering may vary between runs

This design avoids hard-coded routing and keeps the system extensible.

---

## Error Handling

- Per-run failures are isolated — one failing request does not break the loop
- Network/API errors are handled defensively
- Partial evidence is preserved whenever possible

---

## Testing

### E2E Tests

```bash
python -m pytest tests/e2e/airflow/test_orchestrator.py -v
```

Expected output:

```
test_airflow_investigation_e2e PASSED
```

### Routing Tests

```bash
python -m pytest tests/nodes/plan_actions/test_airflow_routing.py -v
```

---

## Limitations

- Planner routing is probabilistic (LLM-based)
- Requires a reachable Airflow instance
- No CI-backed Airflow instance by default (local validation required)

---

## Design Notes

- Integration follows the same contract as other sources (Datadog, Grafana, etc.)
- Uses env-based configuration for simplicity
- Avoids introducing hard overrides in planning logic
- Focuses on evidence-driven investigation, not static rules

---

## Future Work

- Stronger tool routing guarantees
- CI-backed disposable Airflow instance for e2e tests
- Deeper DAG dependency analysis
- Richer RCA explanations
