Node.js 应用全链路追踪技术——全链路信息存储( 二 )

在上面文件所在的目录下执行 docker-compose up -d 即可完成本地搭建 。
搭建完成后 , 在浏览器中打开地址 http://localhost:9411  , 会看到如下图所示页面:

Node.js 应用全链路追踪技术——全链路信息存储

文章插图
接着打开地址 http://localhost:9200  , 会看到如下图所示页面:
Node.js 应用全链路追踪技术——全链路信息存储

文章插图
至此 ,  zipkin 的本地环境就搭建好啦 。下面我就将介绍 Node.js 应用如何对接 zipkin 。
三、Node.js 接入 zipkin3.1 搞定全链路信息获取这个我在 《??Node.js 应用全链路追踪技术——全链路信息获取??》 文章中 , 已经详细阐述了 , 如何去获取全链路信息 。
3.2 搞定传输层因为 zipkin 是基于 OpenTracing 标准实现的 。因此我们只要搞定了 zipkin 的传输层 , 也就搞定了其他主流分布式追踪系统 。
这里我们用到了 zipkin 官方提供的两个 npm 包 , 分别是:
  • zipkin
  • zipkin-transport-http
zipkin 包是官方对支持 Node.js 的核心包 。 zipkin-transport-http 包的作用是将数据通过 HTTP 异步发送到 zipkin  。
下面我们将详细介绍在传输层 , 如何将将数据发送到 zipkin  。
3.3 传输层基础封装核心代码实现和相关注释如下:
const {BatchRecorder,Tracer,// ExplicitContext,jsonEncoder: { JSON_V1, JSON_V2 },} = require('zipkin')const { HttpLogger } = require('zipkin-transport-http') // const ctxImpl = new ExplicitContext(); // 配置对象const options = {serviceName: 'zipkin-node-service',targetServer: '127.0.0.1:9411',targetApi: '/api/v2/spans',jsonEncoder: 'v2'} // http 方式传输async function recorder ({ targetServer, targetApi, jsonEncoder }) => new BatchRecorder({logger: new HttpLogger({endpoint: `${targetServer}${targetApi}`,jsonEncoder: (jsonEncoder === 'v2' || jsonEncoder === 'V2') ? JSON_V2 : JSON_V1,})}) // 基础记录const baseRecorder = await recorder({targetServer: options.targetServertargetApi: options.targetApijsonEncoder: options.jsonEncoder})至此 , 传输层的基础封装就完成了 , 我们抽离了 baseRecorder 出来 , 下面将会把全链路信息接入到传输层中 。
3.4 接入全链路信息这里说下官方提供的接入 SDK ,代码如下:
 const { Tracer } = require('zipkin')const ctxImpl = new ExplicitContext()const tracer = new Tracer({ ctxImpl, recorder: baseRecorder })// 还要处理请求头、手动层层传递等事情上面的方式缺点比较明显 , 需要额外去传递一些东西 , 这里我们使用上篇文章提到的 Zone-Context  ,  代码如下:
 const zoneContextImpl = new ZoneContext()const tracer = new Tracer({ zoneContextImpl, recorder: baseRecorder })// 仅此而已 , 不再做额外处理对比两者 , 明显发现 ,  Zone-Context 的实现方式更加的隐式 , 对代码入侵更小 。这也是单独花一篇文章介绍 Zone-Context 技术原理的价值体现 。
自此 , 我们完成了传输层的适配 ,  Node.js 应用接入 zipkin 的核心步骤基本完成 。
3.5 搞定 zipkin 收集、存储、展示这部分中的收集、展示功能 ,  zipkin 官方自带完整实现 , 无需进行二次开发 。存储这块 , 提供了 MySQL 、 Elasticsearch 等接入方式 。可以根据实际情况去做相应的接入 。本文采用 docker-compose 集成了 ElasticSearch  。
四、总结自此 , 我们已经完成基于业界通用 OpenTracing 标准实现的 zipkin 的 Node.js 方案 。希望大家看完这两篇文章 , 对 Node.js 全链路追踪 , 有一个整体而清晰的认识 。
参考资料:
  1. ??zipkin 官网

【Node.js 应用全链路追踪技术——全链路信息存储】


推荐阅读