什么是分布式跟踪?
微服务的兴起使用户能够创建由模块化服务组成的分布式应用,而不是单一的功能单元。这种模块化使测试和部署更容易,同时防止应用程序的单点故障。
当应用程序开始扩展并在多个云原生服务中分配其资源时,追踪单个事务变得繁琐且几乎不可能。因此,开发人员需要应用分布式跟踪技术。
分布式跟踪允许在前端和后端服务之间跟踪一个交易,同时提供系统行为的可见性。
分布式追踪如何工作
分布式追踪过程的基本概念是能够通过应用程序的多个分布式组件追踪每一个交易。为了实现这种可见性,分布式跟踪技术使用唯一的标识符,即 跟踪ID 来标记每个交易。然后,系统通过使用这个唯一的标识符,把来自应用的各个组件的每一个跟踪放在一起,从而建立一个交易的时间线。
每个跟踪由一个或多个跨度组成,代表了单个跟踪中的一个操作。必须明白,一个跨度可以被称为另一个跨度的父跨度,表明父跨度触发了子跨度。
实施分布式跟踪
设置分布式跟踪取决于所选择的解决方案。然而,每个解决方案都由这些共同的步骤组成。这三个步骤确保开发人员有一个坚实的基础来开始他们的分布式跟踪之旅:
- 建立一个分布式追踪系统。
- 对代码进行检测以进行追踪。
- 收集和存储跟踪数据。
1.建立一个分布式系统
选择正确的分布式跟踪解决方案是至关重要的。必须解决一些关键问题,如兼容性、规模和其他重要因素。
许多分布式追踪工具支持各种编程语言,包括Node.js、Python、Go、.NET、Java等。这些工具允许开发者使用单一的解决方案在多个服务中进行分布式追踪。
2.2.跟踪的仪表代码
根据不同的解决方案,整合的方法可能会改变。许多解决方案提供的最常见的方法是使用一个SDK,在运行时收集数据。
例如,使用Helios和Node.js的开发者需要通过运行以下命令来安装最新的Helios OpenTelemetry SDK:
npm install --save helios-opentelemetry-sdk
之后,该方案需要定义以下环境变量。最后,它使SDK能够从服务中收集必要的数据:
export NODE_OPTIONS="--require helios-opentelemetry-sdk" export HS_TOKEN="{{HELIOS_API_TOKEN}}" export HS_SERVICE_NAME="<Lambda01>" export HS_ENVIRONMENT="<ServiceEnvironment01>"
3.收集和存储跟踪数据
在大多数分布式跟踪系统中,跟踪数据的收集是在运行时自动进行的。然后,这些数据会被送到分布式追踪解决方案中,在那里进行分析和可视化。
跟踪数据的收集和存储取决于所使用的解决方案。例如,如果解决方案是基于SaaS的,解决方案提供商将负责所有跟踪数据的收集和存储。然而,如果追踪解决方案是自我托管的,那么照顾这些方面的责任就落在解决方案的管理员身上。
分析跟踪数据
分析跟踪数据可能是很乏味的。然而,可视化跟踪数据使开发人员更容易理解实际的事务流程,并识别异常或瓶颈。
下面展示了事务在应用程序的各种服务和组件中的流动情况。一个先进的分布式跟踪系统可能会突出显示每个事务运行的错误和瓶颈。
由于跟踪数据包含了每个服务处理事务所需的时间,开发人员可以分析延迟并识别可能影响应用程序性能的异常情况。
使用分布式跟踪解决方案确定一个问题,可以深入了解所发生的问题。然而,为了获得有关该问题的进一步细节,开发人员可能需要使用额外的工具,通过观察性或将跟踪与日志相关联的能力提供额外的洞察力,以确定原因。
分布式跟踪解决方案,如Helios,可以深入了解错误的细节,从而减轻开发人员的负担。
分布式追踪的最佳实践
全面的分布式追踪解决方案使开发人员能够迅速地对关键问题做出反应。以下的最佳实践为成功的分布式追踪解决方案提供了基础条件。
1.确保跟踪数据的准确性和完整性
从服务中收集跟踪数据使开发人员能够识别每个事务流经的所有服务的性能和延迟。然而,当跟踪数据不包含来自特定服务的信息时,会降低整个跟踪的准确性和整体完整性。
为了确保开发者从分布式跟踪中获得最大收益,系统从所有服务中收集准确的跟踪信息以反映原始数据是至关重要的。
2.平衡跟踪的开销和细节
从所有的服务中收集所有的跟踪信息将提供最全面的跟踪。然而,收集大部分跟踪信息是以整个应用或单个服务的开销为代价的。
收集的数据量和可接受的开销之间的权衡是至关重要的。对这种权衡的规划可以确保分布式跟踪不会损害整体解决方案,从而超过解决方案带来的好处。
平衡这些方面的另一个方法是对跟踪信息进行过滤和采样,以收集所需的信息。然而,这需要额外的计划和对收集有价值的跟踪信息的要求有充分的了解。
3.保护跟踪数据中的敏感数据
从交易中收集跟踪信息包括收集实际交易的有效载荷。这种信息通常被认为是敏感的,因为它可能包含客户的个人身份信息,如驾驶执照号码或银行信息。
世界各地的法规明确规定了在商业运作过程中应储存哪些信息,以及如何处理这些信息。因此,收集到的信息必须经过数据混淆处理,这一点具有无可比拟的重要性。
Helios使其用户能够轻松地将敏感数据从收集的有效载荷中混淆出来,从而使其符合法规。除了混淆之外,Helios还提供其他技术来加强和过滤发送到Helios平台的数据。
分布式追踪工具
今天,有许多分布式追踪工具可供开发人员使用,以方便利用其能力更快解决问题。
1.1.Lightstep
Lightstep是一个与云无关的分布式追踪工具,提供跨多云环境或微服务的全上下文分布式追踪。它使开发人员能够以很少的额外努力将解决方案与复杂的系统集成。
它还提供了一个免费计划,其中包含了开发人员开始其分布式追踪之旅所需的功能。此外,免费计划还提供许多有用的功能,包括数据摄取、分析和监控。
2.Zipkin
Zipkin是一个开源的解决方案,提供分布式追踪,并有易于使用的步骤来启动。它通过实现与Elasticsearch的整合来增强其分布式追踪工作,以实现高效的日志搜索。
它是在Twitter开发的,用于收集服务架构中的延迟问题所需的关键计时数据,而且通过一个简单的Docker命令就可以直接设置了:
docker run -d -p 9411:9411 openzipkin/zipkin
3.Jaeger Tracing
Jaeger Tracing是另一个开源解决方案,它提供端到端的分布式跟踪,并能够进行根本原因分析,以确定每个跟踪的性能问题或瓶颈。
它还支持Elasticsearch的数据持久性,并默认公开Prometheus指标,以帮助开发人员获得有意义的洞察力。此外,它允许使用预先建立的Jaeger UI,根据持续时间、服务和标签过滤跟踪。
4.SigNoz
SigNoz是一个开源工具,使开发人员能够在基于微服务的系统中进行分布式跟踪,同时捕获日志、跟踪和指标,并在随后的统一用户界面中对其进行可视化。它还提供有洞察力的性能指标,如p50、p95和p99延迟。
使用SigNoz的一些主要好处包括:在支持OpenTelemetry的同时,展示日志、指标和跟踪的综合用户界面。
5.新资源(New Relic
New Relic是一个分布式跟踪解决方案,可以观察到100%的应用程序的痕迹。它提供了与庞大的技术栈的兼容性,并支持行业标准的框架,如OpenTelemetry。它还支持报警,以便在错误变成重大问题之前进行诊断。
New Relic的优势在于它是一个完全管理的云原生系统,支持按需扩展。此外,开发人员可以使用一个代理来自动检测整个应用的代码。
6.Datadog
Datadog是一个公认的解决方案,提供云监控即服务。它通过Datadog APM提供分布式追踪功能,包括将分布式追踪、浏览器会话、日志、配置文件、网络、进程和基础设施指标关联起来的额外功能。
此外,Datadog APM允许开发人员轻松地将该解决方案与应用程序集成。开发人员还可以利用该解决方案的功能,无缝检测应用程序代码,以监测云基础设施。
7.7.Splunk
Splunk提供了一个分布式跟踪工具,能够摄取所有的应用程序数据,同时启用AI驱动的服务来识别容易出错的微服务。它还增加了应用和基础设施指标之间的相关性的优势,以更好地了解手头的故障。
你可以从一个带来基本功能的免费层开始。然而,关键是要了解这个解决方案将在云中存储数据;这可能会导致一些行业的合规问题。
8.蜂巢
Honeycomb在其原生的可观察性功能之外,还带来了分布式追踪功能。它的一个突出特点是,它使用异常检测来确定哪些跨度与不良用户体验有关。
它支持OpenTelemetry,使开发者能够对代码进行检测,而不必拘泥于单一的供应商,同时提供现收现付的定价模式,只为你使用的东西付费。
9.9.Helios
Helios带来了先进的分布式跟踪技术,通过适应OpenTelemetry的上下文传播框架,增强了开发者对端到端应用流程的可操作性洞察力。
该解决方案为您的系统提供跨微服务、无服务器功能、数据库和第三方API的可见性,从而使您能够快速识别、重现和解决问题。
此外,Helios还提供了一个基于OpenTelemetry的免费跟踪可视化工具,开发人员只需上传跟踪文件,就可以对其进行可视化分析。
总结
分布式跟踪已经出现了许多迭代和功能增强,使开发人员能够轻松识别应用程序中的问题。它减少了检测和应对性能问题的时间,并有助于了解各个微服务之间的关系。
分布式跟踪的未来将纳入多云跟踪,使开发人员能够在各种云平台上排除问题。同时,这些平台会整合追踪,从而切断开发人员在每个云平台上手动追踪这些事务的要求,这很耗时,几乎不可能实现。