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


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

文章插图
一、背景目前业界主流的做法是使用分布式链路跟踪系统 , 其理论基础是来自 google 的一篇论文 《大规模分布式系统的跟踪系统》 。
论文如下图所示:
 
Node.js 应用全链路追踪技术——全链路信息存储

文章插图
 
  (图片来源:网络)
 
在此理论基础上 , 诞生了很多优秀的实现 , 如 zipkin、jaeger  。同时为了保证 API 兼容 , 他们都遵循 OpenTracing 标准 。那 OpenTracing 标准是什么呢?
OpenTracing 翻译为开发分布式追踪 , 是一个轻量级的标准化层 , 它位于应用程序/类库和链路跟踪系统之间的一层 。这一层可以用下图表示:
Node.js 应用全链路追踪技术——全链路信息存储

文章插图
从上图可以知道 ,  OpenTracing 具有以下优势:
  • 统一了 API  , 使开发人员能够方便的添加追踪系统的实现 。
  • OpenTracing 已进入 CNCF  , 正在为全球的分布式链路跟踪系统 , 提供统一的模型和数据标准 。
大白话解释下:它就像手机的接口标准 , 当今手机基本都是 typeC 接口 , 这样方便各种手机能力的共用 。因此 , 做全链路信息存储 , 需要按照业界公认的 OpenTracing 标准去实现 。
本篇文章将通过已有的优秀实现 —— zipkin  , 来给大家阐述 Node.js 应用如何对接分布式链路跟踪系统 。
二、zipkin2.1 zipkin 是什么?zipkin 是 Twitter 基于 Google 的分布式追踪系统论文的开发实现 , 其遵循 OpenTracing 标准 。
zipkin 用于跟踪分布式服务之间的应用数据链路 。
2.2 zipkin 架构官方文档上的架构如下图所示:
Node.js 应用全链路追踪技术——全链路信息存储

文章插图
为了更好的理解 , 我这边对架构图进行了简化 , 简化架构图如下所示:
Node.js 应用全链路追踪技术——全链路信息存储

文章插图
从上图可以看到 , 分为三个部分:
第一部分:全链路信息获取 , 我们不使用 zipkin 自带的全链路信息获取 , 我们使用 zone-context 去获取全链路信息
第二部分:传输层 ,  使用 zipkin 提供的传输 api  , 将全链路信息传递给 zipkin
第三部分: zipkin 核心功能 , 各个模块介绍如下:
  • collector 就是信息收集器,作为一个守护进程 , 它会时刻等待客户端传递过来的追踪数据 , 对这些数据进行验证、存储以及创建查询需要的索引 。
  • storage 是存储组件 。zipkin 默认直接将数据存在内存中 , 此外支持使用 ElasticSearch 和 MySQL  。
  • search 是一个查询进程 , 它提供了简单的 JSON API 来供外部调用查询 。
  • web UI 是 zipkin 的服务端展示平台 , 主要调用 search 提供的接口 , 用图表将链路信息清晰地展示给开发人员 。
至此 ,  zipkin 的整体架构就介绍完了 , 下面我们来进行 zipkin 的环境搭建 。
2.3 zipkin 环境搭建采用 Docker 搭建 ,  这里我们使用 docker 中的 docker-compose 来快速搭建 zipkin 环境 。
docker-compose.yml 文件内容如下:
version: '3.8'services:elasticsearch:image: docker.elastic.co/elasticsearch/elasticsearch:7.5.0container_name: elasticsearchrestart: alwaysports:- 9200:9200healthcheck:test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"]interval: 30stimeout: 10sretries: 3start_period: 40senvironment:- discovery.type=single-node- bootstrap.memory_lock=true- "ES_JAVA_OPTS=-Xms512m -Xmx512m"- TZ=Asia/Shanghaiulimits:memlock:soft: -1hard: -1zipkin:image: openzipkin/zipkin:2.21container_name: zipkindepends_on:- elasticsearchlinks:- elasticsearchrestart: alwaysports:- 9411:9411environment:- TZ=Asia/Shanghai- STORAGE_TYPE=elasticsearch- ES_HOSTS=elasticsearch:9200


推荐阅读