我在微服务之间使用 Kafka 进行异步调用,我正在使用 Spring Sleuth 进行日志记录。日志没问题,但是当有消息从微服务1到微服务2时,日志的消息有不同的Trace-ID。他们不是必须具有相同的 trace-Id 但具有不同的 SpanId 吗?有什么特别的配置吗?
Spring Cloud sleuth 如何在幕后工作?它还能跟踪库调用吗?。我有一个使用库 B 的 Spring Boot 项目 A。对项目 A 中端点的任何命中都由侦探跟踪,但是当我尝试命中库 B 上的休息控制器时,侦探无法跟踪请求。有没有办法告诉侦探跟踪库调用?
我已经尝试解决这个问题一周了,但一点运气都没有。问题出在单元测试上。
这是我要测试的课程:
import brave.Span;
import brave.Tracer;
@Service
public class InternetBackEndRestClient {
@Autowired
private Tracer tracer;
public PasswordJwtResponse generatePassworJwt(PasswordJwtRequest passwordJwtRequest, String traceId) throws LogonProxyException {
log.info("{\"Starting method\": \"generatePassworJwt\", \"input\": {} }", passwordJwtRequest);
Span newSpan = tracer.nextSpan().name("spanPasswordJwtResponse");
...
}
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能进行单元测试?Brave.Tracer 是最后一堂课,因此我无法嘲笑它。无论如何要设置上下文吗?或模拟追踪器?
@RunWith(MockitoJUnitRunner.class)
public class InternetBackEndRestClientTest {
@InjectMocks
private InternetBackEndRestClient internetBackEndRestClient;
@Mock
private Tracer tracer;
@Test
public void generatePassworJwt_test() {
internetBackEndRestClient.generatePassworJwt(...);
....
}
}
Run Code Online (Sandbox Code Playgroud)
有人可以帮我吗?
我已将 Spring boot 依赖项从2.1to2.4.5和 spring cloud升级到2020.0.2. 升级后,我的 MDC 上下文未填充。
关于这里应该做什么有什么想法吗?
默认情况下,Spring Sleuth 只向 Zipkin 发送 10% 的请求。通过设置,spring.sleuth.sampler.percentage您可以增加百分比。不幸的是,无论我将其设置为什么值,它都停留在 10%。我试过 1.0、0.5、1、100。
输出来自 /env
"spring.sleuth.sampler.percentage": {
"value": 1,
"origin": "class path resource [application.yml]:77:19"
}
Run Code Online (Sandbox Code Playgroud)
不管价值如何,当我提出多个请求时,只有 10% 的请求到达 Zipkin。
我们使用的是 Spring Cloud 的 Finchley.M8 版本和 Spring Boot 的 2.0.0.RELEASE 版本。
下面是相关的 POM 设置。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.M8</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
这可能是一个错误吗?
我们目前使用的是 sleuth 2.2.3.RELEASE,我们看不到 http 标头中传递的 userId 字段没有传播。下面是我们的代码。
BaggageField REQUEST_ID = BaggageField.create("x-vcap-request-id");
BaggageField USER_ID = BaggageField.create("userId");
Tracing.newBuilder().propagationFactory(
BaggagePropagation.newFactoryBuilder(B3Propagation.FACTORY)
.add(SingleBaggageField.remote(REQUEST_ID))
.add(SingleBaggageField.newBuilder(USER_ID).addKeyName("baggage-user-id").build())
.build());
Run Code Online (Sandbox Code Playgroud)
我们怀疑 YML 文件中存在某些问题。我们尝试了以下所有选项,但没有一个有效。
#1 baggage-keys: baggage-user-id
#2 propagation-keys: baggage-user-id
#3 baggage-keys: user-id
Run Code Online (Sandbox Code Playgroud)
在日志中:
%X{行李用户 ID:-}
我们在 http 标头中传递 userId。
我已经开始学习 Sleuth,但我陷入了日志配置。
\n我有这个配置:
\n <?xml version="1.0" encoding="UTF-8"?>\n<configuration>\n <include resource="org/springframework/boot/logging/logback/defaults.xml"/>\n \xe2\x80\x8b\n <springProperty scope="context" name="springAppName" source="spring.application.name"/>\n <!-- Example for logging into the build folder of your project -->\n <property name="LOG_FILE" value="C://tmp//test"/>\xe2\x80\x8b\n\n <property name="CONSOLE_LOG_PATTERN"\n value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr([${springAppName:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}]){yellow} %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>\n\n <!-- Appender to log to console -->\n <appender name="console" class="ch.qos.logback.core.ConsoleAppender">\n <filter class="ch.qos.logback.classic.filter.ThresholdFilter">\n <level>INFO</level>\n </filter>\n <encoder>\n <pattern>${CONSOLE_LOG_PATTERN}</pattern>\n <charset>utf8</charset>\n </encoder>\n </appender>\n \xe2\x80\x8b\n <!-- Appender to log to file in a JSON format -->\n <appender name="logstash" class="ch.qos.logback.core.rolling.RollingFileAppender">\n <file>${LOG_FILE}.json</file>\n <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">\n …Run Code Online (Sandbox Code Playgroud) 我有基于 Spring Boot 的 Web 应用程序,它使用 logback 进行日志记录。
我还使用以下命令从 Spring Boot 继承了一些 logback 默认值:
<include resource="org/springframework/boot/logging/logback/base.xml"/>
Run Code Online (Sandbox Code Playgroud)
我想开始记录跟踪信息,所以我补充道:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
Sleuth 将跟踪信息添加到日志行,但我找不到任何%X或%mdc模式:https : //github.com/spring-projects/spring-boot/blob/2.3.x/spring-boot-project/spring-boot /src/main/resources/org/springframework/boot/logging/logback/defaults.xml
Sleuth 如何将跟踪信息添加到日志行中?
我使用spring-cloud-starter-parent Hoxton.SR9父母带来Spring Boot 2.3.5.RELEASE和spring-cloud-starter-sleuth 2.2.6.RELEASE
我正在将 Sleuth 与CompletableFuture.handle. 例子:
log.info("first");
apnsClient.sendNotification(...).handle((response, cause) -> {
log.info("second");
});
Run Code Online (Sandbox Code Playgroud)
我希望second日志具有与first日志相同的跟踪 ID。然而,事实并非如此。因此我想知道该怎么办?谢谢!
PS 我无法控制如何apnsClient.sendNotification管理线程(因为它来自Pushy),因此无法使用LazyTraceExecutor之类的东西。
java spring spring-cloud completable-future spring-cloud-sleuth
我们将 Jaeger 设置为主要跟踪 istio 代理之间的调用。我尝试在应用程序内部使用跟踪,在日志中包含任何traceId/spanId,并向 Jaeger 收集器报告应用程序中创建的任何跨度。
我们的大多数微服务仍然运行 Spring Boot 2。有些已经升级到 Spring Boot 3。
我已经让它在 Spring Boot2 中工作得令人满意。
我包含以下依赖项:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
<dependency>
<groupId>io.opentracing.brave</groupId>
<artifactId>brave-opentracing</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
并在application.yaml中设置以下内容
spring:
application:
name: our-service
sleuth:
propagation:
type: B3,W3C
opentracing:
enabled: true
zipkin:
base-url: <url to our jaeger collector>:9411
Run Code Online (Sandbox Code Playgroud)
对于我们的 Spring Boot 3 应用程序,我添加了以下依赖项,而不是上面的依赖项:
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.reporter2</groupId>
<artifactId>zipkin-reporter-brave</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
并在 application.yaml 中添加与上面相同的配置,但还添加了:
logging:
pattern:
level: "%5p [${spring.application.name},%X{traceId:-},%X{spanId:-}]"
Run Code Online (Sandbox Code Playgroud)
当我在测试环境中运行两个应用程序时,我可以看到两个应用程序的日志中都显示了traceId,并且我也可以在 jaeger UI 中找到这些traceId,包括在 SpringBoot 2 应用程序中创建的跨度。除了应该来自 SpringBoot 3 …
zipkin spring-boot spring-cloud-sleuth jaeger micrometer-tracing
spring-boot ×7
spring-cloud ×5
spring ×3
java ×2
zipkin ×2
jaeger ×1
logback ×1
logging ×1
mockito ×1