Автор оригинала: Marcos Lopez Gonzalez.
1. введение
Когда мы работаем с микросервисами или веб-сервисами в целом, очень полезно знать, как наши пользователи взаимодействуют с нашими сервисами. Это может быть достигнуто путем отслеживания всех запросов, поступающих в наши службы, и сбора этой информации для последующего анализа.
Есть некоторые доступные системы, которые могут помочь нам в этом и могут быть легко интегрированы с Spring, например Zipkin . Однако привод Spring Boot имеет эту встроенную функцию и может использоваться через конечную точку http Trace , которая отслеживает все HTTP-запросы. В этом уроке мы покажем, как его использовать и как настроить, чтобы он лучше соответствовал нашим требованиям.
2. Настройка Конечной Точки Трассировки Http
Для этого урока мы будем использовать проект Maven Spring Boot .
Первое, что нам нужно сделать, это добавить зависимость привода пружинной загрузки в наш проект:
org.springframework.boot spring-boot-starter-actuator
После этого нам нужно будет включить конечную точку http Trace в нашем приложении.
Для этого нам просто нужно изменить наш файл application.properties , чтобы включить http-трассировку конечную точку :
management.endpoints.web.exposure.include=httptrace
В случае, если нам нужно больше конечных точек, мы можем просто объединить их, разделив запятыми, или мы можем включить их все, используя подстановочный знак * .
Теперь наша конечная точка httpTrace должна появиться в списке конечных точек привода нашего приложения:
{ "_links": { "self": { "href": "http://localhost:8080/actuator", "templated": false }, "httptrace": { "href": "http://localhost:8080/actuator/httptrace", "templated": false } } }
Обратите внимание, что мы можем перечислить все включенные конечные точки привода, перейдя в конечную точку /привода нашей веб-службы.
3. Анализ следов
Давайте теперь проанализируем следы, которые возвращает конечная точка http Trace actuator.
Давайте сделаем несколько запросов к нашей службе, вызовем //http-трассировку конечную точку и возьмем одну из возвращенных трассировок:
{ "traces": [ { "timestamp": "2019-08-05T19:28:36.353Z", "principal": null, "session": null, "request": { "method": "GET", "uri": "http://localhost:8080/echo?msg=test", "headers": { "accept-language": [ "en-GB,en-US;q=0.9,en;q=0.8" ], "upgrade-insecure-requests": [ "1" ], "host": [ "localhost:8080" ], "connection": [ "keep-alive" ], "accept-encoding": [ "gzip, deflate, br" ], "accept": [ "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8" ], "user-agent": [ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36 OPR/62.0.3331.66" ] }, "remoteAddress": null }, "response": { "status": 200, "headers": { "Content-Length": [ "12" ], "Date": [ "Mon, 05 Aug 2019 19:28:36 GMT" ], "Content-Type": [ "text/html;charset=UTF-8" ] } }, "timeTaken": 82 } ] }
Как мы видим, ответ разделен на несколько узлов:
- метка времени : время получения запроса
- принципал : аутентифицированный пользователь, который сделал запрос, если это применимо
- сеанс : любой сеанс, связанный с запросом
- запрос : информация о запросе, такая как метод, полный URI или заголовки
- ответ : информация об ответе, такая как статус или заголовки
- затраченное время : время, затраченное на обработку запроса
Мы можем адаптировать этот ответ к нашим потребностям, если чувствуем, что он слишком многословен. Мы можем сообщить Spring, какие поля мы хотим вернуть, указав их в management.trace.http.include property нашего application.properties :
management.trace.http.include=RESPONSE_HEADERS
В этом случае мы указали, что нам нужны только заголовки ответов. Следовательно, мы можем видеть, что поля, которые были включены раньше, такие как заголовки запроса или затраченное время, сейчас отсутствуют в ответе:
{ "traces": [ { "timestamp": "2019-08-05T20:23:01.397Z", "principal": null, "session": null, "request": { "method": "GET", "uri": "http://localhost:8080/echo?msg=test", "headers": {}, "remoteAddress": null }, "response": { "status": 200, "headers": { "Content-Length": [ "12" ], "Date": [ "Mon, 05 Aug 2019 20:23:01 GMT" ], "Content-Type": [ "text/html;charset=UTF-8" ] } }, "timeTaken": null } ] }
Все возможные значения , которые могут быть включены, можно найти в исходном коде |, а также значения по умолчанию.
4. Настройка репозитория трассировки Http
По умолчанию конечная точка http Trace возвращает только последние 100 запросов и сохраняет их в памяти . Хорошей новостью является то, что мы также можем настроить это, создав свой собственный репозиторий трассировки Http//.
Теперь давайте создадим наш репозиторий. Интерфейс Http Trace Repository очень прост, и нам нужно реализовать только два метода: findAll() для извлечения всех трассировок и add() для добавления трассировки в репозиторий.
Для простоты наш репозиторий также будет хранить следы в памяти, и мы будем хранить только последний запрос GET, который попадает в наш сервис:
@Repository public class CustomTraceRepository implements HttpTraceRepository { AtomicReferencelastTrace = new AtomicReference<>(); @Override public List findAll() { return Collections.singletonList(lastTrace.get()); } @Override public void add(HttpTrace trace) { if ("GET".equals(trace.getRequest().getMethod())) { lastTrace.set(trace); } } }
Несмотря на то, что этот простой пример может показаться не очень полезным, мы видим, насколько мощным он может стать и как мы можем хранить наши журналы в любом месте.
5. Фильтрация путей для трассировки
Последнее, что мы собираемся рассмотреть, – это как фильтровать пути, которые мы хотим отслеживать, чтобы мы могли игнорировать некоторые запросы, которые нас не интересуют.
Если мы немного поиграем с конечной точкой http Trace после выполнения некоторых запросов к нашему сервису, мы увидим, что мы также получаем трассировки для запросов привода:
{ "traces": [ { "timestamp": "2019-07-28T13:56:36.998Z", "principal": null, "session": null, "request": { "method": "GET", "uri": "http://localhost:8080/actuator/", // ... }
Мы можем не найти эти следы полезными для нас, и мы предпочли бы исключить их. В этом случае нам просто нужно создать свой собственный Http-фильтр трассировки и указать, какие пути мы хотим игнорировать в методе shouldNotFilter :
@Component public class TraceRequestFilter extends HttpTraceFilter { public TraceRequestFilter(HttpTraceRepository repository, HttpExchangeTracer tracer) { super(repository, tracer); } @Override protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException { return request.getServletPath().contains("actuator"); } }
Обратите внимание, что фильтр трассировки Http -это обычный фильтр Spring, но с некоторыми функциями, специфичными для трассировки.
6. Заключение
В этом уроке мы представили конечную точку http Trace Spring Boot Actuator и показали ее основные функции. Мы также копнули немного глубже и объяснили, как изменить некоторые модели поведения по умолчанию, чтобы лучше соответствовать нашим конкретным потребностям.
Как всегда, полный исходный код примеров доступен на GitHub .