基于Go语言的链路追踪实践
程序的可观测性与Telemetry
OpenTelemetry 客户端架构与生态
Trace系统数据流全局解折
一次基于Go语言的链路追踪实践
分布式系统复杂性
问题难以定位
反应很慢,怎么排查?
定位问题慢
kibana 查看日志logs
grafana查看metrics
建立trace系统,带有调用链的时长看板
Trace快速锁定故障范围
程序的可观测性与Tracing
Logging:离散的日志信息
Metrics:聚合的指标
Tracing:请求级别的链路追踪
OpenTracing诞生的历史背景
OpenTracing面对的难题
规范Trace Metric log都要带上应用context,最重要的是带上traceid
OpenTracing是一套理论规范
OpenTelemetry的诞生
OpenTelemetry要解决的是可观测的大一统
OpenTelemetry一个中立的统一标准
提供一个安全,厂商中立的协议、组件,形成pipeline将数据发往不同的后端
OpenTelemetry整体生态
OpenTelemetry中的Trace定义
OpenTelemetry中的Trace的基本单元
Spans跨度
OpenTelemetry SDK与自动注入
OpenTelemetry开箱即用的工具
官方文档提供了怎么接入,比较详细
Tracing工具 jaeger、skywalking
部署jaeger
初始化Tracer,使用Jaeger作为后端
接口
数据库
客户端
埋点
代码中埋点
基于云原生的全链路可观性系统
数据采集模块实现 agent 采集链路信息,
链路分析模块实现自动完成服务调用的可视化拓扑,管理模块实现面板权限、数据源权限功能
链路工具需求
架构设计
app<-链路agent sidecar->链路采集模块->ES->
容器链路分析模块->web ui展示
kubernetes namespace pod app
kubernete->30MIN cache ->容器链路分析模块
pod内:app+链路agent sidecar
链路采集模块
java agent代理 字节码注入 调用拦截和数据采集
Java Agent 探针,通过
字节码注入的方式实现
调用拦截和数据收集,可以做到真正的代码无侵入,只需要在启动服务器的时候添加一些参数,就可以完成探针的部署
数据存储到es中
容器链路分析模块
到web ui展示
流程
paas->cache->project podid->promethues<-exporter->es
内容:
监控和链路信息采集和展示。
性能监控:聚合应用性能监控指标,多维度展示当前应用系统运行状态。
应用间调用关系拓扑展示。
应用拓扑:应用串联可视化,异常状态可视化,快速定位异常服务。
真实请求的链路分析,直观展示链路状态信息。
链路追踪:面向交易请求,真实交易链路的请求分析
性能分析:用户主动发起,对指定的慢请求进行细致化采样分析,快速定位系统响应缓慢的原因。
应用健康检查
健康检查项
应用综合检查项设计:链路以及资源情况
健康检查报告
生成项目下应用健康检查报告,手动触发以及定期生成。
状态检查
应用运行状态:是否为启动状态,应用下所有实例是否均处于运行状态。
故障定位
根据故障链路位置,直接推断出故障位置。
量化评价
将应用链路信息以及应用资源使用情况和日志等信息加权算出健康值。
目标:
分析容器云平台中微服务的业务调用链路追踪信息,获取微服务关系拓扑
结合容器日志、监控信息,全方位展示应用状态;
工作
平台对接
采集PaaS平台中运行应用的链路数据,并在平台页面直观展示应用的链路信息以及运行状态
web ui
跟据链路信息,整合应用间访问关系,在前端页面展示应用关系拓扑
性能优化
引入时序数据库,将海量链路数据进行二次聚合,减少查询分析数据量请求,提升数据访问效率
数据存储
容器化ES集群,解决链路信息存储问题。
概览页
容器项目下所有应用情况,包括应用请求数,错误数等排序信息。
容器监控页
监控项目下包含的容器pod的资源使用率和运行状态。
服务列表页
展示项目下所有应用的服务列表以及健康度等状态信息
全局拓扑页
展示项目下所有应用间的调用关系以及每个服务的请求、错误、响应的图表。
链路入口页
展示项目下被外部调用的入口接口列表。并显示其请求、错误、响应的数据。
多维查询页
展示项目所有的链路信息,提供了筛选条件。按照指定需求筛选链路信息,点击链路traceid可 查看链路详情。
服务详情页
展示项目下指定服务的详细信息,可查询该服务被请求的次数、错误次数、响应时间等。
链路调用详情
详细展示单个链路调用的详细的span信息,每个span的执行时间,执行顺序
页面展示