调用链

最近更新时间:2020-08-06 15:14:52

操作场景
KMSE 微服务管理平台提供调用链查询功能,主要包括链路追踪、动态拓扑两部分。

链路追踪用来查询和定位具体某一次调用的情况,提供了 Spring Cloud 全链路跟踪功能,包括服务监控、mysql、redis、mongo、kafka、rabbitmq。使用者可以通过具体的服务、接口定位、IP 等查询具体的调用过程,包括调用过程所需要的时间和运行情况。还可以根据 TraceID 查询调用链的详细信息。调用链详情是为了定位在分布式链路调用过程中每个环节的耗时、日志和异常。

动态拓扑包含了查询服务之间相互依赖调用的拓扑关系,查询特定集群特定命名空间下服务之间调用的统计结果等功能。

前提条件
向工程中添加依赖,在 pom.xml 中添加以下依赖:

<dependency>
  <groupId>com.ksyun.kmse</groupId>
  <artifactId>spring-cloud-kmse-starter-jaeger</artifactId>
  <version>${version}</version>
</dependency>

bootstrap.yaml 中添加链路相关配置(本地开发自测配置,线上无需配置):

opentracing:
  jaeger:
    log-spans: true
    # 是否开启 Zipkin 兼容模式
    enable-b3-propagation: true
    # 概率采样
    # probabilistic-sampler:
    #    sampling-rate: 0.1
    #常量采样
    const-sampler:
      decision: true
    # trace 上报接口
    http-sender:
      url: http://0.0.0.0:14268/api/traces
    # 启用 trace
    enabled: true
    # trace 上报服务的版本
    tags.svc-version: v4

调用链查询

  1. 登录微服务管理平台,在左侧导航栏中选择【调用链-链路追踪】,切换至【调用链查询】标签页。
  2. 在调用链查询中,设置查询条件,单击【查询】。
    • 时间范围:支持特定和自定义时间范围选择。特定时间范围包括:5分钟前、10分钟前和30分钟前。
    • 服务:单击下拉框,在下拉框中选择服务。
    • 服务版本:单击下拉框,在下拉框中选择服务版本。

调用链

  1. 根据查询结果,可以单击【Trace ID】进入具体慢业务或出错业务,查看调用链详情。

调用链

  1. 点击时间轴可查看 Span 详情,包括基本信息、标签、日志。

调用链

调用链

动态拓扑图查询

  1. 登录微服务管理平台,在左侧导航栏中选择【调用链-动态拓扑】。
  2. 在页面顶部数据中心位置,选择需要查看的服务所属命名空间。
  3. 下方按钮选择需要依赖拓扑的时间,近30分钟、近10分钟、近5分钟以及选择特定时间段(特定时间段的时间跨度最长为3天)。
  4. 选择之后将在下方空白处出现对应的服务依赖调用关系。

调用链

查询依赖详情
鼠标放置到图上特定位置可以显示调用依赖详情。

调用链

单击服务圈内(白色底),可以展示被调用次数,单击弹出框上的“查看调用链”可以进入到调用链查询界面。

调用链

附:微服务对下游组件访问的链路支持
微服务对 JDBC、 Redis、Memcached、MongoDB、消息队列 RabbitMQ、Kafka 等的访问操作会产生跟踪日志, KMSE 会对该日志进行采集、分析、统计,这些组件的调用会展现在 KMSE 平台的链路追踪中。

JDBC 链路使用说明
支持各种实现 JDBC 规范的 MySQL / SQL Server / Oracle 等关系型数据库驱动器和各类连接池(如 Tomcat-JDBC、DBCP、Hikari、Druid),在使用时需引入 SpringBoot 相关依赖和 相关的 db 驱动依赖即可,如:

<!-- JPA -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- mysql -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

引入依赖后,根据需要添加相关数据库连接池依赖或直接使用 SpringBoot 默认选项。
配置启用 JDBC tracing:

调用链

Redis 链路使用说明
考虑到 Redis 库的多样性,以及 spring-data-redis 库的易用性,目前只对spring-boot-starter-data-redis进行支持,在引用 spring-boot-starter-data-redis 时不要指定版本,只需要整个工程依赖 parent pom 即可:

<!-- Redis -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
 </dependency>

