Логи NGINX не имеют поля jsonPayload в Stackdriver

Весь смысл Injection Dependency Injection (DI) заключается в том, чтобы сохранить исходный код приложения чистым и стабильным:

  • очистить код инициализации зависимостей
  • стабильно независимо от используемой зависимости

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

Конкретным доменом DI является делегирование конфигурации зависимостей и инициализации.

Пример: DI со сценарием оболочки

Если вы иногда работаете за пределами Java, вспомните, как source часто используется во многих языках сценариев (Shell, Tcl и т. д. или даже import в Python

Рассмотрим простой скрипт dependent.sh:

#!/bin/sh
# Dependent
touch         "one.txt" "two.txt"
archive_files "one.txt" "two.txt"

Сценарий зависит: он не будет успешно выполнен сам по себе (archive_files не является

Вы определяете archive_files в сценарии реализации archive_files_zip.sh (используя в этом случае zip):

#!/bin/sh
# Dependency
function archive_files {
    zip files.zip "$@"
}

Вместо скрипта реализации source -ing непосредственно в зависимом, вы используете контейнер injector.sh, который обертывает s «компоненты»:

#!/bin/sh 
# Injector
source ./archive_files_zip.sh
source ./dependent.sh

Зависимость archive_files только что была введена в зависимый скрипт.

Вы могли бы ввести зависимость, которая реализует archive_files с помощью tar или xz.

Пример: удаление DI

Если используется сценарий dependent.sh зависимостей напрямую, этот подход будет называться поиск зависимостей (что противоположно инъекции зависимостей ):

#!/bin/sh
# Dependent

# dependency look-up
source ./archive_files_zip.sh

touch         "one.txt" "two.txt"
archive_files "one.txt" "two.txt"

Теперь проблема в том, что зависимые " компонент "должен выполнить инициализацию.

Исходный код« компонента »не является ни чистым, ни стабильным, поскольку для каждого изменения в инициализации зависимостей требуется новая версия для файла исходного кода« компонентов ».

Последние слова

DI не так сильно акцентирован и популяризирован, как в Java-фреймворках.

Но это общий подход для разделения проблем:

  • разработка приложений (жизненный цикл выпуска с одним исходным кодом)
  • развертывание приложений (множественный размер t с независимыми жизненными циклами)

Использование конфигурации только с поиском зависимостей не помогает, так как количество параметров конфигурации может меняться в зависимости от зависимости (например, новый тип аутентификации), а также количество поддерживаемых типов зависимостей (например, новый тип базы данных).

0
задан Ragnar Mikael Halldórsson 18 January 2019 в 15:08
поделиться

2 ответа

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

0
ответ дан Asif Tanwir 18 January 2019 в 15:08
поделиться

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

Обходной путь - определить сам формат журнала 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
ответ дан Ragnar Mikael Halldórsson 18 January 2019 в 15:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: