{"id":476663,"date":"2026-04-20T11:45:08","date_gmt":"2026-04-20T11:45:08","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=476663"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=476663","title":{"rendered":"\u0422\u0440\u0435\u0439\u0441\u044b \u0432 Spring Boot 3 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Zipkin \u0438 Kafka \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0430. \u0427\u0430\u0441\u0442\u044c 2"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u0422\u0440\u0435\u0439\u0441\u044b \u0432 Spring Boot 3 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Zipkin \u0438 Kafka \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0430. \u0427\u0430\u0441\u0442\u044c 2<\/h2>\n<h3>\u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435<\/h3>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/alfastrah\/articles\/770566\">\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0430\u0432\u0442\u043e\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0442\u0440\u0435\u0439\u0441\u044b \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u043d\u0430 \u0431\u0430\u0437\u0435 Spring Boot. \u041a\u0430\u043a \u0440\u0430\u043d\u0435\u0435 \u0431\u044b\u043b\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043e, \u043e\u043d\u0430 \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u043e\u0435\u0434\u0438\u043d\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0438\u0437 \u0442\u0440\u0435\u0439\u0441\u043e\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441\u0442\u0430\u0440\u0442\u0435\u0440, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u044d\u0442\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c.<\/p>\n<h4>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0435\u0441\u044f \u043a \u0440\u0435\u0448\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b<\/h4>\n<p>\u0421 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438, \u0432 \u0441\u0442\u0430\u0440\u0442\u0435\u0440 \u0431\u044b\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f: \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 <code>custom.tracing.sasl-mechanism<\/code> \u0438 <code>custom.tracing.security-protocol<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u0430. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430\u043c\u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432 kafka.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043c\u044b \u0441\u0442\u0430\u043b\u0438 \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u0438\u043f \u0442\u0440\u0435\u0439\u0441\u043e\u0432, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 <code>management.tracing.propagation.type<\/code> \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c <code>w3c<\/code>. \u042d\u0442\u043e \u0440\u0435\u0448\u0438\u043b\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0442\u0440\u0435\u0439\u0441\u043e\u0432, \u0447\u0442\u043e \u0440\u0430\u043d\u0435\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b\u043e \u043a \u0440\u0430\u0437\u0440\u044b\u0432\u0430\u043c \u0432 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0435.<\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0432 <code>application.yaml<\/code> \u0441\u0442\u0430\u043b\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"yaml\">custom:  tracing:    bootstrap-servers: broker-1:9092, broker-2:9092, broker-3:9092    username: ${USERNAME}    password: ${PASSWORD}    sasl-mechanism: SCRAM-SHA-256    security-protocol: SASL_SSL    topic: trace-topicmanagement:  tracing:    enabled: true    propagation:      type: w3c    sampling:      probability: 1<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u041a\u0430\u043a \u043c\u044b \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u043c\u0441\u044f<\/h3>\n<p>\u0414\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438 \u0432 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 bean\u2019\u0430\u0445, \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u044b:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/docs.spring.io\/spring-cloud-openfeign\/docs\/current\/reference\/html\">Spring Cloud Openfeign<\/a>: \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u043f\u0440\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 REST-\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f\u0445;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/docs.spring.io\/spring-kafka\/reference\/kafka.html\">Spring Kafka<\/a> \u043f\u0440\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 Kafka;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/cxf.apache.org\/docs\/springboot.html\">Apache CXF<\/a>: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f SOAP-\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0439 (\u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0433\u0430\u0439\u0434 Baeldung: <a href=\"https:\/\/www.baeldung.com\/apache-cxf-with-spring\">A Guide to Apache CXF with Spring<\/a>);<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/docs.spring.io\/spring-cloud-gateway\/docs\/current\/reference\/html\">Spring Cloud Gateway<\/a>: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438;<\/p>\n<\/li>\n<\/ul>\n<h3>\u0424\u043e\u0440\u043c\u0430\u0442 \u0442\u0440\u0435\u0439\u0441\u043e\u0432<\/h3>\n<p>\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442 <code>w3c<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 <a href=\"https:\/\/www.w3.org\/TR\/trace-context\">\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0443 W3C Trace Context<\/a>.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f W3C Trace Context, \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438:<\/p>\n<ul>\n<li>\n<p><code>traceparent<\/code>: \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 ID \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u0438 ID \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438;<\/p>\n<\/li>\n<li>\n<p><code>tracestate<\/code>: \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0447\u0435\u0440\u0435\u0437 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0438\u0441\u0442\u0435\u043c (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439).<\/p>\n<\/li>\n<\/ul>\n<h4>Traceparent<\/h4>\n<p>\u042d\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u0441\u0435\u0442 \u0432 \u0441\u0435\u0431\u0435:<\/p>\n<ul>\n<li>\n<p>\u0412\u0435\u0440\u0441\u0438\u044e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430;<\/p>\n<\/li>\n<li>\n<p>Trace ID (\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438);<\/p>\n<\/li>\n<li>\n<p>Parent ID (\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e span);<\/p>\n<\/li>\n<li>\n<p>Flags (\u0444\u043b\u0430\u0433\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u043e\u0439).<\/p>\n<\/li>\n<\/ul>\n<p>\u0424\u043e\u0440\u043c\u0430\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 traceparent:<\/p>\n<pre><code>{version}-{trace-id}-{parent-id}-{trace-flags}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c:<\/p>\n<ul>\n<li>\n<p><code>00<\/code> \u2014 \u0412\u0435\u0440\u0441\u0438\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u0430 <code>traceparent<\/code> (\u0441\u0435\u0439\u0447\u0430\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f: 00 (\u0432\u0435\u0440\u0441\u0438\u044f 0));<\/p>\n<\/li>\n<li>\n<p><code>69bd60bfbe6c8f2ebc4fd6787aa0a747<\/code> \u2014 Trace ID (\u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0434\u043d\u043e\u0439 \u0442\u0440\u0430\u0441\u0441\u044b (end-to-end \u0437\u0430\u043f\u0440\u043e\u0441));<\/p>\n<\/li>\n<li>\n<p><code>bc4fd6787aa0a747<\/code> \u2014 Parent ID (\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e span \u0432 \u0442\u0440\u0430\u0441\u0441\u0435). \u0412 \u043d\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u043d\u043e\u0432\u044b\u0439 span \u0441 \u043d\u043e\u0432\u044b\u043c parent-id, \u043d\u043e \u0441\u0442\u0430\u0440\u044b\u043c trace-id;<\/p>\n<\/li>\n<li>\n<p><code>01<\/code> \u2014 \u0424\u043b\u0430\u0433\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u043e\u0439. \u0412 <a href=\"https:\/\/www.w3.org\/TR\/trace-context\/#sampled-flag\">\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 sampled-flag<\/a> \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0438\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Probability sampling, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c <code>management.tracing.sampling.probability<\/code> \u0432 application.yaml: <\/p>\n<ul>\n<li>\n<p><code>01<\/code>: \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p><code>00<\/code>: \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043d\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0444\u043b\u0430\u0433 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u0430\u043b\u0435\u0435.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e \u0432 <a href=\"https:\/\/www.w3.org\/TR\/trace-context\/#traceparent-header\">\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 traceparent<\/a>.<\/p>\n<h4>Tracestate<\/h4>\n<p>\u042d\u0442\u043e\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432\u0435\u043d\u0434\u043e\u0440-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 <code>traceparent<\/code>. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 <a href=\"https:\/\/www.w3.org\/TR\/trace-context\/#tracestate-header\">\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 tracestate<\/a>.<\/p>\n<h3>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438<\/h3>\n<p>\u0412 <a href=\"https:\/\/habr.com\/ru\/companies\/alfastrah\/articles\/770566\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u0432\u0441\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0431\u044b\u043b\u0438 \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u044b \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0430\u0440\u0442\u0435\u0440, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f (\u043a\u0440\u043e\u043c\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0441\u0438\u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0442\u0430\u0440\u0442\u0435\u0440\u0430).<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0438 \u0434\u0430\u043b\u0435\u0435 \u0432\u0441\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u0441\u0442\u0430\u0440\u0442\u0435\u0440\u0430, \u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u0442\u0435 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0432 \u043d\u0435\u0433\u043e.<\/p>\n<h4>OpenFeign<\/h4>\n<p>\u0414\u043b\u044f feign-\u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 micrometer. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u0442.\u0447. \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 (\u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439). \u041c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 bean \u0442\u0438\u043f\u0430 <code>MicrometerObservationCapability<\/code>. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 <a href=\"https:\/\/docs.spring.io\/spring-cloud-openfeign\/docs\/current\/reference\/html\/#micrometer-support\">\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 Spring Cloud OpenFeign<\/a>.<\/p>\n<p>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f:<\/p>\n<pre><code class=\"java\">import feign.micrometer.MicrometerObservationCapability;import io.micrometer.observation.ObservationRegistry;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configuration(proxyBeanMethods = false)public class FeignObservedConfiguration {    @Bean    public MicrometerObservationCapability micrometerObservationCapability(            ObservationRegistry registry    ) {        return new MicrometerObservationCapability(registry);    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/h3>\n<p>\u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 <code>feign.micrometer.MicrometerObservationCapability<\/code> \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c:<\/p>\n<pre><code class=\"xml\">&lt;dependency&gt;    &lt;groupId&gt;io.github.openfeign&lt;\/groupId&gt;    &lt;artifactId&gt;feign-micrometer&lt;\/artifactId&gt;    &lt;version&gt;13.5&lt;\/version&gt;&lt;\/dependency&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/h3>\n<p>\u041b\u044e\u0431\u043e\u0439 \u0432\u044b\u0437\u043e\u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 (\u043f\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0438 \u043a \u043d\u0430\u0448\u0435\u043c\u0443) \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c HTTP-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 <code>traceparent<\/code>.<\/p>\n<h4>Kafka<\/h4>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c <code>traceparent<\/code> \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u0445 kafka \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c observation \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>\u0434\u043b\u044f <code>listener<\/code>, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439;<\/p>\n<\/li>\n<li>\n<p>\u0434\u043b\u044f <code>template<\/code>, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u043e \u0447\u0435\u0440\u0435\u0437 configuration properties, \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"yaml\">spring:  kafka:    listener:      observation-enabled: true    template:      observation-enabled: true<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>BeanPostProcessor<\/code>, \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:<\/p>\n<pre><code class=\"java\">import lombok.extern.slf4j.Slf4j;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;import org.springframework.kafka.core.KafkaTemplate;import org.springframework.lang.NonNull;@Slf4jpublic class KafkaObservationEnablerPostProcessor implements BeanPostProcessor {    @Override    public Object postProcessAfterInitialization(            @NonNull Object bean,            @NonNull String beanName    ) throws BeansException {        if (bean instanceof ConcurrentKafkaListenerContainerFactory&lt;?, ?&gt; factory) {            factory.getContainerProperties().setObservationEnabled(true);            log.debug(\"Observation enabled in consumer [beanName: {}, class: {}]\", beanName, bean.getClass());        } else if (bean instanceof KafkaTemplate&lt;?, ?&gt; kafkaTemplate) {            kafkaTemplate.setObservationEnabled(true);            log.debug(\"Observation enabled in producer [beanName: {}, class: {}]\", beanName, bean.getClass());        }        return bean;    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u043e \u0432\u0441\u0435\u043c listener\u2019\u0430\u043c \u0438 template\u2019\u0430\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430.<\/p>\n<p>\u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434 \u043e\u043f\u0438\u0441\u0430\u043d \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 Baeldung: <a href=\"https:\/\/www.baeldung.com\/spring-kafka-micrometer#2-propagating-the-context\">Micrometer Observation and Spring Kafka<\/a>.<\/p>\n<h3>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/h3>\n<p>\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 kafka, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a <code>traceparent<\/code>. \u041f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0442\u0440\u0435\u0439\u0441\u0430 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a \u043d\u0435\u043c\u0443.<\/p>\n<h4>SOAP-\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438<\/h4>\n<p>\u041f\u0440\u043e\u043a\u0441\u0438 \u0434\u043b\u044f SOAP-\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0439 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>JaxWsProxyFactoryBean<\/code>. \u0415\u0441\u043b\u0438 \u043d\u0435 \u0443\u0433\u043b\u0443\u0431\u043b\u044f\u0442\u044c\u0441\u044f \u0432 \u0434\u0435\u0442\u0430\u043b\u0438, \u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"java\">import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import ru.alfastrah.api.tracing.observability.soap.ws.KnownSoapClient;@Configurationclass TestSoapClientsConfiguration {    public static final String TEST_URL = \"test-url\";    @Bean    public KnownSoapClient knownSoapClient() {        JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();        jaxWsProxyFactoryBean.setAddress(TEST_URL);        return jaxWsProxyFactoryBean.create(KnownSoapClient.class);    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f HTTP-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 <code>traceparent<\/code> \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e <code>AbstractOutDatabindingInterceptor<\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 factory <code>JaxWsProxyFactoryBean<\/code>.<\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 interceptor \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"java\">import io.micrometer.tracing.TraceContext;import io.micrometer.tracing.Tracer;import org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor;import org.apache.cxf.interceptor.Fault;import org.apache.cxf.message.Message;import org.apache.cxf.phase.Phase;import ru.alfastrah.api.tracing.util.Constants;import java.util.List;import java.util.Map;import java.util.TreeMap;import static java.util.Objects.isNull;import static java.util.Objects.nonNull;public class SoapTraceParentOutDatabindingInterceptor extends AbstractOutDatabindingInterceptor {    private final Tracer tracer;    public SoapTraceParentOutDatabindingInterceptor(            Tracer tracer    ) {        super(Phase.PREPARE_SEND);        this.tracer = tracer;    }    private static Map&lt;String, List&lt;String&gt;&gt; fetchHeaders(Message message) {        Map&lt;String, List&lt;String&gt;&gt; headers = (Map&lt;String, List&lt;String&gt;&gt;) message.get(Message.PROTOCOL_HEADERS);        if (isNull(headers)) {            headers = new TreeMap&lt;&gt;();        }        return headers;    }    @Override    public void handleMessage(Message message) throws Fault {        final TraceContext traceContext = tracer.currentTraceContext().context();        if (nonNull(traceContext)) {            final Map&lt;String, List&lt;String&gt;&gt; headers = fetchHeaders(message);            headers.put(                    Constants.HttpHeaders.TRACE_PARENT,                    Constants.Helpers.TO_TRACE_PARENT.apply(traceContext)            );            message.put(Message.PROTOCOL_HEADERS, headers);        }    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438\u0437 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 <code>io.micrometer.tracing.Tracer<\/code>, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u043a \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044e.<\/p>\n<p>\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>Constants.Helpers.TO_TRACE_PARENT<\/code> \u0442\u0438\u043f\u0430 <code>Function&lt;TraceContext, List&lt;String&gt;&gt;<\/code>:<\/p>\n<pre><code class=\"java\">public static final Function&lt;TraceContext, List&lt;String&gt;&gt; TO_TRACE_PARENT = traceContext -&gt; List.of(        \"%s-%s-%s-%s\".formatted(                \"00\", \/\/ https:\/\/www.w3.org\/TR\/trace-context\/#version                traceContext.traceId(), \/\/ https:\/\/www.w3.org\/TR\/trace-context\/#trace-id                traceContext.parentId(), \/\/ https:\/\/www.w3.org\/TR\/trace-context\/#parent-id                Boolean.TRUE.equals(traceContext.sampled()) ? \"01\" : \"00\" \/\/ https:\/\/www.w3.org\/TR\/trace-context\/#sampled-flag        ));<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435 \u044f \u043f\u0440\u0438\u0432\u0435\u043b \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u043a\u0441\u0438. \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 \u0441\u0442\u0430\u0440\u0442\u0435\u0440\u0430. \u041e\u0442\u0441\u044e\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u0430\u0436\u043d\u0430\u044f \u0434\u0435\u0442\u0430\u043b\u044c: \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c interceptor \u0432 <code>JaxWsProxyFactoryBean<\/code>, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u0434 \u0442\u0440\u0435\u0439\u0441-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0441\u0442\u0430\u0440\u0442\u0435\u0440\u0443, \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0438 \u043d\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u043c\u043d\u0438\u0442\u044c.<\/p>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0434\u043b\u044f \u043d\u0430\u0441 \u0441\u043b\u0443\u0436\u0438\u0442 <code>@Aspect<\/code>, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 <code>@PointCut<\/code>\u2019\u044b \u0434\u043b\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u043f\u0440\u043e\u043a\u0441\u0438. \u0421\u0440\u0430\u0437\u0443 \u043e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e SOAP-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0435\u0432\u0435\u043b\u0438\u043a\u043e, \u0430 \u0432\u0441\u0435 \u043f\u0430\u043a\u0435\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f jax\u2019\u043e\u043c \u0434\u043b\u044f \u043d\u0438\u0445, \u0442\u0430\u043a\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b.<\/p>\n<pre><code class=\"java\">import lombok.RequiredArgsConstructor;import org.apache.cxf.endpoint.Client;import org.apache.cxf.frontend.ClientProxy;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Aspect@RequiredArgsConstructorpublic class SoapClientCreationAspect {    private final SoapTraceParentOutDatabindingInterceptor soapTraceParentOutDatabindingInterceptor;    @Pointcut(\"execution(ru.alfastrah.api..ws.* *(..))\")    public void matchesSoapClientType() {    }    @Pointcut(\"@within(org.springframework.context.annotation.Configuration) &amp;&amp; @annotation(org.springframework.context.annotation.Bean)\")    public void beanInConfiguration() {    }    @Pointcut(\"beanInConfiguration() &amp;&amp; matchesSoapClientType()\")    public void soapClientBeanCreation() {    }    @AfterReturning(pointcut = \"soapClientBeanCreation()\", returning = \"proxy\")    public Object afterUnicusSoapClientBeanCreated(Object proxy) {        final Client client = ClientProxy.getClient(proxy);        client.getOutInterceptors().add(soapTraceParentOutDatabindingInterceptor);        return proxy;    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0432\u044b\u0448\u0435\u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0430\u0441\u043f\u0435\u043a\u0442\u0430:<\/p>\n<pre><code class=\"java\">import io.micrometer.tracing.Tracer;import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configuration(proxyBeanMethods = false)@ConditionalOnClass(JaxWsProxyFactoryBean.class)public class SoapObservationConfiguration {    @Bean    @ConditionalOnBean(Tracer.class)    SoapTraceParentOutDatabindingInterceptor soapTraceParentOutDatabindingInterceptor(            Tracer tracer    ) {        return new SoapTraceParentOutDatabindingInterceptor(tracer);    }    @Bean    @ConditionalOnBean(SoapTraceParentOutDatabindingInterceptor.class)    SoapClientCreationAspect soapTracingAspect(            SoapTraceParentOutDatabindingInterceptor interceptor    ) {        return new SoapClientCreationAspect(interceptor);    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u0442\u0435 \u0442\u0440\u0435\u0439\u0441\u044b \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f <code>@Aspect<\/code>\u2019\u0430 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u043f\u0440\u043e\u043a\u0441\u0438 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0438\u0437\u043b\u0438\u0448\u0435\u0441\u0442\u0432\u043e\u043c. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c interceptor \u0432 <code>JaxWsProxyFactoryBean<\/code>.<\/p>\n<h3>\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/h3>\n<p>\u041a\u043b\u0430\u0441\u0441\u044b <code>org.apache.cxf.frontend.ClientProxy<\/code> \u0438 <code>org.apache.cxf.jaxws.JaxWsProxyFactoryBean<\/code> \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c:<\/p>\n<pre><code class=\"xml\">&lt;dependency&gt;    &lt;groupId&gt;org.apache.cxf&lt;\/groupId&gt;    &lt;artifactId&gt;cxf-rt-frontend-jaxws&lt;\/artifactId&gt;    &lt;version&gt;4.1.5&lt;\/version&gt;    &lt;scope&gt;provided&lt;\/scope&gt;&lt;\/dependency&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/h3>\n<p>\u0412\u0441\u0435 \u043f\u0440\u043e\u043a\u0441\u0438 \u0442\u0438\u043f\u043e\u0432 <code>ru.alfastrah.api..ws.*<\/code>, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c, \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0438 \u043e\u0431\u043e\u0433\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c interceptor\u2019\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 HTTP-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a <code>traceparent<\/code> \u043a \u0432\u044b\u0437\u043e\u0432\u0430\u043c SOAP-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.<\/p>\n<h4>Spring Cloud Gateway<\/h4>\n<p>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 (REST \u0438 SOAP) \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c Spring Cloud Gateway, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b. \u041f\u043e\u043c\u0438\u043c\u043e \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438, \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0438\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 (\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432, \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0438 \u0442.\u043f.), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u0443\u0447\u0430\u0441\u0442\u0438\u0435 \u0442\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u0442\u0440\u0435\u0439\u0441\u043e\u0432 \u0434\u043b\u044f \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u044b \u043f\u043e\u0442\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>Spring Cloud Gateway \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u0442\u0435\u043a\u0435, \u0434\u043b\u044f \u0435\u0433\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c <code>ObservationRegistry<\/code> \u0432 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 <code>ObservationThreadLocalAccessor<\/code> \u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430. \u042d\u0442\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043a Gateway, \u043d\u043e \u0438 \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u043d\u0430 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u0442\u0435\u043a\u0435.<\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 <code>InitializingBean<\/code> \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0439 \u0435\u0433\u043e:<\/p>\n<pre><code class=\"java\">import io.micrometer.context.ContextRegistry;import io.micrometer.observation.ObservationRegistry;import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor;import org.springframework.beans.factory.InitializingBean;import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import reactor.core.publisher.Hooks;@Configuration(proxyBeanMethods = false)@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)public class ReactorObservationConfiguration {    @Bean    public InitializingBean reactorObservationInitializer(            ObservationRegistry observationRegistry    ) {        return () -&gt; {            \/\/ Link ThreadLocal Micrometer with Reactor Context            final ObservationThreadLocalAccessor threadLocalAccessor = ObservationThreadLocalAccessor.getInstance();            threadLocalAccessor.setObservationRegistry(observationRegistry);            ContextRegistry.getInstance().registerThreadLocalAccessor(threadLocalAccessor);            \/\/ Enable automatic context propagation in Reactor 3.5.3+            Hooks.enableAutomaticContextPropagation();        };    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/h3>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c <code>io.projectreactor:reactor-core-micrometer<\/code>, \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u043c <code>reactor.core.publisher.Hooks<\/code>.<\/p>\n<pre><code class=\"xml\">&lt;dependency&gt;    &lt;groupId&gt;io.projectreactor&lt;\/groupId&gt;    &lt;artifactId&gt;reactor-core-micrometer&lt;\/artifactId&gt;    &lt;scope&gt;provided&lt;\/scope&gt;&lt;\/dependency&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/h3>\n<p>\u0420\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u0432 \u0442.\u0447. Spring Cloud Gateway), \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0432 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443.<\/p>\n<h4>\u0421\u0431\u043e\u0440\u043a\u0430 \u0432\u0441\u0435\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439<\/h4>\n<p>\u0412\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 <code>@Import<\/code> \u043d\u0430\u0434 \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c <code>CustomTracingAutoConfiguration<\/code>. \u0410\u0432\u0442\u043e\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>management.tracing.enabled<\/code> \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>true<\/code>.<\/p>\n<pre><code class=\"java\">import org.springframework.boot.actuate.autoconfigure.tracing.zipkin.ZipkinAutoConfiguration;@ConditionalOnProperty(name = \"management.tracing.enabled\", havingValue = \"true\")@AutoConfiguration(before = ZipkinAutoConfiguration.class)@Import({        KafkaSenderConfiguration.class,        ObservedAspectConfiguration.class,        FeignObservedConfiguration.class,        KafkaObservationEnablerConfig.class,        SoapObservationConfiguration.class,        ReactorObservationConfiguration.class})public class CustomTracingAutoConfiguration {}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435<\/h3>\n<h4>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h4>\n<p>\u0421\u0442\u0430\u0440\u0442\u0435\u0440 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043a\u0430\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0432 <code>pom.xml<\/code>.<\/p>\n<pre><code class=\"xml\">&lt;dependency&gt;    &lt;groupId&gt;ru.alfastrah.api&lt;\/groupId&gt;    &lt;artifactId&gt;spring-boot-tracing-starter&lt;\/artifactId&gt;    &lt;version&gt;1.1.0&lt;\/version&gt;&lt;\/dependency&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0430\u0442\u0435\u043c \u0432 <code>application.yaml<\/code> \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u0435\u0433\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u042f \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b \u0438\u0445 \u0440\u0430\u043d\u0435\u0435, \u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0443 \u0442\u0430\u043a\u0436\u0435 \u0437\u0434\u0435\u0441\u044c, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u0438 \u043f\u043e\u0434 \u0440\u0443\u043a\u043e\u0439:<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0441\u0442\u0430\u0440\u0442\u0435\u0440\u0430 \u0438 management \u0432 application.yaml<\/summary>\n<div class=\"spoiler__content\">\n<p> &#171;`yaml custom:   tracing:     bootstrap-servers: broker-1:9092, broker-2:9092, broker-3:9092     username: ${USERNAME}     password: ${PASSWORD}     sasl-mechanism: SCRAM-SHA-256     security-protocol: SASL_SSL     topic: trace-topic management:   tracing:     enabled: true     propagation:       type: w3c     sampling:       probability: 1 &#171;` <\/p>\n<\/div>\n<\/details>\n<h4>\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432<\/h4>\n<p>\u0414\u043b\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u044b \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0438\u0445\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0441\u043e\u0431\u0435\u0440\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0426\u0435\u043b\u044c \u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f &#8212; \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0442\u0440\u0435\u0439\u0441\u0430, \u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438 \u0438\u0445 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438 \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c.<\/p>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u043e\u0441\u043d\u0430\u0449\u0435\u043d \u0441\u0442\u0430\u0440\u0442\u0435\u0440\u043e\u043c \u0438 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0439. \u041d\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0435 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0440\u0435\u0439\u0441\u0430\u043c\u0438. \u042d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0441\u0442\u0430\u0440\u0442\u0435\u0440. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438\/\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441\u043a\u0440\u044b\u0442\u044b \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u0430\u043c\u0438.<\/p>\n<h3>API-gateway<\/h3>\n<p>\u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 8080 \u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0438\u0445 \u043d\u0430 \u0441\u0435\u0440\u0432\u0438\u0441 <strong>request-handler<\/strong>, \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0442\u0440\u0435\u0439\u0441. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e route.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f route&#8217;\u0430 (application.yaml) \u0434\u043b\u044f API-gateway<\/summary>\n<div class=\"spoiler__content\">\n<p> &#171;`yaml spring:   cloud:     gateway:       routes:         &#8212; id: request-handler           predicates: Path=\/trace-demo\/start           uri: http:\/\/localhost:8081 &#171;` <\/p>\n<\/div>\n<\/details>\n<h3>Request-handler<\/h3>\n<p>\u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 8081 \u043e\u0442 <strong>api-gateway<\/strong>, \u0434\u0430\u043b\u0435\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 REST-\u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u0441\u0435\u0440\u0432\u0438\u0441 <strong>producer-service<\/strong> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Feign-\u043a\u043b\u0438\u0435\u043d\u0442\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Request-handler<\/summary>\n<div class=\"spoiler__content\">\n<p> &#171;`java import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; <\/p>\n<p><a class=\"mention\" href=\"\/users\/SpringBootApplication\">@SpringBootApplication<\/a> <a class=\"mention\" href=\"\/users\/Slf4j\">@Slf4j<\/a> <a class=\"mention\" href=\"\/users\/EnableFeignClients\">@EnableFeignClients<\/a>(clients = RequestHandlerApp.DemoClient.class) public class RequestHandlerApp {<\/p>\n<pre><code>public static void main(String[] args) {    SpringApplication.run(RequestHandlerApp.class, args);}@FeignClient(        name = \"demo-client\",        url = \"http:\/\/localhost:8082\")public interface DemoClient {    @PostMapping(path = \"\/trace-demo\/producer\/send\", produces = MediaType.APPLICATION_JSON_VALUE)    void sendRequest(@RequestBody RequestDto requestDto);}@RequiredArgsConstructor@RestControllerpublic static class DemoRestController {    private final DemoClient demoClient;    @PostMapping(path = \"\/trace-demo\/start\", consumes = MediaType.APPLICATION_JSON_VALUE)    @ResponseStatus(HttpStatus.NO_CONTENT)    void start(@RequestBody RequestDto request) {        log.info(\"Received request: {}\", request);        demoClient.sendRequest(request);    }}public record RequestDto(String message) {}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>}<\/p>\n<pre><code>&lt;\/spoiler&gt;#### Producer-service\u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 8082 \u043e\u0442 **request-handler**, \u0430 \u0437\u0430\u0442\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 **kafka**.\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u0440\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 kafka.&lt;spoiler title=\"\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Producer-service\"&gt;```javaimport lombok.RequiredArgsConstructor;import lombok.extern.slf4j.Slf4j;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.http.MediaType;import org.springframework.kafka.core.KafkaTemplate;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RestController;import java.util.UUID;import java.util.concurrent.CompletableFuture;@SpringBootApplication@Slf4jpublic class ProducerApp {    public static void main(String[] args) {        SpringApplication.run(ProducerApp.class, args);    }    @RequiredArgsConstructor    @RestController    public static class DemoRestController {        private final KafkaTemplate&lt;UUID, RequestDto&gt; kafkaTemplate;        @PostMapping(path = \"\/trace-demo\/producer\/send\",                consumes = MediaType.APPLICATION_JSON_VALUE,                produces = MediaType.APPLICATION_JSON_VALUE        )        CompletableFuture&lt;SendResult&gt; produce(@RequestBody RequestDto request) {            log.info(\"Received request: {}\", request);            final UUID key = UUID.randomUUID();            log.info(\"send message to kafka: {}\", request);            return kafkaTemplate.sendDefault(key, request)                    .thenApply(sendResult -&gt;                            new SendResult(sendResult.getProducerRecord().key()));        }    }    record RequestDto(String message) {    }    record SendResult(UUID messageKey) {    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<h3>Consumer-service<\/h3>\n<p>\u0421\u043b\u0443\u0448\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0442\u043e\u043f\u0438\u043a\u0435 <code>demo-traces-topic<\/code>, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 <a href=\"https:\/\/www.baeldung.com\/kafka-spring-dead-letter-queue\">\u043f\u0430\u0442\u0442\u0435\u0440\u043d DLQ \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 Spring<\/a>:<\/p>\n<ul>\n<li>\n<p>\u043f\u0435\u0440\u0432\u0430\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u0442\u043e\u043f\u0438\u043a <code>demo-traces-topic-retry<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0432\u0442\u043e\u0440\u0430\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u0430, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u0430\u043b\u0435\u0435, \u0432 <strong>soap-service<\/strong>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f Kafka, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044f \u0440\u0430\u043d\u0435\u0435 \u043d\u0430\u0447\u0430\u0442\u044b\u0439 \u0442\u0440\u0435\u0439c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 <code>traceparent<\/code> \u043a SOAP-\u0437\u0430\u043f\u0440\u043e\u0441\u0443.<\/p>\n<details class=\"spoiler\">\n<summary>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Consumer-service<\/summary>\n<div class=\"spoiler__content\">\n<p> &#171;`java import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.cxf.ext.logging.LoggingInInterceptor; import org.apache.cxf.ext.logging.LoggingOutInterceptor; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.kafka.annotation.KafkaListener; import org.springframework.kafka.annotation.RetryableTopic; import org.springframework.kafka.support.KafkaHeaders; import org.springframework.messaging.handler.annotation.Header; import org.springframework.retry.annotation.Backoff; import org.springframework.stereotype.Component; import ru.alfastrah.schemas.interplat4.AnyPort; import ru.alfastrah.schemas.interplat4.GetAnyRequest; import ru.alfastrah.schemas.interplat4.GetAnyResponse; <\/p>\n<p>import java.util.UUID;<\/p>\n<p><a class=\"mention\" href=\"\/users\/SpringBootApplication\">@SpringBootApplication<\/a> <a class=\"mention\" href=\"\/users\/Slf4j\">@Slf4j<\/a> public class ConsumerApp {<\/p>\n<pre><code>public static void main(String[] args) {    SpringApplication.run(ConsumerApp.class, args);}@Component@RequiredArgsConstructorpublic static class Listener {    private final AnyPort anyPort;    @RetryableTopic(            attempts = \"2\",            backoff = @Backoff(delayExpression = \"1000\")    )    @KafkaListener(topics = \"demo-traces-topic\")    public void listen(            ConsumerRecord&lt;UUID, KafkaMessage&gt; consumerRecord,            @Header(KafkaHeaders.RECEIVED_TOPIC) String receivedTopic    ) {        final KafkaMessage value = consumerRecord.value();        log.info(\"Handled message: {}\", value);        if (!receivedTopic.endsWith(\"retry\")) {            log.error(\"Processing error. Retry\");            throw new RuntimeException(\"Processing error\");        }        final GetAnyRequest soapRequest = new GetAnyRequest();        soapRequest.setMessage(value.message());        final GetAnyResponse soapResponse = anyPort.getAny(soapRequest);        log.info(\"Response: {}\", soapResponse.isResult());    }}@Configurationpublic static class SoapConfig {    @Bean    AnyPort anyPort() {        JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();        jaxWsProxyFactoryBean.setAddress(\"http:\/\/localhost:8084\/ws\");        jaxWsProxyFactoryBean.getOutInterceptors().add(new LoggingOutInterceptor());        jaxWsProxyFactoryBean.getInInterceptors().add(new LoggingInInterceptor());        return jaxWsProxyFactoryBean.create(AnyPort.class);    }}public record KafkaMessage(String message) {}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>}<\/p>\n<pre><code>&lt;\/spoiler&gt;#### Soap-service\u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 SOAP-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 8084 \u043e\u0442 **consumer-service**, \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442. \u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 `traceparent` \u0432 [SOAP-\u0441\u0435\u0440\u0432\u0438\u0441\u0430\u0445,\u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Spring Boot](https:\/\/www.baeldung.com\/spring-boot-soap-web-service).&lt;spoiler title=\"\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Soap-service\"&gt;```javaimport lombok.RequiredArgsConstructor;import lombok.extern.slf4j.Slf4j;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.web.servlet.ServletRegistrationBean;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.io.ClassPathResource;import org.springframework.ws.config.annotation.EnableWs;import org.springframework.ws.config.annotation.WsConfigurerAdapter;import org.springframework.ws.server.endpoint.annotation.Endpoint;import org.springframework.ws.server.endpoint.annotation.PayloadRoot;import org.springframework.ws.server.endpoint.annotation.RequestPayload;import org.springframework.ws.server.endpoint.annotation.ResponsePayload;import org.springframework.ws.transport.http.MessageDispatcherServlet;import org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition;import org.springframework.xml.xsd.SimpleXsdSchema;import org.springframework.xml.xsd.XsdSchema;import ru.alfastrah.api.ws.GetAnyRequest;import ru.alfastrah.api.ws.GetAnyResponse;@SpringBootApplication@Slf4jpublic class SoapServiceApplication {    private static final String NAMESPACE_URI = \"http:\/\/alfastrah.ru\/api\/ws\";    public static void main(String[] args) {        SpringApplication.run(SoapServiceApplication.class, args);    }    @Endpoint    @RequiredArgsConstructor    public static class AnyEndpoint {        @PayloadRoot(namespace = NAMESPACE_URI, localPart = \"getAnyRequest\")        @ResponsePayload        public GetAnyResponse get(@RequestPayload GetAnyRequest request) {            log.info(\"Handling message: {}\", request.getMessage());            final GetAnyResponse getAnyResponse = new GetAnyResponse();            getAnyResponse.setResult(true);            return getAnyResponse;        }    }    @EnableWs    @Configuration    public static class WebServiceConfig extends WsConfigurerAdapter {        @Bean        public ServletRegistrationBean&lt;MessageDispatcherServlet&gt; messageDispatcherServlet(                ApplicationContext applicationContext        ) {            MessageDispatcherServlet servlet = new MessageDispatcherServlet();            servlet.setApplicationContext(applicationContext);            servlet.setTransformWsdlLocations(true);            return new ServletRegistrationBean&lt;&gt;(servlet, \"\/ws\/*\");        }        @Bean(name = \"any\")        public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema countriesSchema) {            DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();            wsdl11Definition.setPortTypeName(\"AnyPort\");            wsdl11Definition.setLocationUri(\"\/ws\");            wsdl11Definition.setTargetNamespace(NAMESPACE_URI);            wsdl11Definition.setSchema(countriesSchema);            return wsdl11Definition;        }        @Bean        public XsdSchema countriesSchema() {            return new SimpleXsdSchema(new ClassPathResource(\"\/schema.xsd\"));        }    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<h3>\u0417\u0430\u043f\u0443\u0441\u043a \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430<\/h3>\n<p>\u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0434\u0435\u043b\u0430\u0435\u043c POST \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 <strong>api-gateway<\/strong>:<\/p>\n<pre><code class=\"bash\">POST \/trace-demo\/start HTTP\/1.1Host: localhost:8080Authorization: Bearer bearer.token.contentContent-Type: application\/jsonContent-Length: 34{    \"message\": \"Hello, World!\"}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0437\u043d\u0430\u0447\u0438\u043c\u044b\u0435 \u043b\u043e\u0433\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0412 \u043d\u0438\u0445 \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u043e\u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u0412 \u043b\u043e\u0433\u0430\u0445 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 traceId <code>69bd61a67d70e718ad939eda62b5ba02<\/code>.<\/p>\n<pre><code>2026-03-20T18:03:02.925+03:00  INFO 21738 --- [api-gateway] [ctor-http-nio-4] [69bd61a67d70e718ad939eda62b5ba02-05d2ca72fd9e68f7] r.a.a.i.a.f.global.RequestLoggingFilter  : ---&gt; [request-handler] [31da0780-4] [POST http:\/\/localhost:8080\/trace-demo\/start], headers=[{Authorization=[***], Accept=[*\/*], Cache-Control=[no-cache], User-Agent=[PostmanRuntime\/7.29.3], Connection=[keep-alive], Postman-Token=[b0de70f4-7600-4b02-9d0c-07087d99dcf7], Host=[localhost:8080], Accept-Encoding=[gzip, deflate, br], Content-Length=[34], Content-Type=[application\/json]}]2026-03-20T18:03:03.763+03:00  INFO 21738 --- [api-gateway] [ctor-http-nio-4] [69bd61a67d70e718ad939eda62b5ba02-05d2ca72fd9e68f7] r.a.a.i.a.f.global.RequestLoggingFilter  : &lt;--- [request-handler] [31da0780-4] [204 NO_CONTENT http:\/\/localhost:8081\/trace-demo\/start]2026-03-20T18:03:03.087+03:00  INFO 13874 --- [request-handler] [nio-8081-exec-1] [69bd61a67d70e718ad939eda62b5ba02-3dd0d6ee2d003442] ru.alfastrah.api.RequestHandlerApp       : Received request: RequestDto[message=Hello, World!]2026-03-20T18:03:03.118+03:00 DEBUG 13874 --- [request-handler] [nio-8081-exec-1] [69bd61a67d70e718ad939eda62b5ba02-3dd0d6ee2d003442] r.a.api.RequestHandlerApp$DemoClient     : [DemoClient#sendRequest] ---&gt; POST http:\/\/localhost:8082\/trace-demo\/producer\/send HTTP\/1.12026-03-20T18:03:03.730+03:00 DEBUG 13874 --- [request-handler] [nio-8081-exec-1] [69bd61a67d70e718ad939eda62b5ba02-3dd0d6ee2d003442] r.a.api.RequestHandlerApp$DemoClient     : [DemoClient#sendRequest] &lt;--- HTTP\/1.1 200 (605ms)2026-03-20T18:03:03.235+03:00  INFO 20771 --- [producer-service] [nio-8082-exec-9] [69bd61a67d70e718ad939eda62b5ba02-0996a1356bf5ebd7] ru.alfastrah.api.ProducerApp             : Received request: RequestDto[message=Hello, World!]2026-03-20T18:03:03.241+03:00  INFO 20771 --- [producer-service] [nio-8082-exec-9] [69bd61a67d70e718ad939eda62b5ba02-0996a1356bf5ebd7] ru.alfastrah.api.ProducerApp             : Send message to kafka: RequestDto[message=Hello, World!]2026-03-20T18:03:03.647+03:00  INFO 16539 --- [consumer-service] [ntainer#0-0-C-1] [69bd61a67d70e718ad939eda62b5ba02-05d5ea464727cedd] r.a.api.app.ConsumerApp$Listener         : Handled message from topic demo-traces-topic: KafkaMessage[message=Hello, World!]2026-03-20T18:03:03.665+03:00 ERROR 16539 --- [consumer-service] [ntainer#0-0-C-1] [69bd61a67d70e718ad939eda62b5ba02-05d5ea464727cedd] r.a.api.app.ConsumerApp$Listener         : Processing error. Retry2026-03-20T18:03:04.688+03:00  INFO 16539 --- [consumer-service] [r#0-retry-0-C-1] [69bd61a67d70e718ad939eda62b5ba02-37ea00b17e36fb56] r.a.api.app.ConsumerApp$Listener         : Handled message from topic demo-traces-topic-retry: KafkaMessage[message=Hello, World!]2026-03-20T18:03:04.704+03:00  INFO 16539 --- [consumer-service] [r#0-retry-0-C-1] [69bd61a67d70e718ad939eda62b5ba02-37ea00b17e36fb56] o.apache.cxf.services.AnyPort.REQ_OUT    : REQ_OUT    Address: http:\/\/localhost:8084\/ws    HttpMethod: POST    Content-Type: text\/xml    ExchangeId: 0d943c99-2f23-457f-b102-8380c0ac6fab    ServiceName: AnyPortService    PortName: AnyPortPort    PortTypeName: AnyPort    Headers: {SOAPAction=\"\", Accept=*\/*, traceparent=00-69bd61a67d70e718ad939eda62b5ba02-fd2a270c73531479-01}    Payload: &lt;soap:Envelope xmlns:soap=\"http:\/\/schemas.xmlsoap.org\/soap\/envelope\/\"&gt;&lt;soap:Body&gt;&lt;getAnyRequest xmlns=\"http:\/\/alfastrah.ru\/api\/ws\"&gt;&lt;message&gt;Hello, World!&lt;\/message&gt;&lt;\/getAnyRequest&gt;&lt;\/soap:Body&gt;&lt;\/soap:Envelope&gt;2026-03-20T18:03:04.832+03:00  INFO 16539 --- [consumer-service] [r#0-retry-0-C-1] [69bd61a67d70e718ad939eda62b5ba02-37ea00b17e36fb56] o.apache.cxf.services.AnyPort.RESP_IN    : RESP_IN    Address: http:\/\/localhost:8084\/ws    Content-Type: text\/xml;charset=utf-8    ResponseCode: 200    ExchangeId: 0d943c99-2f23-457f-b102-8380c0ac6fab    ServiceName: AnyPortService    PortName: AnyPortPort    PortTypeName: AnyPort    Headers: {date=Fri, 20 Mar 2026 15:03:04 GMT, SOAPAction=\"\", Accept=text\/xml, text\/html, image\/gif, image\/jpeg, *; q=.2, *\/*; q=.2, content-type=text\/xml;charset=utf-8, Content-Length=256}    Payload: &lt;SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http:\/\/schemas.xmlsoap.org\/soap\/envelope\/\"&gt;&lt;SOAP-ENV:Header\/&gt;&lt;SOAP-ENV:Body&gt;&lt;ns2:getAnyResponse xmlns:ns2=\"http:\/\/alfastrah.ru\/api\/ws\"&gt;&lt;ns2:result&gt;true&lt;\/ns2:result&gt;&lt;\/ns2:getAnyResponse&gt;&lt;\/SOAP-ENV:Body&gt;&lt;\/SOAP-ENV:Envelope&gt;2026-03-20T18:03:04.805+03:00  INFO 16568 --- [soap-service] [nio-8084-exec-6] [69bd61a67d70e718ad939eda62b5ba02-950931dbcb208d37] r.alfastrah.api.SoapServiceApplication   : Handling message: Hello, World!<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0442\u0440\u0435\u0439\u0441 <code>69bd61a67d70e718ad939eda62b5ba02<\/code> \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432 Zipkin. \u0415\u0441\u043b\u0438 \u043e\u043d \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442 \u043d\u0430 localhost, \u0442\u043e \u043f\u0440\u044f\u043c\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043d\u0435\u0433\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a <a href=\"http:\/\/localhost:9411\/zipkin\/traces\/69bd61a67d70e718ad939eda62b5ba02\">http:\/\/localhost:9411\/zipkin\/traces\/69bd61a67d70e718ad939eda62b5ba02<\/a>.<\/p>\n<h3>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 span\u2019\u043e\u0432<\/h3>\n<p>\u0422\u0430\u0431\u043b\u0438\u0446\u0443 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u043d\u0430\u0436\u0430\u0432 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u201cSpan table\u201d \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u0442\u0440\u0435\u0439\u0441\u0430. \u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0438\u043c\u0435\u043d\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0432\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e. \u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0441\u0435 \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/i.imgur.com\/k4WEKjE.png\" alt=\"span table\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/i.imgur.com\/k4WEKjE.png 780w,&#10;       https:\/\/i.imgur.com\/k4WEKjE.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>span table<\/figcaption><\/div>\n<\/figure>\n<h3>\u0422\u0430\u0439\u043c\u043b\u0430\u0439\u043d<\/h3>\n<p>\u041d\u0430 \u0442\u0430\u0439\u043c\u043b\u0430\u0439\u043d\u0435 \u0432\u0438\u0434\u043d\u044b \u0440\u0430\u0437\u0440\u044b\u0432\u044b. \u041e\u043d\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0448\u043b\u043e \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u0435\u0440\u0432\u0438\u0441 \u0443\u0432\u0438\u0434\u0435\u043b, \u0447\u0442\u043e \u0432 \u0442\u043e\u043f\u0438\u043a\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438 \u043d\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 (retry).<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/imgur.com\/dhCbOPz.png\" alt=\"timeline\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/imgur.com\/dhCbOPz.png 780w,&#10;       https:\/\/imgur.com\/dhCbOPz.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>timeline<\/figcaption><\/div>\n<\/figure>\n<h3>\u0414\u0435\u0440\u0435\u0432\u043e span\u2019\u043e\u0432<\/h3>\n<p>\u0414\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438. <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/imgur.com\/SySgeC4.png\" alt=\"span tree\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/imgur.com\/SySgeC4.png 780w,&#10;       https:\/\/imgur.com\/SySgeC4.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>span tree<\/figcaption><\/div>\n<\/figure>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041f\u0443\u0442\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u043a\u0430\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 <a href=\"https:\/\/habr.com\/ru\/companies\/alfastrah\/articles\/770566\">\u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438<\/a>, \u043c\u044b \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u043b\u0438 \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0439 \u0446\u0435\u043b\u0438: \u0442\u0435\u043f\u0435\u0440\u044c \u0442\u0440\u0435\u0439\u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0441\u044e \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u0432 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/p>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0412\u0430\u043c \u0431\u044b\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e.<\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u0442\u0430\u0440\u0442\u0435\u0440\u0430 \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/github.com\/AlfaInsurance\/Zipkin_Spring_Starter\">\u043d\u0430\u0439\u0442\u0438 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<h3>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u0438<\/h3>\n<p>\u0411\u043e\u043b\u044c\u0448\u043e\u0435 \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u043c\u043e\u0435\u043c\u0443 \u0434\u043e\u0431\u0440\u043e\u043c\u0443 \u0434\u0440\u0443\u0433\u0443 \u0438 \u043a\u043e\u043b\u043b\u0435\u0433\u0435 \u0410\u043d\u0434\u0440\u0435\u044e \u0437\u0430 \u0432\u043a\u043b\u0430\u0434 \u0432 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0412\u043c\u0435\u0441\u0442\u0435 \u043c\u044b \u0434\u043e\u0432\u0435\u043b\u0438 \u0435\u0435 \u0434\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0430 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435, \u043d\u043e \u0438 \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c \u0438\u0437 \u0441\u043c\u0435\u0436\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1025614\/\">https:\/\/habr.com\/ru\/articles\/1025614\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0422\u0440\u0435\u0439\u0441\u044b \u0432 Spring Boot 3 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Zipkin \u0438 Kafka \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0430. \u0427\u0430\u0441\u0442\u044c 2\u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0430\u0432\u0442\u043e\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0442\u0440\u0435\u0439\u0441\u044b \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u043d\u0430 \u0431\u0430\u0437\u0435 Spring Boot. \u041a\u0430\u043a \u0440\u0430\u043d\u0435\u0435 \u0431\u044b\u043b\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043e, \u043e\u043d\u0430 \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u043e\u0435\u0434\u0438\u043d\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0438\u0437 \u0442\u0440\u0435\u0439\u0441\u043e\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441\u0442\u0430\u0440\u0442\u0435\u0440, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u044d\u0442\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c.\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0435\u0441\u044f \u043a \u0440\u0435\u0448\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b\u0421 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438, \u0432 \u0441\u0442\u0430\u0440\u0442\u0435\u0440 \u0431\u044b\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f: \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 custom.tracing.sasl-mechanism \u0438 custom.tracing.security-protocol, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u0430. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430\u043c\u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432 kafka.\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043c\u044b \u0441\u0442\u0430\u043b\u0438 \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u0438\u043f \u0442\u0440\u0435\u0439\u0441\u043e\u0432, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 management.tracing.propagation.type \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c w3c. \u042d\u0442\u043e \u0440\u0435\u0448\u0438\u043b\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0442\u0440\u0435\u0439\u0441\u043e\u0432, \u0447\u0442\u043e \u0440\u0430\u043d\u0435\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b\u043e \u043a \u0440\u0430\u0437\u0440\u044b\u0432\u0430\u043c \u0432 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0435.\u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0432 application.yaml \u0441\u0442\u0430\u043b\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:custom:  tracing:    bootstrap-servers: broker-1:9092, broker-2:9092, broker-3:9092    username: ${USERNAME}    password: ${PASSWORD}    sasl-mechanism: SCRAM-SHA-256    security-protocol: SASL_SSL    topic: trace-topicmanagement:  tracing:    enabled: true    propagation:      type: w3c    sampling:      probability: 1\u041a\u0430\u043a \u043c\u044b \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u043c\u0441\u044f\u0414\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438 \u0432 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 bean\u2019\u0430\u0445, \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u044b:Spring Cloud Openfeign: \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u043f\u0440\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 REST-\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f\u0445;Spring Kafka \u043f\u0440\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 Kafka;Apache CXF: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f SOAP-\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0439 (\u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0433\u0430\u0439\u0434 Baeldung: A Guide to Apache CXF with Spring);Spring Cloud Gateway: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438;\u0424\u043e\u0440\u043c\u0430\u0442 \u0442\u0440\u0435\u0439\u0441\u043e\u0432\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442 w3c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0443 W3C Trace Context.\u041a\u043e\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f W3C Trace Context, \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438:traceparent: \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 ID \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u0438 ID \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438;tracestate: \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0447\u0435\u0440\u0435\u0437 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0438\u0441\u0442\u0435\u043c (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439).Traceparent\u042d\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u0441\u0435\u0442 \u0432 \u0441\u0435\u0431\u0435:\u0412\u0435\u0440\u0441\u0438\u044e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430;Trace ID (\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438);Parent ID (\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e span);Flags (\u0444\u043b\u0430\u0433\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u043e\u0439).\u0424\u043e\u0440\u043c\u0430\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 traceparent:{version}-{trace-id}-{parent-id}-{trace-flags}\u0417\u0434\u0435\u0441\u044c:00 \u2014 \u0412\u0435\u0440\u0441\u0438\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u0430 traceparent (\u0441\u0435\u0439\u0447\u0430\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f: 00 (\u0432\u0435\u0440\u0441\u0438\u044f 0));69bd60bfbe6c8f2ebc4fd6787aa0a747 \u2014 Trace ID (\u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0434\u043d\u043e\u0439 \u0442\u0440\u0430\u0441\u0441\u044b (end-to-end \u0437\u0430\u043f\u0440\u043e\u0441));bc4fd6787aa0a747 \u2014 Parent ID (\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e span \u0432 \u0442\u0440\u0430\u0441\u0441\u0435). \u0412 \u043d\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u043d\u043e\u0432\u044b\u0439 span \u0441 \u043d\u043e\u0432\u044b\u043c parent-id, \u043d\u043e \u0441\u0442\u0430\u0440\u044b\u043c trace-id;01 \u2014 \u0424\u043b\u0430\u0433\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u043e\u0439. \u0412 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 sampled-flag \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0438\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Probability sampling, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c management.tracing.sampling.probability \u0432 application.yaml: 01: \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438;00: \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043d\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0444\u043b\u0430\u0433 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u0430\u043b\u0435\u0435.\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 traceparent.Tracestate\u042d\u0442\u043e\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432\u0435\u043d\u0434\u043e\u0440-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 traceparent. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 tracestate.\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0432\u0441\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0431\u044b\u043b\u0438 \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u044b \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0430\u0440\u0442\u0435\u0440, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f (\u043a\u0440\u043e\u043c\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0441\u0438\u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0442\u0430\u0440\u0442\u0435\u0440\u0430).\u0417\u0434\u0435\u0441\u044c \u0438 \u0434\u0430\u043b\u0435\u0435 \u0432\u0441\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u0441\u0442\u0430\u0440\u0442\u0435\u0440\u0430, \u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u0442\u0435 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0432 \u043d\u0435\u0433\u043e.OpenFeign\u0414\u043b\u044f feign-\u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 micrometer. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u0442.\u0447. \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 (\u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439). \u041c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 bean \u0442\u0438\u043f\u0430 MicrometerObservationCapability. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 Spring Cloud OpenFeign.\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f:import feign.micrometer.MicrometerObservationCapability;import io.micrometer.observation.ObservationRegistry;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configuration(proxyBeanMethods = false)public class FeignObservedConfiguration {    @Bean    public MicrometerObservationCapability micrometerObservationCapability(            ObservationRegistry registry    ) {        return new MicrometerObservationCapability(registry);    }}\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438\u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 feign.micrometer.MicrometerObservationCapability \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c:&lt;dependency&gt;    &lt;groupId&gt;io.github.openfeign&lt;\/groupId&gt;    &lt;artifactId&gt;feign-micrometer&lt;\/artifactId&gt;    &lt;version&gt;13.5&lt;\/version&gt;&lt;\/dependency&gt;\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u041b\u044e\u0431\u043e\u0439 \u0432\u044b\u0437\u043e\u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 (\u043f\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0438 \u043a \u043d\u0430\u0448\u0435\u043c\u0443) \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c HTTP-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 traceparent.Kafka\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c traceparent \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u0445 kafka \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c observation \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432:\u0434\u043b\u044f listener, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439;\u0434\u043b\u044f template, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u043e \u0447\u0435\u0440\u0435\u0437 configuration properties, \u0432\u043e\u0442 \u0442\u0430\u043a:spring:  kafka:    listener:      observation-enabled: true    template:      observation-enabled: true\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c BeanPostProcessor, \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:import lombok.extern.slf4j.Slf4j;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;import org.springframework.kafka.core.KafkaTemplate;import org.springframework.lang.NonNull;@Slf4jpublic class KafkaObservationEnablerPostProcessor implements BeanPostProcessor {    @Override    public Object postProcessAfterInitialization(            @NonNull Object bean,            @NonNull String beanName    ) throws BeansException {        if (bean instanceof ConcurrentKafkaListenerContainerFactory&lt;?, ?&gt; factory) {            factory.getContainerProperties().setObservationEnabled(true);            log.debug(&#171;Observation enabled in consumer [beanName: {}, class: {}]&#187;, beanName, bean.getClass());        } else if (bean instanceof KafkaTemplate&lt;?, ?&gt; kafkaTemplate) {            kafkaTemplate.setObservationEnabled(true);            log.debug(&#171;Observation enabled in producer [beanName: {}, class: {}]&#187;, beanName, bean.getClass());        }        return bean;    }}\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u043e \u0432\u0441\u0435\u043c listener\u2019\u0430\u043c \u0438 template\u2019\u0430\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430.\u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434 \u043e\u043f\u0438\u0441\u0430\u043d \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 Baeldung: Micrometer Observation and Spring Kafka.\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 kafka, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a traceparent. \u041f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0442\u0440\u0435\u0439\u0441\u0430 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a \u043d\u0435\u043c\u0443.SOAP-\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438\u041f\u0440\u043e\u043a\u0441\u0438 \u0434\u043b\u044f SOAP-\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0439 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e JaxWsProxyFactoryBean. \u0415\u0441\u043b\u0438 \u043d\u0435 \u0443\u0433\u043b\u0443\u0431\u043b\u044f\u0442\u044c\u0441\u044f \u0432 \u0434\u0435\u0442\u0430\u043b\u0438, \u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import ru.alfastrah.api.tracing.observability.soap.ws.KnownSoapClient;@Configurationclass TestSoapClientsConfiguration {    public static final String TEST_URL = &#171;test-url&#187;;    @Bean    public KnownSoapClient knownSoapClient() {        JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();        jaxWsProxyFactoryBean.setAddress(TEST_URL);        return jaxWsProxyFactoryBean.create(KnownSoapClient.class);    }}\u0414\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f HTTP-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 traceparent \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e AbstractOutDatabindingInterceptor, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 factory JaxWsProxyFactoryBean.\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 interceptor \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:import io.micrometer.tracing.TraceContext;import io.micrometer.tracing.Tracer;import org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor;import org.apache.cxf.interceptor.Fault;import org.apache.cxf.message.Message;import org.apache.cxf.phase.Phase;import ru.alfastrah.api.tracing.util.Constants;import java.util.List;import java.util.Map;import java.util.TreeMap;import static java.util.Objects.isNull;import static java.util.Objects.nonNull;public class SoapTraceParentOutDatabindingInterceptor extends AbstractOutDatabindingInterceptor {    private final Tracer tracer;    public SoapTraceParentOutDatabindingInterceptor(            Tracer tracer    ) {        super(Phase.PREPARE_SEND);        this.tracer = tracer;    }    private static Map&lt;String, List&lt;String&gt;&gt; fetchHeaders(Message message) {        Map&lt;String, List&lt;String&gt;&gt; headers = (Map&lt;String, List&lt;String&gt;&gt;) message.get(Message.PROTOCOL_HEADERS);        if (isNull(headers)) {            headers = new TreeMap&lt;&gt;();        }        return headers;    }    @Override    public void handleMessage(Message message) throws Fault {        final TraceContext traceContext = tracer.currentTraceContext().context();        if (nonNull(traceContext)) {            final Map&lt;String, List&lt;String&gt;&gt; headers = fetchHeaders(message);            headers.put(                    Constants.HttpHeaders.TRACE_PARENT,                    Constants.Helpers.TO_TRACE_PARENT.apply(traceContext)            );            message.put(Message.PROTOCOL_HEADERS, headers);        }    }}\u0417\u0434\u0435\u0441\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438\u0437 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 io.micrometer.tracing.Tracer, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u043a \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044e.\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 Constants.Helpers.TO_TRACE_PARENT \u0442\u0438\u043f\u0430 Function&lt;TraceContext, List&lt;String&gt;&gt;:public static final Function&lt;TraceContext, List&lt;String&gt;&gt; TO_TRACE_PARENT = traceContext -&gt; List.of(&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-476663","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/476663","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=476663"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/476663\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=476663"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=476663"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=476663"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}