【go-micro实践】jaeger分布式链路追踪

从LoadRunner到JMeter:性能测试核心原理与现代化实践指南 性能测试是保障软件系统稳定性和用户体验的关键工程实践,其核心在于模拟真实用户负载,评估系统在高并发下的处理能力、响应时间和资源消耗。其基本原理是通过虚拟用户(VUsers)模拟并发请求,对服务器施加压力,并收集各层级的性能数据进行分析。这项技术的核心价值在于,它能在系统上线前主动发现瓶颈,为容量规划、架构优化和成本控制提供数据支撑,广泛应用于电商、金融、社交等高并发业务场景。随着技术架构演进至微服务与云原生时代,性能测试的工具与实践也发生了深刻变革。以LoadRunner为代表的古典企业级工具,以其严谨的脚 阅读详情

github完整代码地址
个人博客

安装jaeger

jaeger提供一个all in one 的docker镜像,可以快速搭建实验环境

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 9411:9411 
jaegertracing/all-in-one:1.6

OpenTracing

OpenTracing通过提供平台无关、厂商无关的API,使得开发人员能够方便的添加(或更换)追踪系统的实现。 OpenTracing提供了用于运营支撑系统的和针对特定平台的辅助程序库。
jaeger兼容OpenTracing API,所以我们使用OpenTracing的程序库可以方便的替换追踪工具。
OpenTracing中文文档

jaeger使用

封住一下jaeger的初始化操作方便使用,详细用法可以查看 jaeger-client-go

// lib/tracer

// NewTracer 创建一个jaeger Tracer
func NewTracer(servicename string, addr string) (opentracing.Tracer, io.Closer, error) {
	cfg := jaegercfg.Configuration{
		ServiceName: servicename,
		Sampler: &jaegercfg.SamplerConfig{
			Type:  jaeger.SamplerTypeConst,
			Param: 1,
		},
		Reporter: &jaegercfg.ReporterConfig{
			LogSpans:            true,
			BufferFlushInterval: 1 * time.Second,
		},
	}

	sender, err := jaeger.NewUDPTransport(addr, 0)
	if err != nil {
		return nil, nil, err
	}

	reporter := jaeger.NewRemoteReporter(sender)
	// Initialize tracer with a logger and a metrics factory
	tracer, closer, err := cfg.NewTracer(
		jaegercfg.Reporter(reporter),
	)

	return tracer, closer, err
}

func main() {
t, io, err := tracer.NewTracer("tracer", "")
	if err != nil {
		log.Fatal(err)
	}
	defer io.Close()
	opentracing.SetGlobalTracer(t)
}

opentracing.SetGlobalTracer(t) 方法执行会将jaeger tracer注册到全局,接下来只需要使用opentracing 的标准API便可以了。
如果不想使用jaeger了,想替换成其他分布式追踪工具,只需要工具支持opentracing标准,并将main函数的SetGlobalTracer操作替换即可,其他文件都不需要更改。

micro链路追踪插件

micro自带的opentracing插件

在micro自带的插件中已经有opentracing的插件了,包含server,client等,不过这个插件只能go-micro构建的微服务(api,srv)中使用。因为micro网关有一个独立的插件系统,但是并没有提供opentracing相关的插件。

micro/go-plugins/wrapper/trace/opentracing/opentracing.go

我们可以在构建服务的时候直接使用,只需要在服务初始化时增加一行函数就可以了。

service := micro.NewService(
		micro.Name(name),
		micro.Version("latest"),
		micro.WrapHandler(ocplugin.NewHandlerWrapper(opentracing.GlobalTracer())),
	)

srv/user/main.go 目录下的user 服务是一个完整的使用实例。

为micro网关增加opentracing插件

实现原理

在这里插入图片描述
外部HTTP请求首先经过API网关,网关生成第一个SpanContexts并且通过HTTP头传递到聚合层的API服务,这边需要我们实现一个插件去做这件事,原理很简单,拦截每一次请求添加信息就可以了。
查看micro自带的opentracing插件,可以发现是通过golang的context传递,micro的RPC已经封装好了通过context在跨进程服务间传递SpanContexts机制,所以我们需要在API服务层实现一个插件,从HTTP头中取出SpanContexts并按照micro自带的方式注入golang context。

