首页 > 其他分享 >分布式追踪系统Jaeger

分布式追踪系统Jaeger

时间:2024-10-20 21:18:06浏览次数:3  
标签:服务 请求 Jaeger span Span 分布式 追踪

什么是 Jaeger?

Jaeger 是一个分布式追踪系统,主要用于监控和故障排查分布式系统中的微服务架构。它帮助开发者跟踪请求在多个微服务中的路径,发现系统瓶颈,并分析各个服务之间的延迟和依赖关系。Jaeger 最早由 Uber 开发,现在已经成为 CNCF (Cloud Native Computing Foundation) 的孵化项目之一。

Jaeger 的作用

  • 分布式追踪:追踪请求从一个服务传递到另一个服务的路径,提供可视化的请求流。
  • 性能监控:检测每个微服务的性能瓶颈,分析延迟,帮助优化系统。
  • 故障排查:在复杂系统中快速定位错误发生的服务或阶段。
  • 依赖关系分析:显示服务之间的调用链,帮助开发者理解系统架构。

Jaeger 的核心概念

  1. Trace (追踪)

    • 代表一个请求的整个生命周期,从进入系统的第一个服务到流经不同服务的整个过程。
    • 每个 Trace 包含多个 Span
  2. Span (跨度)

    • SpanTrace 中的一个单独的操作,例如一个 HTTP 请求、数据库查询、远程调用等。
    • 每个 Span 包括开始时间、持续时间、操作名称、标签、日志等信息。
  3. Context (上下文)

    • 上下文用于跨服务传递追踪信息,通常通过 HTTP headers 或 RPC 的元数据中传递。
  4. Parent-Child 关系

    • 一个请求可能会经过多个微服务,每个服务的 Span 可以有父子关系,形成完整的调用链。

Jaeger 的工作原理

Jaeger 使用了分布式追踪的四步流程

  1. Instrumentation (插桩)

    • 在微服务中添加追踪代码,使服务在处理请求时能够生成 Span 并记录追踪数据。通过开源的追踪库(如 OpenTelemetry 或 OpenTracing)来插桩,自动生成追踪信息。
  2. Collection (收集)

    • Jaeger 会将生成的 Span 数据发送到 Jaeger 后端系统。后端系统负责收集所有 Span 并组装成完整的 Trace
  3. Storage (存储)

    • Jaeger 支持多种存储后端,包括 Elasticsearch、Cassandra、Kafka 等,用于持久化存储追踪数据。
  4. Visualization (可视化)

    • 用户可以通过 Jaeger UI 查看、分析追踪数据,定位性能瓶颈和错误位置。

Jaeger 的架构

Jaeger 典型架构包括以下组件:

  • Agent:运行在每个服务节点上,负责将追踪数据发送到 Jaeger Collector。
  • Collector:接收来自 Agent 的追踪数据并存储。
  • Query Service:用户可以通过这个服务查询追踪数据,并通过 UI 展示。
  • Storage Backend:存储追踪数据,支持 Cassandra、Elasticsearch 等。

如何学习使用 Jaeger

1. 安装 Jaeger

最简单的方式是通过 Docker 启动 Jaeger。首先,确保你已安装 Docker,然后运行以下命令来启动 Jaeger:

docker run -d --name jaeger \
  -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
  -p 5775:5775/udp \
  -p 6831:6831/udp \
  -p 6832:6832/udp \
  -p 5778:5778 \
  -p 16686:16686 \
  -p 14268:14268 \
  -p 14250:14250 \
  -p 9411:9411 \
  jaegertracing/all-in-one:1.22
  • 访问 Jaeger UI:http://localhost:16686
2. 在微服务中引入 Jaeger

通过 OpenTelemetry 或 OpenTracing 库在你的微服务代码中集成 Jaeger 追踪。下面是一个 Spring Boot 应用集成 Jaeger 的例子:

示例 1:使用 OpenTelemetry 集成 Jaeger

步骤 1:添加依赖

pom.xml 中添加 OpenTelemetry 和 Jaeger 的依赖:

<dependency>
    <groupId>io.opentelemetry</groupId>
    <artifactId>opentelemetry-exporter-jaeger</artifactId>
    <version>1.5.0</version>
</dependency>

步骤 2:配置 Jaeger 导出器

在应用的 application.properties 中配置 Jaeger:

otel.exporter.jaeger.endpoint=http://localhost:14250
otel.exporter.jaeger.service.name=my-service

步骤 3:编写代码

在代码中初始化 OpenTelemetry 并生成 Span

import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Tracer;

@RestController
public class MyController {

    private static final Tracer tracer = GlobalOpenTelemetry.getTracer("example-tracer");

    @GetMapping("/hello")
    public String sayHello() {
        Span span = tracer.spanBuilder("sayHello-span").startSpan();
        span.addEvent("Saying hello");
        
        try {
            return "Hello, Jaeger!";
        } finally {
            span.end();
        }
    }
}

当你访问 /hello 端点时,Jaeger 会捕获到 sayHello-span 这个 Span,并且你可以在 Jaeger UI 中查看到追踪信息。

3. 分布式追踪的实际使用场景

假设一个电子商务系统中有三个微服务:

  • 订单服务:接收用户订单。
  • 支付服务:处理用户支付。
  • 发货服务:安排订单发货。

在系统中,一个请求可能从订单服务开始,依次传递到支付服务和发货服务。Jaeger 可以帮助我们跟踪这个请求在不同服务中的执行情况,生成以下调用链:

