Skip to content

Asset graph blank when DAG contains TriggerDagRunOperator, unregistered "trigger" node type in frontend causes silent render failure #64621

Closed

Description

@fahadabdul

Apache Airflow version

3.1.7+astro.2

What happened and how to reproduce it?

When a DAG contains a TriggerDagRunOperator, the asset dependency graph API returns nodes with "type": "trigger". The Airflow 3 frontend asset graph renderer does not have a registered component for the trigger node type, causing the entire graph to render blank with no error shown.

Reproduction Steps:

  1. Create the following two DAGs and a shared assets file:

assets_test.py:

from airflow.sdk import Asset
test_asset = Asset(name="test_asset")
trigger_test_asset = Asset(name="trigger_test_asset")

producer_no_trigger.py (graph renders correctly):

from airflow.sdk import DAG
from airflow.providers.standard.operators.python import PythonOperator
from datetime import datetime
from dags.assets_test import test_asset

with DAG(dag_id="producer_no_trigger", schedule=None, start_date=datetime(2021,1,1), catchup=False):
    PythonOperator(task_id="emit", python_callable=lambda: None, outlets=[test_asset])

producer_with_trigger.py (graph does NOT render):

from airflow.sdk import DAG
from airflow.providers.standard.operators.python import PythonOperator
from airflow.providers.standard.operators.trigger_dagrun import TriggerDagRunOperator
from datetime import datetime
from dags.assets_test import trigger_test_asset

with DAG(dag_id="producer_with_trigger", schedule=None, start_date=datetime(2021,1,1), catchup=False):
    emit = PythonOperator(task_id="emit", python_callable=lambda: None, outlets=[trigger_test_asset])
    trigger = TriggerDagRunOperator(task_id="trigger_something", trigger_dag_id="some_dag", wait_for_completion=False)
    emit >> trigger
  1. Deploy all files and wait for them to parse
  2. Go to Assets tab → click test_asset → graph renders correctly
  3. Go to Assets tab → click trigger_test_asset → graph is blank

The difference in the dependency API responses confirms the root cause:

test_asset (graph renders) dependency API response:

{
    "edges": [
        {
            "source_id": "dag:producer_no_trigger",
            "target_id": "asset:10"
        }
    ],
    "nodes": [
        {
            "id": "dag:producer_no_trigger",
            "label": "producer_no_trigger",
            "type": "dag"
        },
        {
            "id": "asset:10",
            "label": "test_asset",
            "type": "asset"
        }
    ]
}

trigger_test_asset (graph blank) dependency API response:

{
    "edges": [
        {
            "source_id": "dag:producer_with_trigger",
            "target_id": "asset:9"
        },
        {
            "source_id": "dag:producer_with_trigger",
            "target_id": "trigger:producer_with_trigger:some_dag:trigger_something"
        },
        {
            "source_id": "trigger:producer_with_trigger:some_dag:trigger_something",
            "target_id": "dag:some_dag"
        }
    ],
    "nodes": [
        {
            "id": "dag:producer_with_trigger",
            "label": "producer_with_trigger",
            "type": "dag"
        },
        {
            "id": "asset:9",
            "label": "trigger_test_asset",
            "type": "asset"
        },
        {
            "id": "trigger:producer_with_trigger:some_dag:trigger_something",
            "label": "trigger_something",
            "type": "trigger"
        }
    ]
}

What you think should happen instead?

The asset graph should render trigger type nodes visually. Currently the entire graph fails to render silently when any trigger type node is present in the response.

Operating System

Debian GNU/Linux 12 (bookworm)

Versions of Apache Airflow Providers

apache-airflow-providers-common-compat==1.13.1
apache-airflow-providers-common-io==1.7.1
apache-airflow-providers-common-sql==1.31.0
apache-airflow-providers-elasticsearch==6.4.4
apache-airflow-providers-openlineage==2.10.2
apache-airflow-providers-smtp==2.4.2
apache-airflow-providers-standard==1.11.1

Deployment

Astronomer

Deployment details

Astronomer Runtime 3.1-13 based on Apache Airflow 3.1.7+astro.2

Anything else?

Confirmed from Airflow source code that trigger is not a registered node type in the frontend.

In airflow-core/src/airflow/ui/src/components/Graph/graphTypes.ts at https://github.com/apache/airflow/blob/main/airflow-core/src/airflow/ui/src/components/Graph/graphTypes.ts:

typescriptexport const nodeTypes = {
  asset: AssetNode,
  "asset-alias": AliasNode,
  "asset-condition": AssetConditionNode,
  "asset-name-ref": DefaultNode,
  "asset-uri-ref": DefaultNode,
  dag: DagNode,
  join: JoinNode,
  task: TaskNode,
};

Are you willing to submit PR?

  • Yes I am willing to submit a PR!

Code of Conduct

Activity

  1. added
    area:UIRelated to UI/UX. For Frontend Developers.
    on Apr 2, 2026
  2. Subham-KRLX commented on Apr 5, 2026

    @Subham-KRLX
    Contributor

    The issue stems from the missing trigger node type registration in the UI which causes React Flow to fail silently and blank out the canvas A quick way to fix this is to fallback to DefaultNode for trigger node
    In airflow-core/src/airflow/ui/src/components/Graph/graphTypes.ts:ts

    export const nodeTypes = {
    asset: AssetNode,
    "asset-alias": AliasNode,
    "asset-condition": AssetConditionNode,
    "asset-name-ref": DefaultNode,
    "asset-uri-ref": DefaultNode,
    dag: DagNode,
    join: JoinNode,
    task: TaskNode,
    trigger: DefaultNode
    }; This will restore the entire graph Since you mentioned being open to submitting a PR using DefaultNode here is a perfect starting point We can always enhance it with a dedicated component later if needed.

  3. laurenhall1526-netizen commented on Apr 5, 2026

    @laurenhall1526-netizen
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:UIRelated to UI/UX. For Frontend Developers.kind:bugThis is a clearly a bug

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions