然后在需要进行调用跟踪的方法上加上Traced注解:
@Component public class DBAccess { @Traced public void save2db() { try { Thread.sleep((long) (Math.random() * 100)); } catch (InterruptedException e) { e.printStackTrace(); } } } @Component public class BankTransaction { @Traced public void transfer() { try { Thread.sleep((long) (Math.random() * 100)); } catch (InterruptedException e) { e.printStackTrace(); } } }demo程序的master branch已经加入了方法级代码跟踪,可以直接部署。
git checkout master kubectl apply -f k8s/eshop.yaml效果如下图所示,可以看到trace中增加了transfer和save2db两个方法级的Span。
可以打开一个方法的Span,查看详细信息,包括Java类名和调用的方法名等,在AOP代码中还可以根据需要添加出现异常时的异常堆栈等信息。
总结
Istio/Envoy为微服务应用提供了分布式调用跟踪功能,提高了服务调用的可见性。我们可以使用OpenTracing来代替应用硬编码,以传递分布式跟踪的相关http header;还可以通过OpenTracing将方法级的调用信息加入到Istio/Envoy缺省提供的调用链跟踪信息中,以提供更细粒度的调用跟踪信息。
下一步除了同步调用之外,异步消息也是微服务架构中常见的一种通信方式。在下一篇文章中,我将继续利用eshop demo程序来探讨如何通过OpenTracing将Kafka异步消息也纳入到Istio的分布式调用跟踪中。
参考资料本文中eshop示例程序的源代码
Opentracing docs
Opentracing specification
Opentracing wire protocols
Zipkin-b3-propagation
OpenTracing Project Deep Dive