9.3.8 添加自定义跨度

 
    在Zipkin中添加自定义跨度是非常容易的。我们可以从向许可证服务添加一个自定义跨度开始,这样就可以跟踪从Redis中提取数据所需的时间。然后,我们将向组织服务添加自定义跨度,以查看从组织数据库中检索数据需要多长时间。
    为了将一个自定义跨度添加到许可证服务对Redis的调用中,我们需要修改licensing- service/src/main/java/com/thoughtmechanix/licenses/clients/OrganizationRestTemplateClient.java中的OrganizationRestTemplateClient类的checkRedisCache()方法。代码清单9-6展示了这段代码。
   
代码清单9-6 对从Redis读取许可证数据的调用添加监测代码
import org.springframework.cloud.sleuth.Tracer;
// 为了简洁,省略了其余的import语句
@Component
public class OrganizationRestTemplateClient {
    @Autowired
    RestTemplate restTemplate;
    ⇽--- Tracer类用于以编程方式访问Spring Cloud Sleuth跟踪信息
    @Autowired
    Tracer tracer;
 
    @Autowired
    OrganizationRedisRepository orgRedisRepo;
 
    private static final Logger logger = LoggerFactory.getLogger(OrganizationRestTemplateClient.class);
 
    private Organization checkRedisCache(String organizationId) {
        ⇽--- 创建一个新的自定义跨度,其名为readLicensingDataFromRedis  
       Span newSpan = tracer.createSpan("readLicensingDataFromRedis");
        try {
            return orgRedisRepo.findOrganization(organizationId);
        } catch (Exception ex){
            logger.error("Error encountered while trying to retrieve organization {} check Redis Cache.  Exception {}", organizationId, ex);
            return null;
        }
        finally {    ⇽--- 使用Finally块关闭跨度
         ⇽--- 可以将标签信息添加到跨度中。在这个类中,我们提供了将要被Zipkin捕获的服务的名称
          newSpan.tag("peer.service", "redis");
          ⇽--- 记录一个事件,告诉Spring Cloud Sleuth它应该捕获调用完成的时间
          newSpan.logEvent(org.springframework.cloud.sleuth.Span.CLIENT_RECV);
           ⇽--- 关闭跟踪。如果不调用close()方法,则会在日志中得到错误消息,指示跨度已被打开却尚未被关闭
          tracer.close(newSpan);
        }
    }
// 为了简洁,省略了类的其余部分
}
 
    
代码清单9-6中的代码创建了一个名为readLicensingDataFromRedis的自定义跨度。接下来,我们将同样添加一个名为getOrgDbCall的自定义跨度到组织服务中,以监控从Postgres数据库中检索组织数据需要多长时间。对组织服务数据库的调用跟踪可以在organization-service/src/main/java/com/thoughtmechanix/organization/ services/OrganizationService.java中的OrganizationService类中看到。其中,getOrg()方法包含自定义跟踪。代码清单9-7展示了组织服务的getOrg()方法的源代码。
    
代码清单9-7 添加了监测代码的getOrg()方法
@Service
public class OrganizationService {
    @Autowired
    private OrganizationRepository orgRepository;
 
    @Autowired
    private Tracer tracer;
 
    @Autowired
    SimpleSourceBean simpleSourceBean;
 
    private static final Logger logger = LoggerFactory.getLogger(OrganizationService.class);
 
    public Organization getOrg(String organizationId) {
        Span newSpan = tracer.createSpan("getOrgDBCall");
 
        logger.debug("In the organizationService.getOrg() call");
        try {
            return orgRepository.findById(organizationId);
        }
        finally{
          newSpan.tag("peer.service", "postgres");
          newSpan.logEvent(org.springframework.cloud.sleuth.Span.CLIENT_RECV);
          tracer.close(newSpan);
        }
    }
    }
 
有了这两个自定义跨度,我们就可以重启服务,然后访问GET http://localhost:5555/api/licensing/v1/organizations/e254f8c-c442-4ebe-a82a-e2fc1d1ff78a/licenses/f3831f8c-c338-4ebe-a82a-e2fc1d1ff78a端点。如果在Zipkin中查看事务,应该看到增加了两个额外的跨度。图9-19展示了在调用许可证服务端点来检索许可证信息时添加的额外的自定义跨度。
 
图9-19 定义了自定义跨度之后,它们将出现在事务跟踪中
    
从图9-19中,我们可以看到与Redis和数据库查询相关的附加跟踪和计时信息。由图9-19可知,对Redis的调用用了1.099 ms。由于调用没有在Redis缓存中找到记录,所以对Postgres数据库的SQL调用用了4.784 ms。
 
9.4 小结
    Spring Cloud Sleuth可以无缝地将跟踪信息(关联ID)添加到微服务调用中。
    关联ID可用于在多个服务之间链接日志条目。可以使用关联ID查看在单个事务中涉及的所有服务的事务行为。
虽然关联ID功能强大,但需要将此概念与日志聚合平台结合使用,以便从多个来源获取日志,然后搜索和查询它们的内容。
    虽然存在多个内部部署的日志聚合平台,但基于云的服务可以让开发人员在不必拥有大量基础设施的情况下,对日志进行管理。此外,它们还可以在应用程序日志记录量增长时轻松扩大。
    可以将Docker容器与日志聚合平台集成,来捕获正在写入容器stdout/stderr的所有日志记录数据。在本章中,我们将Docker容器、Logspout以及在线云日志记录供应商Papertrail集成,以捕获和查询日志。
    虽然统一的日志记录平台很重要,但通过微服务来可视化地跟踪事务的能力也是一个有价值的工具。
    Zipkin可以让开发人员在对服务进行调用时查看服务之间存在的依赖关系。
    Spring Cloud Sleuth与Zipkin集成,Zipkin可以让开发人员以图形方式查看事务流程,并了解用户事务中涉及的每个微服务的性能特征。
    在启用Spring Cloud Sleuth的服务中,Spring Cloud Sleuth将自动捕获HTTP 调用以及入站和出站消息通道的跟踪数据。
    Spring Cloud Sleuth将每个服务调用映射到一个跨度的概念。可以使用Zipkin来查看一个跨度的性能。
    Spring Cloud Sleuth和Zipkin还允许开发人员自定义跨度,以便了解基于非Spring的资源(如Postgres或Redis等数据库服务器)的性能。
 
 
   
posted @ 2019-12-03 10:58  mongotea  阅读(138)  评论(0编辑  收藏  举报