kacpermuda commented on code in PR #70131:
URL: https://github.com/apache/airflow/pull/70131#discussion_r3622969609


##########
providers/dbt/cloud/src/airflow/providers/dbt/cloud/utils/openlineage.py:
##########
@@ -97,6 +99,62 @@ def _get_parent_run_metadata(task_instance):
     )
 
 
+def _get_openlineage_parent_facet_dict(task_instance) -> dict:
+    """Build the OpenLineage ``ParentRunFacet`` payload (parent and root) for 
a task instance."""
+    metadata = _get_parent_run_metadata(task_instance)
+    return {
+        "parent": {
+            "run": {"runId": metadata.run_id},
+            "job": {"namespace": metadata.job_namespace, "name": 
metadata.job_name},
+        },
+        "root": {
+            "run": {"runId": metadata.root_parent_run_id},
+            "job": {
+                "namespace": metadata.root_parent_job_namespace,
+                "name": metadata.root_parent_job_name,
+            },
+        },
+    }
+
+
+def inject_parent_job_information_into_dbt_cloud_cause(cause: str | None, 
task_instance) -> str | None:
+    """
+    Replace the dbt Cloud run ``cause`` with OpenLineage parent job 
information as JSON.
+
+    This serializes the Airflow task's OpenLineage parent (and root) run 
identifiers into the
+    triggered run's ``cause`` field. A consumer that reads dbt Cloud runs can 
parse this JSON and
+    attach a ``ParentRunFacet``, linking the dbt Cloud run back to the Airflow 
task that triggered it.
+
+    The dbt Cloud ``cause`` is limited to ``DBT_CAUSE_MAX_LENGTH`` characters. 
The essential ``parent``
+    link is always kept; the ``root`` block is dropped if the two together do 
not fit. If even the
+    parent-only payload does not fit, the original ``cause`` is returned 
unchanged.
+    """
+    try:
+        facet = _get_openlineage_parent_facet_dict(task_instance)
+    except ImportError:
+        log.warning(
+            "Could not import OpenLineage provider. Skipping the injection of 
OpenLineage "
+            "parent job information into the dbt Cloud run cause."
+        )
+        return cause
+
+    candidates = [
+        {"parent": facet["parent"], "root": facet["root"]},
+        {"parent": facet["parent"]},
+    ]

Review Comment:
   I know that every character counts since the limit is low, but maybe we 
should add encapsulating `{"openlineage": {"parent"...}}` dict? Without the 
word `openlineage`, parent and root can be confusing for reader. But, if 
somebody sets it to True, they usually know what they're doing. Something to 
consider.



##########
providers/dbt/cloud/src/airflow/providers/dbt/cloud/operators/dbt.py:
##########
@@ -219,6 +233,12 @@ def execute(self, context: Context):
                 f"Triggered via Apache Airflow by task {self.task_id!r} in the 
{self.dag.dag_id} DAG."
             )
 
+        if self.openlineage_inject_parent_job_info:
+            self.log.info("Injecting OpenLineage parent job information into 
dbt Cloud run cause.")

Review Comment:
   ```suggestion
               self.log.info("Replacing dbt Cloud run cause with OpenLineage 
parent job information.")
   ```
   Let's be explicit here, since we replace and not inject (because the char 
limit on cause is so low)



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to