前言
对于一个商业组织来说,他们在二十一世纪面临的最基本挑战,就是互联网已经不再是一个替代或可选渠道。互联网已经成为许多商业组织最主要的,甚至是唯一的销售平台。保持互联网渠道正常运转,与维护实体店面正常运转一样重要。当商务网站变成商店时,它将面临与商店几乎相同的问题,所以必须要像监视实体店面一样监控它们。比实体店面更为复杂的是,几乎所有互联网应用都会采用微服务架构,这导致一次交易可能会由后台成百上千的服务共同完成。所以除了监控单个服务以外,追踪服务之间的调用链路也变得极为重要。所以微服务的追踪与监控对于商务网站来说,至少在技术层面已经成为决定其成败的关键因素之一。一方面微服务追踪与监控可以保证商务网站正常运转,在潜在灾难性错误出现前就阻止它,或是在灾难发生后迅速定位原因并恢复系统;另一方面微服务追踪与监控收集到的数据,经过聚合与分析可以产生巨大价值,人们可以从中发现巨大商机。这使得追踪与监控的性质发生了变化,未来微服务追踪与监控将不仅只是追踪与监控,而是追踪与监控数据辅以人工智能形成的市场分析与决策。
随着微服务与DevOps方法论的兴起,分布式追踪与监控的使用人员也不再仅局限于运维人员,而是受到越来越多研发人员的重视。但与此形成鲜明对比的是,国内多数软件研发人员对追踪与监控技术知之甚少。尤其是分布式追踪技术,由于它与微服务架构共同成长起来,国内几乎没有介绍Zipkin、Jaeger等追踪框架的图书。这使得许多人甚至并不知道微服务追踪这回事,而这也正是促成笔者编写本书的源动力之一。本书介绍的重点主要就集中在分布式追踪技术上,除了介绍使用方法主要会介绍它们在代码层面的原理。近几年随着云原生概念的兴起,人们将日志、监控和追踪都统一归入可观察性的范畴。所以本书会在介绍追踪框架之后再以Prometheus为例介绍监控技术,同时还会介绍与可观察性相关的几个开放标准OpenTracing、OpenCensus和OpenTelemetry。尽管OpenTelemetry目前还处于开发阶段,但未来可观察性的样子已经可见一斑了。
在编写本书时笔者面临了不少挑战,是否要关注底层实现细节的问题一直困扰着我。因为分布式追踪与监控本身应该对开发人员屏蔽技术细节,开发人员其实不需要关注太多底层细节,即使是在业务系统中也不需要编写太多与之相关的代码。而本书的写作目标恰恰就是要暴露这些技术细节,所以我不清楚读者是否会有兴趣。但以笔者二十多年的开发经验来看,越是这种封闭良好的技术框架,出现问题时付出的代价就会越大。这就是所谓的抽象泄漏问题。当一种组件对人们来说是一个黑盒,它出现问题时就会让人们不知所措。由于追踪与监控对开发人员来说影响比较大的是埋点库,所以本书关注的技术细节也只是在埋点库的实现上。对于追踪与监控的服务端来说,本书则着重介绍它们的安装、配置与使用方法。有些内容为了描述上的方便并没有完全按代码逻辑去描述,但从总的流程上来看遵从了框架的设计思路。读者要想了解其中细节内容,还是需要自行查看源代码。
另一个挑战就是微服务的追踪与监控技术是近些年才兴起的技术,一些专业术语在国内还没有形成统一的认识。有些术语的含义接近,但却对应了不同的英文单词;而有些则代表了不同的概念,但对应了相同的中文词语。为了不至混乱,这里先对一些术语做一些约定。
Tag与Label。
Tag在书中翻译为标签,Label在书中翻译为标记。标签一般代表数据一些内在特征,而标记则是人为附加的记号以区分数据。在书中标签主要出现在追踪系统中,而标记则出现在监控系统中。但它们的确也有混用的情况,本书严格按上述翻译约定。
Metric和Instrument
Metric在本书中翻译为指标,Instrument在本书中翻译为埋点。IEEE的软件工程术语标准辞典(IEEE Standard Glossary of Software Engineering Terms)中定义Metric为对一个系统、构件或过程的某个给定属性的一个定量测量。而Instrument在英文中泛指一切工具,但它一般是指用于测量数据的仪表。在追踪与监控领域,Instrument有一个比较通俗的叫法,那就是埋点。简单来说,Metric就是被监控的数据,而Instrument则是用来收集数据的工具或方法。Instrument并非只收集指标,在追踪中的追踪数据也是通过埋点的方式收集。
Measure与Measurement
Measure在本书中翻译为测度,Measurement在本书中翻译为测量。在软件工程领域中,Measure是对一个产品某个属性的数量、大小等提供的一个定义,而Measurement则是对其进行的一个具体测量行为。这两个术语主要出现在OpenCensus中,在本书第9章会有更详细说明。
在分布式追踪与监控领域,可以清晰地看到Spring和Kubernetes两个阵营。Spring以开源为背书,在追踪与监控方面主推Zipkin和Micrometer等开源框架;而Kubernetes则以CNCF为基础,主推OpenTracing和OpenTelemetry为主的开放标准。这背后实际上是在云计算技术背景下,各大厂商对计算虚拟化市场抢夺的一种表现形式。本书内容基本上涵盖了这两大阵营在追踪与监控上的技术框架和开放标准,相信读者最终可以作出自己的正确判断。
最后,谨以此书献给我的母亲!
田雪松
2020年6月20日