Как получить доступ к журналам заданий Google cloud run в режиме реального времени?

Я создаю инструмент типа CI / CD, который на самом деле является веб-приложением. Стек - это django-rest-framework на серверной части и React (голосование) на интерфейсе.

В настоящее время конвейер запущен, и все действия из запущенных этапов выполняются, задания создаются, запускаются, удаляются, и все это работает нормально.

Все это происходит с помощью Google Cloud Run Jobs.

Чтобы приложение имело смысл, мне нужно иметь возможность получать журналы в режиме реального времени из этого конкретного задания во время его выполнения. В настоящее время у меня есть грубая временная реализация, в которой я использую Google Cloud Logging API с фильтрами для периодического получения журналов для этого задания.

Это упомянутая грубая реализация:

from google.cloud import logging_v2

from apps.docker_app.utils.google_credentials import get_google_credentials


def _stream_job_logs(logging_client, log_filter):
    seen_entries = set()

    while True:
        entries = logging_client.list_entries(filter_=log_filter)

        for entry in entries:
            if entry.insert_id not in seen_entries:
                seen_entries.add(entry.insert_id)

                yield entry

        time.sleep(1)


class GoogleLogsClient:
    def __init__(self):
        storage_credentials = get_google_credentials()

        self.client = logging_v2.Client(credentials=storage_credentials)

    def stream_job_logs(self, log_filter):
        for entry in _stream_job_logs(
            logging_client=self.client, log_filter=log_filter
        ):
            if "All stages completed successfully" in entry.payload:
                break

            timestamp = entry.timestamp.isoformat()

            print("* {}: {}".format(timestamp, entry.payload))

Хотя это и работает, я ограничен 60 запросами на чтение в Google Cloud Logging API в минуту, и, вероятно, также существует общее ограничение на ведение журнала.

Как вы уже, вероятно, можете предположить, это никогда не будет работать с более длительно выполняемыми заданиями, не говоря уже о масштабируемости для нескольких пользователей, выполняющих несколько конвейеров (заданий).

Есть ли лучший способ реализовать это с помощью какой-либо другой службы DHCP или способ обойти ограничение скорости эффективным и разумным способом?

Спасибо всем за любую помощь в этом вопросе - сейчас это своего рода блокировка для остальной части приложения.

Попробуйте настроить Приемник журналов для отправки журналов в Pub/Sub. Это перенаправит соответствующие журналы (отфильтрованные по названию задания) в раздел Pub/Sub, что позволит вашему серверу Django подписываться и обрабатывать журналы в режиме реального времени.

В качестве альтернативы вы можете использовать приемник журналов для перенаправления журналов в BigQuery для структурированного хранения и анализа. Оба подхода устраняют ограничения на скорость работы API.

Вернуться на верх