Выходные данные jsonPayload (структурированное журналирование) из Python. Журналирование функции Google Cloud, необходимое для создания метрик на основе журналов (LBM) в GCP.

Мне нужны журналы функции Google Cloud вместо файла . Моя цель — использовать ключи словаря в качестве меток (см. Метки метрик на основе журнала ) для метрик на основе журнала, чтобы к ним можно было обращаться в Grafana.

Я использую Pythonloggingмодуль, но при необходимости я также могу переключиться на что-то другое.

Мне нужен вывод в журналах:

      jsonPayload: `{'key1':value1, 'key2':value2}`

Но вместо этого я получаю вывод: вся следующая строка представляет собой строку:

      "2022-02-08 15:43:32,460 [INFO]: {"key1": value1, "key2": value2}"

Реальный пример из журналов, посередине вы видитеtextPayload:

Картинка как текст:

      {
insertId: "000000-1b431ffd-e42d-4f83-xyz"
labels: {1}
logName: "projects/MY_PROJECT/logs/cloudfunctions.googleapis.com%2Fcloud-functions"
receiveTimestamp: "2022-02-08T15:43:41.808217166Z"
resource: {2}
textPayload: "2022-02-08 15:43:32,460 [INFO]: {"json_metadata": {"countrows": 736203, "countcolumns": 6, "size": 48261360, "gcs_stamp": "2022-02-08 15:43:32.451000+00:00", "python_stamp": "2022-02-08 15:43:31.055538"}}"
timestamp: "2022-02-08T15:43:32.460Z"
trace: "projects/MY_PROJECT/traces/dd97759176248586a3d3xyz"
}

Первые попытки

Чтение из https://cloud.google.com/logging/docs/structured-logging :

В Cloud Logging структурированные журналы относятся к записям журнала, которые используют поле jsonPayload для добавления структуры к своим полезным данным. Структурированное ведение журнала применяется к журналам, написанным пользователем.

Я попытался получить это «структурированное журналирование» после написания структурированных журналов

      logging.info(json.dumps(json_for_gcp_lbm))

но безрезультатно.

Далее по ссылкам: есть встроенный агент ведения журнала от GCP, который использует fluentd , поскольку об агенте ведения журнала, по-видимому, доступен только для Google Kubernetes Engine или App Engine, а не в функции Google Cloud:

Если вы используете Google Kubernetes Engine или гибкую среду App Engine, вы можете записывать структурированные журналы в виде объектов JSON, сериализованных в одну строку на стандартный вывод или stderr. Затем агент ведения журналов отправляет структурированные журналы в Cloud Logging как jsonPayload структуры LogEntry.

Как я могу получитьjsonPayloadв этом выводе?

1 ответ

Вы можете настроить структурированное ведение журнала по примеру в документации. Убедитесь, что ваша версия Python 3.8 или выше. Другой способ добиться этого — использовать клиентские библиотеки ведения журналов .

Пример из ОП для второго метода:

Поместите в свой файл требований.txt:

      google-cloud-logging==3.0.0

как самую последнюю версию на момент написания.

      from google.cloud import logging as gclogger

(или назовите его как хотите)

и вызовите ведение журнала json с помощью:

json_for_gcp_lbm = {MY_JSON_HERE}

          from google.cloud import logging as gclogger

    ...

    logging_client = gclogger.Client()
    logger_name = "MY_LOG_NAME_OF_FREE_CHOICE" # Saved in the google cloud logs
    logger = logging_client.logger(logger_name)

    # I do not know how it would work with `import logging` as the 
    # built-in Python module, but I got it to work with adding
    # Following line does not work
    # logging.info(json.dumps(json_for_gcp_lbm, default=str))
    # Instead, we need 
    # https://cloud.google.com/logging/docs/samples/logging-write-log-entry#code-sample
    logger.log_struct(json_for_gcp_lbm)

Что приводит к выводу jsonPayload:

И затем вы можете выбрать любую метку из json в меню «Создать метрику журналов» (Log-Based Metrics/LBM):

Другие вопросы по тегам