spring-boot-starter-data-redis的版本为 parent pom 文件管理的 Redis Starter 的版本。在代码中具体使用时,引入 RedisTemplate,然后使用其方法即可。不建议直接引用 Jedis 和 Lettuce 相关的依赖,spring-boot-starter-data-redis 会自动引用相关的依赖,并做适配。
配置启用 Redis tracing:

opentracing.spring.cloud.redis.enabled=true

如果通过其他方式引入 Redis 客户端(例如直接 new Jedis),则将无法在 KMSE 的链路中查看到相应的信息。

调用链

Memcached 链路使用说明
考虑到 Spring Data 暂未提供 Memcached 操作依赖库,我们可以使用 spymemcached 第三方依赖,示例如下:

<!-- Memcached -->
<dependency>
    <groupId>net.spy</groupId>
    <artifactId>spymemcached</artifactId>
    <version>2.12.2</version>
</dependency>

我们需要创建一个 Tracing 增强的 Memcached Client:

MemcachedClient memcachedClient = new TracingMemcachedClient(tracer, false,
                new InetSocketAddress("10.69.70.68", 9011));
memcachedClient.set("testkey", 1000, "888888");

此处的 tracer 需要我们将 io.opentracing.Tracer 实例化后进行依赖注入,如:

@ConditionalOnProperty(value = "opentracing.jaeger.enabled", havingValue = "true", matchIfMissing = true)
@Configuration
public class MyTracerConfiguration {

    @Bean
    public io.opentracing.Tracer jaegerTracer() {
        io.jaegertracing.Configuration config = new io.jaegertracing.Configuration("jaeger-mem");
        io.jaegertracing.Configuration.SenderConfiguration sender = new io.jaegertracing.Configuration.SenderConfiguration();
        sender.withEndpoint("http://jaeger-collector.kmse-system:14268/api/traces");
        config.withSampler(new io.jaegertracing.Configuration.SamplerConfiguration().withType("const").withParam(1));
        config.withReporter(new io.jaegertracing.Configuration.ReporterConfiguration().withLogSpans(true).withSender(sender).withMaxQueueSize(10000));
        return config.getTracer();
    }
}

调用链

MongoDB 链路使用说明
考虑到 spring-data-mongodb 库的易用性,目前只对spring-boot-starter-data-mongodb进行支持,在引用 spring-boot-starter-data-mongodb 时不要指定版本,只需要整个工程依赖 parent pom 即可,示例如下:

<!-- MongoDB -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
 </dependency>

spring-boot-starter-data-mongodb的版本即是 parent pom 文件管理的 mongoldb starter 的版本。在代码中具体使用时,引入MongoTemplate,然后使用其方法即可。

配置启用 MongoDB tracing:

opentracing.spring.cloud.mongo.enabled=true

调用链

消息队列 RabbitMQ 链路使用说明
RabbitMQ 组件目前通过 Spring Cloud Stream 方式接入Spring Cloud 体系,对于 RabbitMQ 组件的全链路追踪目前基于spring-cloud-stream-rabbit扩展实现,使用时需在上下游服务中添加spring-cloud-stream-rabbit依赖并按照规范进行 RabbitMQ 配置。

<!-- Stream -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-stream</artifactId>
</dependency>
<!-- RabbitMQ -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>

配置启用 JMS tracing:

opentracing.spring.cloud.jms.enabled=true

调用链

消息队列 Kafaka 链路使用说明
Kafaka 组件目前通过 Spring Cloud Stream 方式接入Spring Cloud 体系,对于 Kafaka 组件的全链路追踪目前基于spring-cloud-stream-kafka 扩展实现,使用时需在上下游服务中添加spring-cloud-stream-rabbit依赖并按照规范进行 Kafaka 配置。

<!-- Stream -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-stream</artifactId>
</dependency>
<!-- RabbitMQ -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-kafka</artifactId>
</dependency>

配置启用 Kafaka tracing:

opentracing.spring.cloud.kafka.enabled=true

Kafka 配置参考:

spring:
  cloud:
    stream:
      kafka:
        binder:
          brokers: localhost:9092
          auto-create-topics: true
          configuration:
            auto.offset.reset: latest
      bindings:
        greetings-in:
          destination: greetings-sample
          group: greetings-in-group
          contentType: application/json
        greetings-out:
          destination: greetings-sample
          contentType: application/json

调用链

金山云,开启您的云计算之旅

免费注册