Рейтинг:2

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

флаг mx

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

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

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

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

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

"2022-02-08 15:43:32,460 [ИНФОРМАЦИЯ]: {"ключ1": значение1, "ключ2": значение2}"

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

введите описание изображения здесь

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

{
Идентификатор вставки: "000000-1b431ffd-e42d-4f83-xyz"
метки: {1}
logName: "projects/MY_PROJECT/logs/cloudfunctions.googleapis.com%2Fcloud-functions"
ReceiveTimestamp: "2022-02-08T15:43:41.808217166Z"
ресурс: {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"}}"
отметка времени: "2022-02-08T15:43:32.460Z"
трассировка: "проекты/МОЙ_ПРОЕКТ/трассировки/dd97759176248586a3d3xyz"
}

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

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

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

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

logging.info(json.dumps(json_for_gcp_lbm))

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

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

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

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

mdobrucki avatar
флаг tr
Правильно ли я понимаю - предоставленный вами вывод получен из [примера](https://cloud.google.com/functions/docs/monitoring/logging#writing_structured_logs)? Какую версию питона вы используете?
questionto42standswithUkraine avatar
флаг mx
@mdobrucki Да, я использовал `logging.info(json.dumps(json_for_gcp_lbm))`, который взят из примера этой ссылки, но я использовал только самую последнюю строку этого примера, надеясь, что это уже будет сделано. Я использую облачную функцию Python 3.9.
mdobrucki avatar
флаг tr
Если вы используете python 3.9, пример, представленный в документации, должен сработать, обязательно следуйте ему правильно и соответствующим образом структурируйте свои данные. Рассматривали ли вы возможность использования клиентских библиотек ведения журналов с этим [примером](https://cloud.google.com/logging/docs/reference/libraries#write_structured_logs)?
questionto42standswithUkraine avatar
флаг mx
@mdobrucki Нет, я, должно быть, следил за этим, так как вместо этого я искал непосредственно «структурированный json». Я проверю это с помощью библиотеки Google и использую регистратор примера.
mdobrucki avatar
флаг tr
Дайте мне знать, что вы установили.
questionto42standswithUkraine avatar
флаг mx
@mdobrucki Да, сработало. Моя вина, так как это руководство в ссылке совершенно ясно. У меня были некоторые проблемы с классами даты и времени - я получил `google.protobuf.json_format.ParseError: Value 2022-02-09 13:27:35.067000+00:00 имеет неожиданный тип `. Но на данный момент решил это с помощью `str()` вокруг этого класса datetime, также можно использовать `.strftime()`, чтобы сделать его строкой. `default=str` в качестве параметра, как вы можете использовать его во встроенном модуле Python `logging`, не работает. В любом случае, вы можете ответить, если хотите, тогда я, возможно, мог бы «отредактировать» свой пример, как я заставил его работать.
Рейтинг:1
флаг tr

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

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

Поместите в ваши требования.txt:

google-cloud-loging == 3.0.0

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

из google.cloud импортировать журнал как gclogger

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

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

json_for_gcp_lbm = {МОЙ_JSON_HERE}

    из google.cloud импортировать журнал как gclogger

    ...

    logging_client = gclogger.Client()
    logger_name = "MY_LOG_NAME_OF_FREE_CHOICE" # Сохранено в облачных журналах Google.
    logger = logging_client.logger(logger_name)

    # Я не знаю, как это будет работать с `импортом журнала` 
    # встроенный модуль Python, но я заставил его работать с добавлением
    # Следующая строка не работает
    # logging.info(json.dumps(json_for_gcp_lbm, по умолчанию=str))
    # Вместо этого нам нужно 
    # 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):

введите описание изображения здесь

questionto42standswithUkraine avatar
флаг mx
Я не знаю, как он получит jsonPayload, используя `import logging` в качестве встроенного модуля Python в первой ссылке :). При использовании только последней строки примера вместо этого выдается только `textPayload`. Скорее всего, мне нужна часть запроса с этим `global_log_fields = {}`, чтобы он работал. Я думаю, что `import google.cloud.logging` более "питоновский", даже если для этого мне нужно установить и импортировать облачное ведение журнала Google.
questionto42standswithUkraine avatar
флаг mx
Небольшой бонус, я не спрашивал об этом, увидел это случайно: ниже на той же странице вашей первой ссылки есть отрывок о том, как я мог также получить доступ к новым журналам `google.cloud.logging` с его `jsonPayload` записи из CF, см. раздел [Использование Logging API](https://cloud.google.com/functions/docs/monitoring/logging#using_the_logging_api).

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.