// micro opentracing插件中wHandlerWrappe
// NewHandlerWrapper accepts an opentracing Tracer and returns a Handler Wrapper
func NewHandlerWrapper(ot opentracing.Tracer) server.HandlerWrapper {
	return func(h server.HandlerFunc) server.HandlerFunc {
		return func(ctx context.Context, req server.Request, rsp interface{}) error {
			name := fmt.Sprintf("%s.%s", req.Service(), req.Endpoint())
			ctx, span, err := traceIntoContext(ctx, ot, name)
			if err != nil {
				return err
			}
			defer span.Finish()
			return h(ctx, req, rsp)
		}
	}
}

micro API网关插件

lib/wrapper/tracer/opentracing/stdhttp/stdhttp.go

和实现JWT鉴权插件一样,实现一个HTTP中间件通过mciro的插件机制全局注册就可以实现拦截每次请求并处理。

// TracerWrapper tracer wrapper
func TracerWrapper(h http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		spanCtx, _ := opentracing.GlobalTracer().Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(r.Header))
		sp := opentracing.GlobalTracer().StartSpan(r.URL.Path, opentracing.ChildOf(spanCtx))
		defer sp.Finish()

		if err := opentracing.GlobalTracer().Inject(
			sp.Context(),
			opentracing.HTTPHeaders,
			opentracing.HTTPHeadersCarrier(r.Header)); err != nil {
			log.Println(err)
		}

		sct := &status_code.StatusCodeTracker{ResponseWriter: w, Status: http.StatusOK}
		h.ServeHTTP(sct.WrappedResponseWriter(), r)

		ext.HTTPMethod.Set(sp, r.Method)
		ext.HTTPUrl.Set(sp, r.URL.EscapedPath())
		ext.HTTPStatusCode.Set(sp, uint16(sct.Status))
		if sct.Status >= http.StatusInternalServerError {
			ext.Error.Set(sp, true)
		}
	})
}

Tracer相关的概念可以查看这个文档

  1. opentracing.GlobalTracer().Extract 方法提取HTTP头中的spanContexts
  2. opentracing.ChildOf 方法基于提取出来的spanContexts生成新的child spanContexts
  3. opentracing.GlobalTracer().StartSpan 方法生成一个新的span
  4. github.com/opentracing/opentracing-go/ext 通过ext可以为追踪添加一些tag来展示更多信息,比如URL,请求类型(GET,POST…), 返回码
  5. sp.Finish() 结束这一个span

API服务(使用gin)插件

lib/wrapper/tracer/opentracing/gin2micro/gin2micro.go

// TracerWrapper tracer 中间件
func TracerWrapper(c *gin.Context) {
	md := make(map[string]string)
	spanCtx, _ := opentracing.GlobalTracer().Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(c.Request.Header))
	sp := opentracing.GlobalTracer().StartSpan(c.Request.URL.Path, opentracing.ChildOf(spanCtx))
	defer sp.Finish()

	if err := opentracing.GlobalTracer().Inject(sp.Context(),
		opentracing.TextMap,
		opentracing.TextMapCarrier(md)); err != nil {
		log.Log(err)
	}

	ctx := context.TODO()
	ctx = opentracing.ContextWithSpan(ctx, sp)
	ctx = metadata.NewContext(ctx, md)
	c.Set(contextTracerKey, ctx)

	c.Next()

	statusCode := c.Writer.Status()
	ext.HTTPStatusCode.Set(sp, uint16(statusCode))
	ext.HTTPMethod.Set(sp, c.Request.Method)
	ext.HTTPUrl.Set(sp, c.Request.URL.EscapedPath())
	if statusCode >= http.StatusInternalServerError {
		ext.Error.Set(sp, true)
	}
}

// ContextWithSpan 返回context
func ContextWithSpan(c *gin.Context) (ctx context.Context, ok bool) {
	v, exist := c.Get(contextTracerKey)
	if exist == false {
		ok = false
		return
	}

	ctx, ok = v.(context.Context)
	return
}

基本操作流程和给micro编写的插件相同,但是有两点不同。其一,因为我使用gin开发API服务,所以基于gin的API。其二,因为micro内部提供通过golang context传递spanContexts的机制,所以将这边会将child spanContexts注入到gin 的context,在API服务通过micro提供RPC接口(生成的XX.micro.go文件中调用函数第一个参数都是context)调用其他服务时传入提取的context,如下:

