0.5.0 (2026-03-19)
Функции, связанные с OpenLineage
Извлечение тегов из набора данных и описания заданий
Теперь DataRentgen извлекает теги из событий OpenLineage:
- Теги набора данных (в настоящее время не отображаются ни одной интеграцией)
- Теги задания и запуска
Некоторые теги создаются на основе версий движка:
airflow.versiondbt.versionflink.versionhive.versionspark.versionopenlineage_adapter.versionopenlineage_client.version(только для клиента Python v1.38.0 или выше)
Обратите внимание, что передача тегов заданий и запусков зависит от интеграции. Например, теги можно настроить для Spark, Airflow и dbt, но не для Flink или Hive. Кроме того, в каждой интеграции теги настраиваются по-разному.
Извлечение nominalTime
Теперь DataRentgen извлекает параметр запуска nominalTime и сохраняет значения в полях run.expected_start_at и run.expected_end_at.
Извлечение jobDependencies
Теперь 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",
...
}
}
]
}