Наблюдение может помочь выявить проблемы в приложениях и отладить проблемы за счет видимости взаимодействия различных компонентов в распределенной системе.
В версии Spring Boot 2.x мы можем завершить сбор служебной информации, представив Spring Cloud Sleuth, а затем отправить информацию в zipkin и т. д.
В Spring Boot 3.x Spring Cloud Sleuth заменен микрометром.
Ниже приведен полный пример, демонстрирующий процесс подключения к микрометру.
полагаться | Версия |
---|---|
jdk | 20 |
spring-boot | 3.1.2 |
Используйте zipkin для сбора и отображения данных. После загрузки вы можете использовать jdk 1.8Версияверноjarпакет для начала
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bridge-otel</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-exporter-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
management:
endpoints:
web:
exposure:
include: '*'
logging:
pattern:
level: '%5p [${spring.application.name:},%X{traceId:-},%X{spanId:-}]'
Здесь следует отметить, Сыщик автоматически настроил формат бревно. Микрометру необходимо указать формат. Однако ключами MDC по-прежнему являются TraceId и SpaId.
@FeignClient(
contextId = "third-part-sf",
name = "third-part-sf",
url = "https://openic.sf-express.com",
configuration = SFConfig.class,
path = "/open/api/external"
)
@Observed(name = "SFDeliveryClient")
public interface SfDeliveryClient {
@PostMapping("/precreateorder")
SfResult<SfPreOrderResp> preCreateOrder(@RequestBody SfPreOrderReq preOrderReq);
}
Это несколько отличается от использования сыщика; sleuth по умолчанию собирает интерактивный процесс каждого взаимодействия (rpc, redis). микрометр необходимо добавить @Observed, чтобы добавить собранную конечную точка
В микрометрах отслеживается каждое создание и разрушение контекста.
@Slf4j
public class SimpleLoggingHandler implements ObservationHandler<Observation.Context> {
@Override
public void onStart(Observation.Context context) {
log.info("Starting context {} ", context);
}
@Override
public void onStop(Observation.Context context) {
log.info("Stopping context {} ", context);
}
@Override
public boolean supportsContext(Observation.Context context) {
return true;
}
}
----
@Configuration
public class ObservedAspectConfiguration {
@Bean
public ObservedAspect observedAspect(ObservationRegistry observationRegistry) {
observationRegistry.observationConfig().observationHandler(new SimpleLoggingHandler());
return new ObservedAspect(observationRegistry);
}
}
http://localhost:8080/actuator/metrics
Результат следующий:
{
"names": [
"SFDeliveryClient",
"SFDeliveryClient.active",
"application.ready.time",
"application.started.time",
"disk.free",
"disk.total",
"executor.active",
"executor.completed",
"executor.pool.core",
"executor.pool.max",
"executor.pool.size",
"executor.queue.remaining",
"executor.queued",
"hikaricp.connections",
"hikaricp.connections.acquire",
"hikaricp.connections.active",
"hikaricp.connections.creation",
"hikaricp.connections.idle",
"hikaricp.connections.max",
"hikaricp.connections.min",
"hikaricp.connections.pending",
"hikaricp.connections.timeout",
"hikaricp.connections.usage",
"http.server.requests",
"http.server.requests.active",
"jdbc.connections.active",
"jdbc.connections.idle",
"jdbc.connections.max",
"jdbc.connections.min",
"jvm.buffer.count",
"jvm.buffer.memory.used",
"jvm.buffer.total.capacity",
"jvm.classes.loaded",
"jvm.classes.unloaded",
"jvm.compilation.time",
"jvm.gc.live.data.size",
"jvm.gc.max.data.size",
"jvm.gc.memory.allocated",
"jvm.gc.memory.promoted",
"jvm.gc.overhead",
"jvm.gc.pause",
"jvm.info",
"jvm.memory.committed",
"jvm.memory.max",
"jvm.memory.usage.after.gc",
"jvm.memory.used",
"jvm.threads.daemon",
"jvm.threads.live",
"jvm.threads.peak",
"jvm.threads.started",
"jvm.threads.states",
"lettuce.command.completion",
"lettuce.command.firstresponse",
"logback.events",
"process.cpu.usage",
"process.start.time",
"process.uptime",
"system.cpu.count",
"system.cpu.usage",
"thirdChannelController",
"thirdChannelController.active",
"tomcat.sessions.active.current",
"tomcat.sessions.active.max",
"tomcat.sessions.alive.max",
"tomcat.sessions.created",
"tomcat.sessions.expired",
"tomcat.sessions.rejected"
]
}
http://localhost:8080/actuator/metrics/SFDeliveryClient
{
"name": "SFDeliveryClient",
"baseUnit": "seconds",
"measurements": [
{
"statistic": "COUNT",
"value": 1.0
},
{
"statistic": "TOTAL_TIME",
"value": 0.229436
},
{
"statistic": "MAX",
"value": 0.0
}
],
"availableTags": [
{
"tag": "method",
"values": [
"preCreateOrder"
]
},
{
"tag": "error",
"values": [
"none"
]
},
{
"tag": "class",
"values": [
"io.yujie.fast.delivery.thirdparty.sf.client.SfDeliveryClient"
]
}
]
}
После того, как бревно соберет лося, вы можете использовать TraceId или SpaId для поиска бревно. В качестве примера возьмем более короткий отпечаток бревно:
2023-08-02T13:53:53.127+08:00 INFO [eeaters-example,d50e2c42f3225b681bf1fef572dfbf0d,c2ad58fc187d2667] 14680 --- [nio-8080-exec-1] i.y.f.d.thirdparty.sf.client.SFConfig : знак: ZGQ4MDRhNGNiMWUzYjQ0ZjcwNjhmYTY3ZmViZmJiMGM=
Страница zipkin отображается следующим образом:
TraceEnvironmentPostProcessor
Автоматически настраиваетсяlogger.levelФормат. Микрометру необходимо вручную установить формат бревно.