...
ctx, ok := gin2micro.ContextWithSpan(c)
	if ok == false {
		log.Log("get context err")
	}

	res, err := s.helloC.Call(ctx, &helloS.Request{Name: "xuxu"})
...

完整的实现细节可以查看,github仓库中 lib/wrapper/tracer/opentracing, 这里。

完整体验

在这里插入图片描述

在这里插入图片描述
项目完整代码地址

FDE前沿部署工程师:100个实战项目构建硬核作品集指南 容器化与云原生技术是现代软件部署和运维的基石,其核心在于通过Docker等容器技术实现应用的环境标准化与隔离,并借助Kubernetes等编排系统实现自动化部署、扩展和管理。这项技术的核心价值在于提升了应用交付的效率、可靠性和可移植性,是支撑微服务架构、持续集成与持续部署(CI/CD)的关键。在实际工程实践中,这些技术被广泛应用于构建自动化流水线、实现系统的可观测性以及保障生产环境的安全与合规。对于希望提升竞争力的部署工程师而言,掌握从基础设施即代码(IaC)、服务网格到AI/MLOps部署等全链路技能至关 阅读详情

相关推荐

前端与后端开发:从职责边界到技术栈的深度解析

在软件开发领域,前端与后端是构建现代应用的两大核心支柱。前端开发聚焦于用户界面与交互体验,负责将数据与业务逻辑以直观、流畅的方式呈现给用户,其技术栈围绕HTML、CSS、JavaScript及React、Vue等框架展开,核心挑战在于状态管理、性能优化与跨端兼容。后端开发则专注于服务器端的业务逻辑处理、数据存储与系统安全,确保服务的稳定、高效与可靠,涉及数据库设计、API构建、并发处理及微服务架构等技术。理解两者的根本区别——前端作为用户体验的塑造者,后端作为业务逻辑与数据的守护者——对于技术选型、团队协作

weixin_34037173的博客 301

Go - 实现项目内链路追踪

为什么项目内需要链路追踪?当一个请求中,请求了多个服务单元,如果请求出现了错误或异常,很难去定位是哪个服务出了问题,这时就需要链路追踪。这个图画的比较简单,从图中可以清晰的看出他们之间的...

新亮笔记 1020

CTFshow-pwn入门-前置基础pwn32-pwn34

CTFshow-pwn入门-前置基础pwn32-pwn34

你们de4月天的博客 1133

全链路追踪 jaeger

Jaeger是Uber开发并开源的一款分布式追踪系统,兼容分布式跟踪信息传递分布式事务监控问题分析服务依赖性分析性能优化。

张三李四王五老六 2477

YonSuite如何新增用户并分配角色角色授权图文教程

用友YonSuite产品基础教学

ct341688的博客 622

穿透鼠标实现后台点击,适用于任何窗口!【后台鼠标】【风雪】

也许你就是被这标题吸引来的,呵呵!好久没发帖了,勾引一下大家的胃口,当然有的人已经猜出原理了!既然来了,都要把原理学回家,不然就没意思了!很多游戏现在都不支持后台消息鼠标,要实现真的不是简单的,什么注入dll啊,什么hook俺也学不懂,那就简简单单另辟蹊径了下面来讲讲原理吧(下面的玩玩可以,用于实际不现实,俺也不藏了,看到这么多人回复,良心过意不去,呵呵)首先,将要点击的窗口上面覆盖的所有窗...

weixin_34129145的博客 1万+

Go项目(链路追踪)

使用 jaeger 和 otgrpc 完成链路追踪

Roy的博客 1252

《Scratch图形化等级考试(1~4级)历届真题解析》专栏总目录

❤️ 专栏名称:《🌸 专栏介绍:中国电子学会《全国青少年软件编程等级考试》Scratch图形化等级考试(1~4级)历届真题解析。🚀 订阅专栏:原价 99.9,🔥 火爆订阅中 🔥,限时 19.9。订阅后可阅读专栏内所有文章,本专栏持续更新中,欢迎订阅!

人生就是一个不断学习的过程 1万+

【链路追踪】Jaeger基于go的「Gin」「gRPC」进行链路追踪

