Jaeger Hot R.O.D. 示例应用完全指南:用 OpenTelemetry 搭建微服务分布式追踪演示 Jaeger Hot R.O.D. 示例应用完全指南用 OpenTelemetry 搭建微服务分布式追踪演示【免费下载链接】jaegerCNCF Jaeger, a Distributed Tracing Platform项目地址: https://gitcode.com/GitHub_Trending/ja/jaegerHot R.O.D.Rides on Demand是 Jaeger 项目内置的经典分布式追踪演示应用由多个微服务组成用于展示如何使用 OpenTelemetry API 与 SDK 对真实业务场景进行插桩。本文基于仓库中的 examples/hotrod/README.md 展开覆盖四种运行方式docker compose、Kubernetes、源码编译、独立 Docker 容器、全部命令行参数、指标暴露方式以及 Jaeger UI 联动配置并深入对应源码帮助你快速上手并理解 Hot R.O.D. 的底层实现。读完本文你将能够在本机或 Kubernetes 上完整跑起 Hot R.O.D. Jaeger 的演示环境并通过 Jaeger UI 分析微服务调用链、定位延迟与并发问题。注意自 Jaeger v1.42.0 起Hot R.O.D. 已从 Jaeger 客户端 SDK 升级为 OpenTelemetry SDK 进行 Trace 上报见 README因此本演示同时是学习 OpenTelemetry 插桩的最佳实战素材。Hot R.O.D. 是什么四个微服务的打车场景Hot R.O.D. 模拟一个按需出行网约车业务由前端frontend、客户customer、司机driver和路线route四个微服务协作完成一次打车请求frontendWeb 前端服务接收用户请求编排后续调用默认端口8080customer客户服务模拟从 MySQL 读取客户档案默认端口8081driver司机服务模拟通过 Redis 查找最近的司机默认端口8082route路线服务模拟路径计算默认端口8083。从源码看四个服务的启动逻辑集中在 examples/hotrod/cmd 目录下入口 main.go 调用cmd.Execute()而 all.go 中的all子命令会并发启动全部服务go customerCmd.RunE(customerCmd, args) go driverCmd.RunE(driverCmd, args) go routeCmd.RunE(routeCmd, args) return frontendCmd.RunE(frontendCmd, args)各服务的延迟参数模拟 MySQL / Redis / 路线计算耗时定义在 services/config/config.go 中例如MySQLGetDelay 300 * time.Millisecond、RedisFindDelay 20 * time.Millisecond、RouteCalcDelay 50 * time.Millisecond并配有标准差参数以模拟真实抖动。为什么值得运行它演示的核心特性依据 READMEHot R.O.D. 主要演示以下能力数据驱动的依赖关系图通过实际 Trace 数据自动发现整个系统的微服务架构请求时间线与错误查看直观理解一次请求在各服务间的流转过程定位延迟与并发不足的根源通过 Trace 找出性能瓶颈高上下文化日志Highly contextualized logging日志与 Trace 关联便于排查Baggage 传播诊断请求间争用排队问题统计服务内各环节耗时使用 opentelemetry-go-contrib 开源库以最小代码改动完成 HTTP 与 gRPC 请求的自动插桩。其中排队 / 并发不足的演示非常经典仓库在 services/config/config.go 中通过MySQLMutexDisabled控制是否用互斥锁模拟连接池大小仅为 1的错误配置当锁未禁用时多个并发请求会在同一把锁上排队从而在 Jaeger UI 的 Trace 中呈现出明显的等待段这就是 Baggage 传播用于诊断请求间争用的典型场景。运行方式一docker compose 一键启动推荐这是最省事的启动方式Jaeger 后端与 HotROD 应用会被一起拉起获取docker-compose.yml仓库内版本见 examples/hotrod/docker-compose.yml可选从 Jaeger 官方下载页获取最新 Jaeger 版本号通过环境变量JAEGER_VERSION传入。如果不指定docker compose会使用latest标签——首次拉取没问题但镜像进入本地仓库后latest标签不会自动更新可能长期运行旧版本甚至不兼容的 Jaeger 与 HotROD 组合启动JAEGER_VERSION2.14.0 docker compose -f path-to-yml-file up访问 Jaeger UIhttp://localhost:16686与 HotROD 应用http://localhost:8080关闭与清理docker compose -f path-to-yml-file down仓库内 docker-compose.yml 展示了完整编排jaeger服务暴露16686UI、16687、4317OTLP gRPC与4318OTLP HTTP端口hotrod服务暴露8080与8083并通过环境变量OTEL_EXPORTER_OTLP_ENDPOINThttp://jaeger:4318将 Trace 通过 OTLP/HTTP 上报到 Jaeger同时depends_on: jaeger保证后端先启动。你还可以通过REGISTRY与HOTROD_VERSION变量定制镜像仓库与 HotROD 版本注释示例JAEGER_VERSION2.0.0 HOTROD_VERSION1.63.0 docker compose up。README 建议优先尝试 Jaeger v2其入口与配置见 cmd/jaeger 目录。运行方式二Kubernetes 部署仓库在 examples/hotrod/kubernetes 目录下提供了 Kustomize 清单部署与清理命令如下kustomize build ./kubernetes | kubectl apply -f - kubectl port-forward -n example-hotrod service/example-hotrod 8080:frontend # In another terminal kubectl port-forward -n example-hotrod service/jaeger 16686:frontend # To cleanup kustomize build ./kubernetes | kubectl delete -f -随后同样通过 http://localhost:16686Jaeger UI与 http://localhost:8080HotROD访问。运行方式三分别启动 Jaeger 后端与 HotROD启动 Jaeger 后端内嵌内存存储Jaeger 后端以 Docker 容器形式发布内置内存存储无需额外数据库docker run \ --rm \ --name jaeger \ -p4318:4318 \ -p16686:16686 \ -p14268:14268 \ jaegertracing/jaeger:latest端口说明4318OTLP HTTP 接收端HotROD 通过它上报 Trace16686Jaeger UI 与查询 API14268Jaeger 兼容的 Thrift HTTP 接收端。启动后 Jaeger UI 位于 http://localhost:16686。从源码运行 HotRODgit clone gitgithub.com:jaegertracing/jaeger.git jaeger cd jaeger go run ./examples/hotrod/main.go allgo run会编译并直接运行 examples/hotrod/main.goall子命令一次性拉起全部四个服务。从 Docker 运行 HotRODdocker run \ --rm \ --link jaeger \ --env OTEL_EXPORTER_OTLP_ENDPOINThttp://jaeger:4318 \ -p8080-8083:8080-8083 \ jaegertracing/example-hotrod:latest \ all--link jaeger将 HotROD 容器与上一步的 Jaeger 容器连接同主机场景OTEL_EXPORTER_OTLP_ENDPOINT指定 OTLP 上报端点-p8080-8083一次性映射四个服务的全部端口末尾all同源码运行启动全部服务。然后打开 http://127.0.0.1:8080 使用应用。指标Metrics暴露HotROD 默认以 Go 的expvar格式暴露指标也可通过-m prometheus标志切换为 Prometheus 格式expvarcurl http://127.0.0.1:8080/debug/varsPrometheuscurl http://127.0.0.1:8080/metrics从源码看指标工厂在 cmd/root.go 中初始化metricsFactory prometheus.New().Namespace(metrics.NSOptions{Name: hotrod, Tags: nil})即以hotrod为命名空间。注意 README 中提到的-m prometheus标志对应的指标切换逻辑可结合 internal/metrics 下的实现理解默认工厂仍为 expvar 风格Prometheus 通过同一 Factory 接口接入。与 Jaeger UI 联动自定义查找 Trace链接地址HotROD 的 Web UI 可以为每次请求生成跳转到 Jaeger UI 查找对应 Trace 的链接。默认使用 http://localhost:16686若 Jaeger UI 部署在其他地址可通过-j address标志覆盖go run ./examples/hotrod/main.go all -j http://jaeger-ui:16686该标志在 cmd/flags.go 中定义为--jaeger-ui/-j默认值http://localhost:16686并最终传入前端服务的options.JaegerUI见 cmd/frontend.go由前端服务在渲染页面时拼接出指向 Jaeger UI 的查询链接。完整命令行参数速查HotROD 使用 Cobra 命令行框架全部标志定义于 cmd/flags.go。除上述-j外常用参数如下参数简写默认值说明--otel-exporter-xotlpOpenTelemetry 导出器otlp或stdout设为stdout可将 Trace 打印到控制台便于调试--fix-db-query-delay-D300ms模拟 MySQL 查询的平均延迟--fix-disable-db-conn-mutex-Mfalse禁用守护数据库连接的互斥锁该锁用于模拟大小为 1 的错误连接池引发排队现象--fix-route-worker-pool-size-W3查询 route 服务的 worker 池大小--customer-service-hostname—0.0.0.0customer 服务监听地址--driver-service-hostname—0.0.0.0driver 服务监听地址--frontend-service-hostname—0.0.0.0frontend 服务监听地址--route-service-hostname—0.0.0.0route 服务监听地址--customer-service-port-c8081customer 服务端口--driver-service-port-d8082driver 服务端口--frontend-service-port-f8080frontend 服务端口--route-service-port-r8083route 服务端口--basepath-b/前端服务的基础路径反向代理场景常用--jaeger-ui-jhttp://localhost:16686生成查找 Trace链接所用的 Jaeger UI 地址--verbose-vfalse开启 Debug 级别日志上述参数的生效过程可参考 cmd/root.go 的初始化逻辑-D、-M、-W会分别覆盖config.MySQLGetDelay、config.MySQLMutexDisabled、config.RouteWorkerPoolSize各服务主机名与端口若被修改也会记录到日志中便于确认实际监听地址。因此你可以用-D 1s -M故意放大 MySQL 延迟并保留互斥锁快速制造出明显的排队 Trace直观验证 README 中诊断请求间争用的演示效果。小结一套可复用的 OpenTelemetry 学习环境Hot R.O.D. 的价值在于它把 OpenTelemetry 的 Trace、Baggage、Metrics 与真实微服务架构结合成了一个可交互的演示系统。通过 examples/hotrod/README.md 提供的四种运行方式你可以在几分钟内搭建起完整的 Jaeger 多服务演示环境而结合本仓库源码cmd、services/config/config.go、docker-compose.yml你还能进一步理解 OTLP 上报、Baggage 传播、队列争用模拟等底层机制将其作为日常学习或内部培训的实战样板。【免费下载链接】jaegerCNCF Jaeger, a Distributed Tracing Platform项目地址: https://gitcode.com/GitHub_Trending/ja/jaeger创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考