2013-07-19 11 views
13

Używam nginx jako load balancera przed kilkoma serwerami aplikacji i chcę ustawić identyfikator śledzenia, aby skorelować żądania z dziennikami serwera aplikacji. Jaki jest najlepszy sposób na zrobienie tego w Nginx, czy jest tam dobry moduł trzeciej strony?Ustawianie identyfikatora śledzenia w module równoważenia obciążenia nginx

W przeciwnym razie całkiem prosty sposób polega na oparciu go o znacznik czasu (ewentualnie plus losowy numer, jeśli to nie jest wystarczająco precyzyjne) i ustawienie go jako dodatkowego nagłówka w żądaniu, ale jedyne polecenie set_header, które widzę w dokumentach służy do ustawienia nagłówka odpowiedzi.

Odpowiedz

19

W większości przypadków nie potrzebujesz niestandardowego modułu, możesz po prostu ustawić nagłówek z kombinacją wbudowanych zmiennych http_core_module , który jest (najprawdopodobniej) unikalny. Przykład:

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

To dałoby identyfikator żądania jak „31725-1406109429.299-127.0.0.1-1227” i powinien być „wystarczająco unikalny” służyć jako identyfikator śledzenia.

+0

bardzo miłe. czy można go ustawić na zmienną do ponownego wykorzystania w ramach żądania? aby mógł być również wykorzystywany w dziennikach? w przeciwnym razie dwukrotne wywołanie $ msec spowoduje wygenerowanie innej wartości, więc myślę, że coś w stylu 'set $ request_id $ pid- $ msec- $ remote_addr- $ request_length;' ale do tej pory nie mogło go uruchomić – isapir

+6

dla którego pracuje ja, używam tego 'set $ tid $ pid- $ msec- $ remote_addr- $ request_length- $ connection;' and 'proxy_set_header X-Tracing-Id $ tid;' później sprawdź twój zakres użycia ... – sbange

+0

tak, mam to również do pracy. Dziękuję Ci. – isapir

0

W naszym środowisku produkcyjnym mamy niestandardowy moduł podobny do tego. Może wygenerować unikalny identyfikator śledzenia, a następnie zostanie przekazany do nagłówków HTTP, które będą wysyłane do serwera nadrzędnego. Serwer nadrzędny sprawdzi, czy określone pole jest ustawione, otrzyma wartość i zapisze ją w dzienniku access_log, dzięki czemu możemy prześledzić żądanie.

Uważam, że moduł innej firmy wygląda tak samo: nginx-operationid, mam nadzieję, że jest pomocny.

36

nginx 1.11.0 dodał nową zmienną $request_id który jest unikalny identyfikator, dzięki czemu można zrobić coś takiego:

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

patrz odnośnik w http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_id

+2

Dla odniesienia: dokumentacja na $ request_id jest tutaj http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_id –

+0

@AndrewNewdigate hej Andrew Jestem teraz na Gitter :). Twoje zdrowie. –

+0

To jest miłe, użyłbym tego teraz, dzięki! – sbange

Powiązane problemy