2025, Dec 07 06:02

Как узнать длительность импортов в Amazon QuickSight SPICE по IngestionTimeInSeconds

Как найти медленные импорты в Amazon QuickSight SPICE: list_ingestions и IngestionTimeInSeconds помогут измерить длительность загрузок и снизить таймауты.

Разбираться с таймаутами загрузки в Amazon QuickSight SPICE — занятие нервное, особенно когда нельзя изменить оркестрацию заданий «выше по течению». Если задания импорта падают по таймауту и нужно перенести самые тяжёлые наборы данных на непиковые окна, практический вопрос сводится к простому: сколько на самом деле занимает загрузка каждого набора?

Суть проблемы

Ошибки импорта возникали из‑за таймаутов наборов данных во время загрузки в SPICE. Запуски импорта менять было нельзя, поэтому задача — найти самые медленные наборы и перенести их обновление на более спокойные часы. Попытки использовать list_ingestions, describe_ingestion и list_refresh_schedules изначально не показывали фактическую длительность. Рассмотрели и вариант с CloudWatch, но потребность была простой: время начала и конца или единственное значение длительности для каждого импорта.

Пример, который не показывает длительность

Обычно для начала перечисляют загрузки для набора данных и смотрят их общий статус или метаданные — но явной продолжительности вы так и не увидите. Такой набросок не отвечает на вопрос «сколько это заняло?»:

def scan_ingestions_no_timing(qs_api, ds_token):
    records = qs_api.list_ingestions(dataset=ds_token)
    for rec in records:
        # Это выводит, что загрузки существуют, но их длительность не показана
        print("ingestion observed")

Даже если добавить больше полей, тайминги не появятся, пока вы явно не прочтёте значение, которое и отражает длительность.

Что на самом деле происходит

Нужное уже есть в наборе результатов API, который вы вызываете. Ответ list_ingestions содержит поле IngestionTimeInSeconds. Это ровно то значение, которое показывает, сколько заняла каждая загрузка.

Решение: извлекать IngestionTimeInSeconds и сортировать по самым медленным

Выполните запрос list_ingestions и извлеките IngestionTimeInSeconds. После этого можно ранжировать наборы данных по наблюдаемой длительности и перенести самые медленные обновления на непиковые окна.

def collect_ingestion_timings(qs_api, ds_token):
    data = qs_api.list_ingestions(dataset=ds_token)
    timing_rows = []
    for item in data:
        secs = item.get("IngestionTimeInSeconds")
        if secs is not None:
            timing_rows.append({"row": item, "seconds": secs})
    timing_rows.sort(key=lambda r: r["seconds"], reverse=True)
    return timing_rows
# Пример использования
report = collect_ingestion_timings(qs_api=my_quicksight_client, ds_token=my_dataset_ref)
for entry in report:
    print(f"duration_seconds={entry['seconds']}")

Так вы получаете чёткий, детерминированный способ находить самые тяжёлые обновления. Никаких догадок и ручных сопоставлений — просто прочитайте поле и действуйте.

Почему это важно

Когда таймауты загрузки в SPICE приводят к сбоям, перенос тяжёлых импортов за пределы пиковых часов — часто самая быстрая мера, особенно если вы не можете менять инфраструктуру, запускающую эти задания. Наличие длительности для каждого импорта позволяет сначала взяться за худших «нарушителей» и снизить конкуренцию за ресурсы, не трогая верхний конвейер.

Итог

Если вы боретесь с таймаутами импорта в Amazon QuickSight и хотите понять, какие наборы данных тормозят, ответ уже есть в отклике list_ingestions: читайте IngestionTimeInSeconds. Используйте его, чтобы расставить приоритеты и перенести тяжёлые обновления на непиковые окна, уменьшая число сбоев и поддерживая дашборды в рабочем состоянии.