### 跟踪
#### 概述
分布式跟踪使开发人员可以在大型面向服务的体系结构中获得调用流的可视化。在理解序列化,并行性和延迟来源方面,这是非常宝贵的。Envoy支持系统范围与跟踪相关的三个功能:
- **请求ID生成**:Envoy将在需要时生成UUID并填充`x-request-id` HTTP头。 应用程序可以转发`x-request-id`头以进行统一日志记录以及跟踪。
- **外部跟踪服务集成**:Envoy支持可插入的外部跟踪可视化提供程序。 目前,Envoy支持[LightStep](http://lightstep.com/),[Zipkin](http://zipkin.io/)或Zipkin兼容后端(例如[Jaeger](https://github.com/jaegertracing/))。但是,并不支持其他调用跟踪机制。
- **客户端跟踪ID加入**:用于将不可信`x-client-trace-id`请求ID头连接到可信的内部`x-request-id`。
#### 如何启动跟踪
处理请求的HTTP连接管理器必须设置跟踪对象。有几种方法可以启动跟踪:
- 外部客户端通过`x-client-trace-id`头域字段请求。
- 通过`x-envoy-force-trace`头域字段请求内部服务。
- 通过设置随机采样进行采样。
路由过滤器还可以通过`start_child_span`选项为出站调用发起跟踪。
Envoy提供报告有关网格中服务之间通信的跟踪信息的功能。但是,为了能够关联调用流中各个代理生成的跟踪信息,服务必须在入站和出站请求之间传播特定的跟踪上下文。
无论使用哪个跟踪机制,该服务都应该传播`x-request-id`,以便使得在被调用服务日志中记录相关信息。
跟踪机制还需要支持额外的上下文记录,以便开发者更加容易理解(如:逻辑工作单元)之间的父/子关系。这可以通过在服务本身内直接使用LightStep(通过OpenTracing API)或Zipkin tracer来实现,以从入站请求中提取跟踪上下文,并将其注入到任何后续的出站请求中。这种方法还可以使服务创建额外的spans,描述在服务内部完成的工作,这在检查端到端跟踪时可能是有用的。
跟踪上下文可以由服务手动传播:
- 当使用LightStep跟踪器时,Envoy依靠该服务传播`x-ot-span-context` HTTP头,同时向其他服务发送HTTP请求。
- 当使用Zipkin示踪器时,Envoy依靠该服务来传播官方的B3 HTTP报头(`x-b3-traceid`,`x-b3-spanid`,`x-b3-parentspanid`,`x-b3-sampled`和`x-b3-flags` )或为了方便起见,也可以传播`x-ot-span-context` HTTP头。
注意:分布式跟踪社区中正在进行工作以定义跟踪上下文传播的标准。 一旦采用了合适的方法,用于传播Zipkin跟踪上下文的非标准单头`x-ot-span-context`的使用将被替换。
#### 每个跟踪包含哪些数据
端到端跟踪由一个或多个spans组成。spans表示具有开始时间和持续时间的逻辑工作单元,并且可以包含与其关联的元数据。 Envoy生成的每个spans包含以下数据:
- 通过`--service-cluster`设置始发服务集群。
- 开始时间和请求的持续时间。
- 始发主机通过`--service-node`设置。
- 通过`x-envoy-downstream-service-cluster`头设置下游集群。
- HTTP网址。
- HTTP方法。
- HTTP响应代码。
- 跟踪系统中的特定元数据。
范围还包括一个名称(或操作),默认情况下被定义为被调用的服务的主机。但是,这可以使用路线上的装饰器来定制。该名称也可以使用`x-envoy-decorator-operation`头域字段替代。
Envoy自动发送spans跟踪收集。根据跟踪收集器的不同,使用通用信息(如全局唯一请求标识`x-request-id`(LightStep)或跟踪标识配置(Zipkin))将多个spans拼接在一起。
关于如何在Envoy中设置跟踪详细信息,请参考手册。
- [v1 API参考](../../v1APIreference/Tracing.md)
- [v2 API参考](../../v2APIreference/Bootstrap.md)
### 返回
- [架构介绍](../Architectureoverview.md)
- [简介](../../Introduction.md)
- [首页目录](../../README.md)
- 首页
- 简介
- Envoy是什么
- 架构介绍
- 术语
- 线程模型
- 监听器
- L3/L4网络过滤器
- HTTP连接管理
- HTTP过滤器
- HTTP路由
- gRPC
- WebSocket支持
- 集群管理
- 服务发现
- 健康检查
- 连接池
- 负载均衡
- 异常检测
- 熔断
- 全局限速
- TLS
- 统计
- 运行时配置
- 跟踪
- TCP代理
- 访问日志
- MongoDB
- DynamoDB
- Redis
- 热重启
- 动态配置
- 初始化
- 逐出
- 脚本
- 部署
- 业界对比
- 获得帮助
- 历史版本
- 编译安装
- 编译
- 参考配置
- 演示沙箱
- 前端代理
- Zipkin跟踪
- Jaeger跟踪
- gRPC桥接
- 构建Envoy Docker镜像
- 工具
- 配置参考
- V1 API 概述
- V2 API 概述
- 监听器
- 网络过滤器
- TLS客户端身份认证
- Echo
- Mongo代理
- 速率限制
- Redis代理
- TCP代理
- HTTP连接管理器
- 路由匹配
- 流量转移/分流
- HTTP头部操作
- HTTP头部清理
- 统计
- 运行时设置
- 路由发现服务
- HTTP过滤器
- 缓存
- CORS过滤器
- 故障注入
- DynamoDB
- gRPC HTTP/1.1 桥接
- gRPC-JSON 转码过滤器
- gRPC-Web 过滤器
- 健康检查
- 速率限制
- 路由
- Lua
- 集群管理
- 统计
- 运行时设置
- 集群发现服务
- 健康检查
- 熔断
- 访问日志
- 限速服务
- 运行时配置
- 路由表检查工具
- 运维管理
- 命令行选项
- 热重启
- 管理接口
- 统计概述
- 运行时配置
- 文件系统
- 自定义扩展示例
- V1 API参考
- 监听器
- 网络过滤器
- TLS客户端身份认证
- Echo
- HTTP连接管理
- Mongo代理
- 速率限制
- Redis代理
- TCP代理
- HTTP路由配置
- 虚拟主机
- 路由
- 虚拟集群
- 速率限制配置
- 路由发现服务
- HTTP过滤器
- 缓存
- CORS过滤器
- DynamoDB
- 故障注入
- gRPC HTTP/1.1 桥接
- gRPC-JSON 转码过滤器
- gRPC-Web 过滤器
- 健康检查
- Lua
- 速率限制
- 路由
- 集群管理
- 集群
- 健康检查
- 熔断
- TLS上下文
- 异常值检测
- HASH环负载均衡配置
- 异常检测
- 集群发现服务
- 服务发现服务
- 访问日志
- 管理接口
- 限速服务
- 运行时配置
- 跟踪
- V2 API参考
- 启动引导
- 监听&监听发现
- 集群&集群发现
- 服务发现
- 健康检查
- HTTP路由管理&发现
- TLS配置
- 通用的类型
- 网络地址
- 协议选项
- 发现API
- 限速组件
- 过滤器
- 网络过滤器
- TLS客户端身份认证
- HTTP连接管理
- Mongo代理
- 速率限制
- Redis代理
- TCP代理
- HTTP过滤器
- 缓存
- 故障注入
- 健康检查
- Lua
- 速率限制
- 路由
- gRPC-JSON转码器
- 常见访问日志类型
- 常见故障注入类型
- FAQ
- Envoy有多快?
- 我在哪里获得二进制文件?
- 我如何设置SNI?
- 如何设置区域感知路由?
- 我如何设置Zipkin跟踪?