Как получить доступ к журналам заданий 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.