【链路追踪】jaeger - 基于go的gin和grpc进行追踪

Jzin的博客 3352

Node-RED系列(二二):使用dashboard搭配echarts制作漂亮的面板

在node-red中dashboard 是一个很常用的模块,其中它有一个chart节点可以用来制作一些图表,比如柱状图,折线图,饼图,但其中的图表并不是很美观,而且可配置项非常的少。 于是就有很多小伙伴找我做一套比较好看的图表面板,在对比了一下几个图表库,我选中了echarts。 不仅美观大方,而且非常容易集成,配置。下面先来看一下我做的效果。这里是直接做了四个折线图,第一个折线图有动态效果,第二个折线图是一个多线条的折线图,第三个折线图是在一个图例显示两个折线图。第二第三都可以用于数据对比。 第四个折线

知无涯 1万+

yolov5 FPGA实现及verilog代码仿真

本文介绍了一种基于FPGA的卷积神经网络加速器设计,采用混合架构实现网络功能。该系统将训练和图像预处理等复杂计算保留在PC端执行,仅将主干网络部署在FPGA上。由于片上资源限制,建议通过外接DDR存储扩展容量。文章提供了完整的Verilog HDL源码,包括卷积单元(convUnit)、卷积层(convLayerSingle)和处理单元(processingElement)等核心模块,均已通过仿真验证。该设计采用流水线结构,使用浮点运算单元实现卷积计算,支持32x32图像输入和5x5卷积核处理。系统架构图中

QQ_778132974的博客 577

GoLang实现基于Jaeger的分布式链路追踪

package trace import ( "net/http" "net/url" "time" "why/log" "github.com/gin-gonic/gin" opentracing "github.com/opentracing/opentracing-go" "github.com/opentracing/opentracing-go/ext" ) con...

程序猿的世界 4644

【Python爬虫教程】第3篇-解决使用reqeusts遇到的ProxyError异常

Python request代理错误提示“HTTPSConnectionPool, Cannot connect to proxy, no such file or directory”

分享技术,记录思考和感悟 1509

go 链路追踪_【go-micro实践】jaeger分布式链路追踪

安装jaegerjaeger提供一个all in one 的docker镜像,可以快速搭建实验环境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...

weixin_29343187的博客 621

7.3 空间矢量调制(SVM)整数算法

本文提出了一种基于整数运算的空间矢量调制(SVM)优化实现方案,适用于计算资源有限的Cortex-M0平台。针对传统SVM算法中复杂的三角函数和浮点运算问题,重点优化了扇区判断和占空比计算两个关键环节。在扇区判断方面,采用基于电压分量符号和相对大小的三变量法,避免了角度计算;在占空比计算方面,通过几何关系将作用时间表示为电压分量的线性组合,并采用定点数实现。方案还详细讨论了系数定点化、死区补偿等实现细节,在保证精度的同时显著降低了计算复杂度。实验结果表明,优化后的整数算法在M0平台上仅需50-80个周期即可

技术工作者 944

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

go-micro V2 从零开始(八)集成链路追踪工具jaeger

本文相关代码:gitee 文章目录前言步骤一、hystrix-go二、API网关2.1 创建目录2.2 编辑main.go 前言 这一章我们演示如何在网关中集成熔断器器Hystrix。 步骤 一、hystrix-go hystrix是一个容错库,旨在隔离指向远程系统,服务和第三方库的请求,杜绝级联故障,并在复杂的分布式系统中实现弹性,毕竟在分布式系统中,故障是不可避免的。 此项目脱胎于由Netflix开源的同名java项目。https://github.com/Netflix/Hystrix Hystr

hotcoffie的博客 1112

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

go-micro项目实战四 链路追踪

链路追踪 微服务架构下,所有的服务都分散在不同的地方,一旦某个服务出现问题,排查起来很费时费力。所以在微服务的演进下,需要一个全链路追踪系统来分析服务的运行状态。 go-micro的trace插件 Micro通过Wrapper实现了三种trace接口,aswxray,opencensus,opentracing。第一个是亚马逊AWS的。没有尝试。 opentracing是一个开源的标准。提供对厂商...

一个不靠谱的程序员 6055

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

(16)go-micro微服务jaeger链路追踪

