Журналы NGINX не имеют поля jsonPayload в Stackdriver - PullRequest
0 голосов
/ 16 января 2019

У меня есть базовое развертывание nginx, обслуживающее статический контент, работающий в кластере GKE. Я настроил ведение журнала Stackdriver для кластера в соответствии с инструкциями здесь (я включил ведение журнала для существующего кластера), а также включил функцию мониторинга Stackdriver Kubernetes, объясненную здесь . Кажется, что само ведение журнала работает нормально, поскольку я вижу журналы из nginx в Stackdriver.

Я пытаюсь создать некоторые метрики на основе журнала, например количество выполненных запросов 2xx, но все, что я получаю в записях журнала в Stackdriver, - это поле textPayload. Насколько я понимаю, включение Stackdriver Monitoring в кластере раскручивает некоторые агенты Fluentd (что я вижу, если я запускаю kubectl get pods -n kube-system), и у них должен быть по умолчанию включен анализатор журнала nginx (согласно документации здесь ). Однако ни одна из записей журнала, отображаемых в Stackdriver, не имеет поля jsonPayload, которое должно быть там для структурированных журналов.

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

Я уверен, что что-то упустил, но не могу понять, что.

Edit:

Для справки, вот мой формат журнала NGINX:

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent"';

И я до сих пор пробовал следующее:

  • Обновите мой кластер k8s с версии 1.11.5 до 1.11.6 (из-за проблемы со структурированным ведением журнала в версии 1.11.4, которая была исправлена ​​в 1.11.6)
  • Понижение с версии 1.11.6 до 1.11.3
  • Создайте новый кластер с консолью GCP (версия 1.10.9) с включенными опциями Stackdriver Monitoring и Stackdriver Logging и разверните на нем мое приложение. По-прежнему нет jsonPayload поля, только textPayload.

Пока что ни один из них не решил это.

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

После обращения в службу поддержки Google Cloud нам удалось найти обходной путь для этой проблемы, хотя первопричина до сих пор остается неизвестной.

Обходной путь - определить сам формат журнала NGINX в виде строки JSON. Это позволит анализатору Google-Fluentd правильно анализировать полезную нагрузку как объект JSON. Это единственное решение, которое до сих пор работало для меня.

Для справки, формат журнала, который я использовал:

log_format json_combined escape=json
'{'
'"time_local":"$time_local",'
'"remote_addr":"$remote_addr",'
'"remote_user":"$remote_user",'
'"request_method":"$request_method",'
'"request":"$request",'
'"status": "$status",'
'"body_bytes_sent":"$body_bytes_sent",'
'"request_time":"$request_time",'
'"http_referrer":"$http_referer",'
'"http_user_agent":"$http_user_agent"'
'}';
access_log /var/log/nginx/access.log json_combined;
0 голосов
/ 17 января 2019

Вы случайно не используете Kubernetes 1.11.4? Это известная проблема с бета-версией 1.11.4 . Исправление доступно в Beta Update (Kubernetes 1.11.6) . Пожалуйста, подтвердите вашу версию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...