Skip to content

0.5.0 (2026-03-19)

Функции, связанные с OpenLineage

Извлечение тегов из набора данных и описания заданий

#367, #368, #369, #372

Теперь DataRentgen извлекает теги из событий OpenLineage:

  • Теги набора данных (в настоящее время не отображаются ни одной интеграцией)
  • Теги задания и запуска

Некоторые теги создаются на основе версий движка:

  • airflow.version
  • dbt.version
  • flink.version
  • hive.version
  • spark.version
  • openlineage_adapter.version
  • openlineage_client.version (только для клиента Python v1.38.0 или выше)

Обратите внимание, что передача тегов заданий и запусков зависит от интеграции. Например, теги можно настроить для Spark, Airflow и dbt, но не для Flink или Hive. Кроме того, в каждой интеграции теги настраиваются по-разному.

Извлечение nominalTime

#378

Теперь DataRentgen извлекает параметр запуска nominalTime и сохраняет значения в полях run.expected_start_at и run.expected_end_at.

Извлечение jobDependencies

#402

Теперь DataRentgen извлекает информацию из фасета jobDependencies и сохраняет её в таблице job_dependency. На данный момент это просто кортеж from_dataset_id, to_dataset_id, type (произвольная строка, предоставленная интеграцией, а не перечисление). Это может быть изменено в будущих версиях Data.Rentgen.

В настоящее время единственная интеграция, предоставляющая подобную информацию, — это Airflow. Но она реализована только в самой последней версии провайдера OpenLineage для Airflow (2.10 или выше). На данный момент провайдер также не отправляет фасет с информацией о прямых зависимостях между задачами — включены только косвенные (объявленные через Asset). Поэтому существует резервный вариант для Airflow, который извлекает эти зависимости из полей задач downstream_task_ids и upstream_task_ids.

Функции REST API

Добавлен эндпоинт GET /v1/jobs/hierarchy