分布式链路追踪就是将一次分布式请求还原成调用链路,将一次分布式请求的调用情况集中展示,比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等至此,go-micro微服务jaeger链路追踪开发工作就正式完成。接下来就开始Prometheus监控的代码编写了,希望大家关注博主和关注专栏,第一时间获取最新内容,每篇博客都干货满满。欢迎大家加入夏沫の梦的学习交流进行学习交流经验,点击。

夏沫の梦的博客 1351

[RPC/HTTP][链路追踪]Jaeger Micro2 Gin RPC、HTTP链路追踪

在RPC通信中,由于是分布式微服务,所以说接口之间的调用可能会变得复杂,链路之间的追踪、查看接口的健康状态,什么接口有问题,什么接口实现的时间长,这都是非常有必要观测的,链路追踪的图形化界面非常直观,这里我们就介绍一下如何使用Jaeger实现追踪过程。

XiAoRayL的博客 840

go 链路追踪_go-micro V2 从零开始(八)集成链路追踪工具jaeger

本文相关代码:gitee前言这一章我们继续使用go-plugins库中插件,以Wrapper方式集成链路追踪工具jaeger。步骤一、jaeger1.1 简介Jaeger是一个GO语言开发的微服务链路追踪工具,用于分布式系统监控和故障排除,他的主要特性包括:分布式上下文传播 分布式事务监控 根本原因分析服务依赖关系分析 性能/延迟优化以上内容翻译自jaeger官方文档,更多内容请查阅官网:Jaeg...

weixin_32166921的博客 443

go 链路追踪_go-micro项目实战四 链路追踪-Go语言中文社区

链路追踪微服务架构下,所有的服务都分散在不同的地方,一旦某个服务出现问题,排查起来很费时费力。所以在微服务的演进下,需要一个全链路追踪系统来分析服务的运行状态。go-micro的trace插件Micro通过Wrapper实现了三种trace接口,aswxray,opencensus,opentracing。第一个是亚马逊AWS的。没有尝试。opentracing是一个开源的标准。提供对厂商中立的 ...

weixin_39906114的博客 452

2026 后端开发必知:微服务架构实战指南 - 从单体到云原生

本文从实战角度讲解微服务架构迁移:对比单体与微服务架构,介绍服务拆分原则、技术栈选型(Spring Cloud/Nacos/Gateway)、服务通信方式、Docker/K8s容器化、监控运维方案,并分享迁移步骤与最佳实践,助你平滑演进到云原生架构。

xswlw_guoquanbao的博客 219

NanoClaw架构设计:微服务粒度划分与高效协同的工程实践

微服务架构通过将单体应用拆分为独立部署、松耦合的服务,解决了系统扩展性和技术异构性问题。其核心原理在于服务边界的清晰定义和高效的通信机制,旨在提升开发效率与系统韧性。在云原生背景下,服务粒度的合理划分成为平衡开发敏捷性与运维复杂度的关键。NanoClaw架构模式正是聚焦于此,它倡导以‘纳米级’服务实现高内聚,并通过精心设计的同步RPC与异步事件驱动机制,构建灵活可靠的‘爪牙式’协同。这种设计特别适用于物联网平台、实时交易引擎等高要求场景,能有效应对分布式事务与性能瓶颈等挑战。

weixin_30314813的博客 354

云服务基准测试进阶:基于智能体与二重奏插桩的深度性能洞察

在云原生架构中,基准测试是评估服务性能、成本与可靠性的核心手段。其基本原理是通过模拟负载,测量系统的响应时间、吞吐量和资源利用率等关键指标,从而为技术选型与容量规划提供数据支撑。传统基准测试方法常面临挑战,尤其在动态复杂的云环境下,宏观聚合指标难以揭示由垃圾回收、网络微突发等瞬时事件引发的性能抖动,导致归因困难。为此,融合了智能体驱动与协同观测理念的‘二重奏式插桩’技术应运而生。该方法通过部署工作负载智能体与服务可观测性智能体,实现请求标记、高频率指标抓取与分布式链路追踪的协同,将性能数据的灵敏度提升至微观

weixin_30765577的博客 398
上一篇: 【go-micro实践】micro API 网关增加JWT鉴权功能
下一篇: 【go-micro实践】hystrix熔断及dashboard展示
惜朝_
博客等级 码龄10年 9粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值