User -> [Order Service] -> [Payment Service] -> [Shipment Service]

通过 Jaeger,你可以在每个微服务中看到请求的执行时间和延迟情况,如果某个服务有性能瓶颈,可以快速定位。

示例 2:分布式追踪的实际使用

服务 A:订单服务
// OrderService.java
public void placeOrder(Order order) {
    Span span = tracer.spanBuilder("placeOrder").startSpan();
    try {
        // 处理订单
        paymentService.processPayment(order);
        shipmentService.scheduleShipment(order);
    } finally {
        span.end();
    }
}
服务 B:支付服务
// PaymentService.java
public void processPayment(Order order) {
    Span span = tracer.spanBuilder("processPayment").startSpan();
    try {
        // 模拟支付处理
    } finally {
        span.end();
    }
}
服务 C:发货服务
// ShipmentService.java
public void scheduleShipment(Order order) {
    Span span = tracer.spanBuilder("scheduleShipment").startSpan();
    try {
        // 模拟发货安排
    } finally {
        span.end();
    }
}

在 Jaeger UI 中,你可以看到一个完整的调用链,从订单服务到支付服务,再到发货服务。每个 Span 都会展示执行的时间,帮助你分析系统的性能和潜在的瓶颈。

结论

Jaeger 是强大的分布式追踪工具,帮助开发者跟踪和优化微服务架构中的请求流。通过简单的插桩,我们可以轻松获取每个请求的详细追踪数据,并在 Jaeger UI 中分析系统的性能和依赖关系。通过逐步学习如何集成 Jaeger 和使用分布式追踪,可以显著提高系统的可观测性和故障排查能力。

标签:服务,请求,Jaeger,span,Span,分布式,追踪
From: https://blog.csdn.net/pumpkin84514/article/details/143085246

相关文章

  • 单元化架构,分布式系统的新王!
    0关键收获单元化架构通过减少故障的爆炸半径来增加系统弹性单元化架构是那些任何停机时间都被认为是不可接受的,或者可以显著影响最终用户的系统的一个好选择单元化架构通过强制使用固定大小的单元作为部署单元,并倾向于扩展而不是扩展的方法,增强了微服务的可伸缩性模型单元化......
  • 分布式缓存的基本概念入门以及如何保证数据一致性
    一、分布式缓存基本概念和常见技术框架JavaWeb中的分布式缓存是指在多台服务器之间共享缓存数据的技术。在分布式系统中,单个应用实例通常不会运行在一个单一的服务器上,而是部署在多个节点上以实现负载均衡和高可用性。为了在这些节点之间共享数据,就需要使用分布式缓存技术......
  • 分布式锁:实现方法
    目录一、基于数据库实现分布式锁1、乐观锁方式:2、悲观锁方式:二、基于Redis实现分布式锁1、使用SETNX命令:2、使用Redlock算法:一、基于数据库实现分布式锁   1、乐观锁方式:实现方案:通常利用数据库表中的版本号字段来实现。在获取数据时,同时获取版本号。在更......
  • SpringCloud项目|基于分布式架构的商城系统的设计与实现
    作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,有较为丰富的相关经验。期待与各位高校教师、企业......
  • hdfs的分布式存储原理
    1.想要把一个大文件存储到hdfs,首先进行划分,将文件划分为一个一个的block,这个block默认为512MB,可修改.2.备份(也就是副本)将文件划分后,一个block丢失则原来的大文件没有用了.为了确保文件的安全性,hdfs提供了副本,也就是备份,将文件划分之后hdfs默认将每一个block备份到......
  • 如何理解分布式事务
    在分布式系统环境中,分布式事务是一个关键的技术挑战。那么,什么是分布式事务呢?让我们一起来深入理解。一、分布式事务的定义分布式事务是指在分布式系统中,为了保证数据的一致性,涉及多个节点的事务操作。在传统的单体应用中,事务通常由数据库管理系统来处理,保证了数据的一致......
  • 分布式集群商城应用部署
    一、准备工作1.节点规划节点部署Ip主机名节点192.168.119.147db1数据库集群主节点192.168.119.153db2数据库集群从节点192.168.119.154MycatMycat中间件服务节点192.168.119.165Zookeeper1,kafka集群节点192.168.119.158Zookeeper2,kafka......
  • k8s-Longhorn系统配置 20241017 -分布式存储
    目录一Longhorn存储部署1.1Longhorn概述1.2Longhorn部署1.5动态sc创建1.6测试PV及PVC1.7Ingress暴露Longhorn1.8确认验证附加Helm部署附0.1helm安装附0.2helm安装 回到顶部一Longhorn存储部署1.1Longhorn概述Longhorn是用于Kubernetes的......
  • 《使用Gin框架构建分布式应用》阅读笔记:p77-p87
    《用Gin框架构建分布式应用》学习第5天,p77-p87总结,总计11页。一、技术总结1.Go知识点(1)context2.on-premisessoftwarep80,AcontainerislikeaseparateOS,butnotvirtualized;itonlycontainsthedependenciesneededforthatoneapplication,whichmakesthe......
  • hadoop完全分布式模式
    1.下载、上传、解压,添加环境变量。tarzxf/opt/software/hadoop-2.7.6.tar.gz-C/usr/local/src2.JAVA_HOMEhadoop-env.sh:修改JAVA_HOMEexportJAVA_HOME=/usr/local/src/jdk1.8.0_1813.NameNodehdfs-site.xml:namenode命令的存放路径;namenode的数据存放路径;设置备......