class_docstr: OpenLineage listener sends events on task instance and dag run starts, completes and failures.
code: def on_dag_run_running(self, dag_run: DagRun, msg: str):
      data_interval_start = (
          dag_run.data_interval_start.isoformat()
          if dag_run.data_interval_start
          else None
      )
      data_interval_end = (
          dag_run.data_interval_end.isoformat()
          if dag_run.data_interval_end
          else None
      )
      self.executor.submit(
          self.adapter.dag_started,
          dag_run=dag_run,
          msg=msg,
          nominal_start_time=data_interval_start,
          nominal_end_time=data_interval_end,
      )
  
imports: from __future__ import annotations
  import logging
  from concurrent.futures import ThreadPoolExecutor
  from datetime import datetime
  from typing import TYPE_CHECKING
  from airflow.listeners import hookimpl
  from airflow.providers.openlineage.extractors import ExtractorManager
  from airflow.providers.openlineage.plugins.adapter import OpenLineageAdapter
  from airflow.providers.openlineage.utils.utils import get_airflow_run_facet, get_custom_facets, get_job_name, print_warning
  from airflow.utils.timeout import timeout
label_desc: Use image node_id 8 for calling the OpenLineageListener obj's underlying member method code with example usage: obj.on_dag_run_running(dag_run, msg) without return types