2013-07-19 7 views
13

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

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

ответ

19

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

location/{ 
     proxy_pass http://upstream; 
     proxy_set_header X-Request-Id $pid-$msec-$remote_addr-$request_length; 
    } 

Это дало бы идентификатор запроса, как «31725-1406109429.299-127.0.0.1-1227» и должен быть «достаточно уникально», чтобы служить в качестве следового идентификатора.

+0

очень приятно. может ли он быть установлен на переменную для повторного использования в запросе? так что его можно использовать и в журналах? иначе вызов $ msec будет генерировать другое значение, поэтому я думаю что-то вроде 'set $ request_id $ pid- $ msec- $ remote_addr- $ request_length;', но до сих пор не смог заставить его работать – isapir

+6

он работает для Я использую это 'set $ tid $ pid- $ msec- $ remote_addr- $ request_length- $ connection;' и 'proxy_set_header X-Tracing-Id $ tid;' позже, проверьте свою область использования ... – sbange

+0

Да, я получил это, чтобы работать также. Спасибо. – isapir

0

В нашей производственной среде у нас есть специальный модуль, подобный этому. Он может генерировать уникальный идентификатор трассировки, а затем он будет помещен в заголовки http, которые отправляются на восходящий сервер. Сервер восходящего потока будет проверять, установлено ли определенное поле, оно получит значение и запишет его в access_log, таким образом, мы можем отслеживать запрос.

И я нахожу, что сторонний модуль выглядит просто так: nginx-operationid, надеюсь, это полезно.

36

Nginx 1.11.0 добавил новую переменную $request_id, который является уникальным идентификатором, так что вы можете сделать что-то вроде:

location/{ 
     proxy_pass http://upstream; 
     proxy_set_header X-Request-Id $request_id; 
    } 

См ссылки на http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_id

+2

Для справки: документация на $ request_id находится здесь http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_id –

+0

@AndrewNewdigate hey Andrew Я сейчас на Gitter :). Приветствия. –

+0

Это хорошо, я бы использовал это сейчас, спасибо! – sbange