Этот эндпоинт можно использовать для получения графа иерархии заданий (родительские задания, зависимости) для заданного задания. (#407, #412)

Пример ответа
{
    "relations": {
        "parents": [
            {
                "from": {"kind": "JOB", "id": "1"},
                "to": {"kind": "JOB", "id": "2"}
            }
            ],
        "dependencies": [
            {
                "from": {"kind": "JOB", "id": "3"},
                "to": {"kind": "JOB", "id": "1"},
                "type": "DIRECT_DEPENDENCY"
            },
            {
                "from": {"kind": "JOB", "id": "1"},
                "to": {"kind": "JOB", "id": "4"},
                 "type": "DIRECT_DEPENDENCY"
            }
            ]
    },
    "nodes": {
        "jobs": {
            "1": {
                "id": 1,
                "parent_job_id": null,
                "name": "my_job",
                "type": "SPARK_APPLICATION",
                "location": {
                "name": "my_cluster",
                 "type": "YARN"
                }
            },
            "2": {
                "id": 2,
                "parent_job_id": 1,
                "name": "my_job.child_task",
                "type": "SPARK_APPLICATION",
                "location": {
                "name": "my_cluster",
                "type": "YARN"
                    }
            },
            "3": {
                "id": 3,
                "parent_job_id": null,
                "name": "source_job",
                "type": "SPARK_APPLICATION",
                "location": {
                "name": "my_cluster",
                "type": "YARN"
                    }
            },
            "4": {
                "id": 4,
                "parent_job_id": null,
                "name": "target_job",
                "type": "SPARK_APPLICATION",
                "location": {
                "name": "my_cluster",
                "type": "YARN"
                }
            }
        }
    }
}

Добавлена ​​связь родительских элементов между вакансиями

Теперь в заданиях можно ссылаться на родительское задание через поле parent_job_id. (#394)

До:

Пример ответа отношения
{
    "meta": { ... },
    "items": [
        {
            "id": "42",
            "data": {
                "id": "42",
                "name": "my-spark-task",
                "type": "SPARK_APPLICATION",
                "location": { ... }
            }
        }
    ]
}

После:

Пример ответа
{
    "meta": { ... },
    "items": [
        {
            "id": "42",
            "data": {
                "id": "42",
                "name": "my-spark-task",
                "type": "SPARK_APPLICATION",
                "location": { ... },
                "parent_job_id": "10"
            }
        }
    ]
}

В API отслеживания происхождения данных добавлены связи JOB-JOB и RUN-RUN.

Например, из одного ответа можно получить цепочку Airflow DAG → Airflow Task → Spark app. (#392, #399, #401)

До:

Пример ответа
{
    "relations": {
        "parents": [
            {"from": {"kind": "JOB", "id": "1"}, "to": {"kind": "RUN", "id": "parent-run-uuid"}},
            {"from": {"kind": "JOB", "id": "2"}, "to": {"kind": "RUN", "id": "run-uuid"}}
        ],
        "symlinks": [],
        "inputs": [...],
        "outputs": [...]
    },
    "nodes": {...}
}

После:

Пример ответа
{
    "relations": {
        "parents": [
            {"from": {"kind": "JOB", "id": "1"}, "to": {"kind": "RUN", "id": "parent-run-uuid"}},
            {"from": {"kind": "JOB", "id": "2"}, "to": {"kind": "RUN", "id": "run-uuid"}},
            # NEW:
            {"from": {"kind": "JOB", "id": "1"}, "to": {"kind": "JOB", "id": "2"}},
            {"from": {"kind": "RUN", "id": "parent-run-uuid"}, "to": {"kind": "RUN", "id": "run-uuid"}}
        ],
        "symlinks": [],
        "inputs": [...],
        "outputs": [...]
    },
    "nodes": {...}
}

Добавить job в ответ на запрос GET /v1/runs

Это позволяет отображать тип и название задания для конкретного запуска без отправки дополнительных запросов. #411

До:

Пример ответа
{
    "meta": {
        "page": 1,
        "page_size": 20,
        "total_count": 1,
        "pages_count": 1,
        "has_next": False,
        "has_previous": False,
        "next_page": None,
        "previous_page": None,
    },
    "items": [
        {
            "id": "01908224-8410-79a2-8de6-a769ad6944c9",
            "data": {
                "id": "01908224-8410-79a2-8de6-a769ad6944c9",
                "created_at": "2024-07-05T09:05:49.584000",
                "job_id": "123",
                ...
            },
            "statistics": { ... }
        }
    ]
}

После:

Пример ответа
{
    "meta": {
        "page": 1,
        "page_size": 20,
        "total_count": 1,
        "pages_count": 1,
        "has_next": False,
        "has_previous": False,
        "next_page": None,
        "previous_page": None,
    },
    "items": [
        {
            "id": "01908224-8410-79a2-8de6-a769ad6944c9",
            "data": {
                "id": "01908224-8410-79a2-8de6-a769ad6944c9",
                "created_at": "2024-07-05T09:05:49.584000",
                "job_id": "123",
                ...
            },
            "job": {
                "id": "123",
                "name": "myjob",
                 ...
            },
            "statistics": { ... }
        }
    ]
}

Включено поле last_run в ответ на запрос GET /v1/jobs

Это позволяет отображать время последнего начала, статус и продолжительность для каждого задания в списке без дополнительных запросов. #387

До:

Пример ответа
{
    "meta": { ... },
    "items": [
        {
            "id": "42",
            "data": {
                "id": "42",
                "name": "my-spark-task",
                "type": "SPARK_APPLICATION",
                "location": { ... },
                "parent_job_id": "10"
            }
        }
    ]
}

После:

Пример ответа
{
    "meta": { ... },
    "items": [
        {
            "id": "42",
            "data": {
                "id": "42",
                "name": "my-spark-task",
                "type": "SPARK_APPLICATION",
                "location": { ... },
                "parent_job_id": "10"
            },
            "last_run": {
                "id": "01908224-8410-79a2-8de6-a769ad6944c9",
                "created_at": "2024-07-05T09:05:49.584000",
                "job_id": "123",
                ...
            }
        }
    ]
}