Appengine Flexible Logging с помощью пирамиды - PullRequest
0 голосов
/ 14 апреля 2020

Миграция от стандартного к гибкому приложению и попытка заставить журналы отображаться так же, как в Стандартном. Пример:

enter image description here

Это одна отдельная запись журнала, расширенная. Показывает, что URL находится вверху, метод http, статус и задержка запроса. Когда развернуто, как есть, оно показывает все журналы, которые были созданы во время запроса, их уровень и где в коде это находится. Это позволяет очень легко увидеть, что все произошло во время запроса.

В Гибком, кажется, ничего этого не происходит. Вызов logging.info() создает собственную собственную отдельную запись журнала в журнале, без информации о том, по какому запросу / маршруту он был инициирован:

enter image description here

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

Я не получаю уровень серьезности на «групповом» уровне журнала, только при расширении (что означает, что фильтрация по серьезности невозможна), а также не получаю, по какой строке была вызвана запись журнала. Это также означает гораздо больше отдельных записей в журнале, и я даже не знаю, как это повлияет на экспорт журналов.

Чтобы сгруппировать журналы, я передаю Pyramid собственный обработчик журналов, который просто google's AppEngineHandler , но переопределяет get_gae_labels, чтобы предоставить ему правильный заголовок идентификатора трассировки (из коробки он поддерживает только django, flask и webapp2)

    def get_gae_labels(self):
        """Return the labels for GAE app.

        If the trace ID can be detected, it will be included as a label.
        Currently, no other labels are included.

        :rtype: dict
        :returns: Labels for GAE app.
        """
        gae_labels = {}

        request = pyramid.threadlocal.get_current_request()
        header = request.headers.get('X-Cloud-Trace-Context')
        if header:
            gae_labels[_TRACE_ID_LABEL] = header.split("/", 1)[0]

        return gae_labels

Из чего Я могу собрать, appengine Flexible запускает nginx перед моим приложением, и он передает журналы stderr в Logging и свои собственные nginx_request журналы. Затем, когда мое приложение вызывает logging.info(), оно сопоставляет идентификатор трассировки, чтобы сгруппировать их вместе. Из-за этого, кажется, происходит несколько вещей.

A. Это не показывает самый высокий уровень серьезности связанных записей журнала

B. Когда вы раскрываете запись журнала, связанные записи журнала не появляются мгновенно, как в Appengine Standard, они загружаются за секунду, так как, по-видимому, Logging ищет связанные журналы через идентификатор трассировки. В рамках стандарта appengine обеспечивает ведение журнала с записью line, которая содержит некоторые метаданные, такие как сообщение журнала, номер строки, местоположение исходного кода и т. Д. c, поэтому go не нужно искать связанные записи журнала, это все там с самого начала. См. Ниже

enter image description here

Я не уверен в решении здесь (следовательно, в посте), и мне интересно, будет ли это в конечном итоге решено путем расширения Google Logging апи. Мне кажется, что решение на самом деле состоит в том, чтобы остановить nginx от регистрации что-нибудь и позволить Pyramid обрабатывать исключительно журналы, а также разрешить мне отправлять данные в пределах line, поэтому регистрация не должна попробуйте сгруппировать запросы по идентификатору трассировки.

Пользовательская среда выполнения в Flexible, добавив в файл yaml:

runtime_config:
  python_version: 3.7

и файл docker:

FROM gcr.io/google-appengine/python

# Create a virtualenv for dependencies. This isolates these packages from
# system-level packages.
# Use -p python3 or -p python3.7 to select python version. Default is version 2.
RUN virtualenv /env -p python3

# Setting these environment variables are the same as running
# source /env/bin/activate.
ENV VIRTUAL_ENV /env
ENV PATH /env/bin:$PATH

# Copy the application's requirements.txt and run pip to install all
# dependencies into the virtualenv.
ADD requirements.txt /app/requirements.txt
RUN pip install -r /app/requirements.txt

# Add the application source code.
ADD . /app

# Run a WSGI server to serve the application. gunicorn must be declared as
# a dependency in requirements.txt.
RUN pip install -e .
CMD gunicorn -b :$PORT main:app

и требования .txt

pyramid
gunicorn
redis
google-cloud-tasks
googleapis-common-protos
google-cloud-ndb
google-cloud-logging
...