首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

Go 链路追踪入门 Opentelemetry

编程知识
2024年08月15日 13:28

前言

Opentelemetry

分布式链路跟踪( Distributed Tracing )的概念最早是由 Google 提出来的,发展至今技术已经比较成熟,也是有一些协议标准可以参考。目前在 Tracing技术这块比较有影响力的是两大开源技术框架:Netflix 公司开源的 OpenTracing 和 Google 开源的 OpenCensus。两大框架都拥有比较高的开发者群体。为形成统一的技术标准,两大框架最终磨合成立了 OpenTelemetry 项目,简称 otel。otel 有链路追踪和监控告警两大块,关于监控告警,可以查看另一篇文章:Go 监控告警入门 Opentelemetry

Jaeger

Jaeger\ˈyā-gər\ 是 Uber 开源的分布式追踪系统,是支持 OpenTelemetry 的系统之一,也是 CNCF 项目。

安装 Jaeger

Jaeger 为我们准备了 Docker 镜像,我们可以很容易的安装。

docker run --rm --name jaeger \
  -p 16686:16686 \
  -p 4317:4317 \
  -p 4318:4318

截至到 2024-04-18, Jaeger 的最新版本是 1.56。

简单的介绍以下这三个端口。16686 用做 Jaeger 服务的 Web 面板,一会我们可以在浏览器中访问它;4317 和 4318 都用做上传追踪数据,不同之处在于前者是 gRPC 协议,后者是 HTTP 协议。

Jaeger 还有很多可用的端口,本篇只介绍和 otel 相关的,具体可以查看 Jaeger 官方文档哦。

安装后,在浏览器中输入 IP:16686:

看到 gopher 侦探在追踪足迹的可爱图片就代表 Jaeger 安装成功咯。

编写 Go 代码

安装依赖:

go get "go.opentelemetry.io/otel" \
  "go.opentelemetry.io/otel/exporters/stdout/stdoutmetric" \
  "go.opentelemetry.io/otel/exporters/stdout/stdouttrace" \
  "go.opentelemetry.io/otel/propagation" \
  "go.opentelemetry.io/otel/sdk/metric" \
  "go.opentelemetry.io/otel/sdk/resource" \
  "go.opentelemetry.io/otel/sdk/trace" \
  "go.opentelemetry.io/otel/semconv/v1.24.0" \
  "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"

我这里贴出 HTTP 和 gRPC 的全部代码,直接复制过去,改成自己的地址即可:

HTTP

func TestTraceHttp(t *testing.T) {
	ctx := context.Background()

	// 创建 OTLP HTTP 导出器,连接到 Jaeger
	exporter, err := otlptracehttp.New(ctx,
		otlptracehttp.WithEndpointURL("http://srv.com:4318/v1/traces"))

	if err != nil {
		log.Fatalf("创建导出器失败: %v", err)
	}

	// 创建资源
	res, err := resource.New(ctx,
		resource.WithAttributes(
			semconv.ServiceNameKey.String("otel-traces-demo-http"),
		),
	)
	if err != nil {
		log.Fatalf("创建资源失败: %v", err)
	}

	// 创建 Tracer 提供器
	tp := sdktrace.NewTracerProvider(
		sdktrace.WithBatcher(exporter),
		sdktrace.WithResource(res),
	)

	// 设置全局 Tracer 提供器
	otel.SetTracerProvider(tp)

	// 创建一个新的 trace
	tracer := otel.Tracer("example-tracer")
	ctx, span := tracer.Start(ctx, "root-span")
	// 暂停 100ms
	time.Sleep(100 * time.Millisecond)
	// 结束 span
	span.End()

	// 创建子span
	_, childSpan := tracer.Start(ctx, "child-span")
	// 暂停 50ms
	time.Sleep(50 * time.Millisecond)
	childSpan.End()

	// 确保所有的 spans 都被发送
	if err := tp.Shutdown(ctx); err != nil {
		log.Fatalf("关闭 Tracer 提供器失败: %v", err)
	}
}

gRPC

func TestTraceGrpc(t *testing.T) {
	ctx := context.Background()

	// 创建 OTLP gRPC 导出器,连接到 Jaeger
	exporter, err := otlptracegrpc.New(ctx,
		otlptracegrpc.WithEndpoint("srv.com:4317"),
		otlptracegrpc.WithInsecure(),
	)

	if err != nil {
		log.Fatalf("创建导出器失败: %v", err)
	}

	// 创建资源
	res, err := resource.New(ctx,
		resource.WithAttributes(
			semconv.ServiceNameKey.String("otel-traces-demo-grpc"),
		),
	)
	if err != nil {
		log.Fatalf("创建资源失败: %v", err)
	}

	// 创建 Tracer 提供器
	tp := sdktrace.NewTracerProvider(
		sdktrace.WithBatcher(exporter),
		sdktrace.WithResource(res),
	)

	// 设置全局 Tracer 提供器
	otel.SetTracerProvider(tp)

	// 创建一个新的 trace
	tracer := otel.Tracer("example-tracer")
	ctx, span := tracer.Start(ctx, "root-span")
	// 暂停 100ms
	time.Sleep(100 * time.Millisecond)
	// 结束 span
	span.End()

	// 创建子span
	_, childSpan := tracer.Start(ctx, "child-span")
	// 暂停 50ms
	time.Sleep(50 * time.Millisecond)
	childSpan.End()

	// 确保所有的 spans 都被发送
	if err := tp.Shutdown(ctx); err != nil {
		log.Fatalf("关闭 Tracer 提供器失败: %v", err)
	}
}

效果

执行后,在面板中即可看到我们上传的数据。

 

可以看到我们的两个 span 已经上传到 Jaeger 中了,就是如此的简单!文中的代码开源在 Github

From:https://www.cnblogs.com/oldme/p/18360836
本文地址: http://shuzixingkong.net/article/1127
0评论
提交 加载更多评论
其他文章 你要了解的2种AI思维链
我们使用的AI助手,一般是经过了预训练和微调这2个步骤,尽管训练出的模型能回答许多通用类问题,但是在遇到复杂问题时还是束手无策。
你要了解的2种AI思维链 你要了解的2种AI思维链 你要了解的2种AI思维链
高性能无锁队列 Disruptor 核心原理分析及其在i主题业务中的应用
本文首先介绍了Disruptor高性能内存队列的基本概念、使用Demo、高性能原理及源码分析,最后通过两个例子介绍了Disruptor在i主题业务中的应用。
高性能无锁队列 Disruptor 核心原理分析及其在i主题业务中的应用 高性能无锁队列 Disruptor 核心原理分析及其在i主题业务中的应用 高性能无锁队列 Disruptor 核心原理分析及其在i主题业务中的应用
apisix-dashboard上添加自定义插件
参考:https://overstarry.vip/posts/apisix如何添加自定义插件/ 首先,我们需要向自定义的插件user-remote-auth添加到apisix中,对这块不清楚的同学,可以参考我这篇文章:【apisix~lua插件开发与插件注册】,添加成功之后,通过curl http
apisix-dashboard上添加自定义插件 apisix-dashboard上添加自定义插件 apisix-dashboard上添加自定义插件
恶补基础知识:Java 栈与队列详解
@目录前言简介栈Java实现栈的示例代码:栈的主要应用场景包括:队列Java实现队列的示例代码:LinkedList中的add方法和offer方法的区别队列主要应用场景:总结 前言 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i、 提示:以下是本篇文章正文内容,下面案例可供参考 简介 使用
React 高德地图 进京证 路线规划 问题小记
一、加载问题 用高德地图做了个进京证路线规划的功能,官网也是有 React 代码示例。但是吧,这个Demo有问题,地图是能加载成功,但是其他功能再用 map 这个变量肯定不行,果不其然是null,处理也简单,把公共变量都管理起来就行了。 const [map, setMap] = useState(
React 高德地图 进京证 路线规划 问题小记 React 高德地图 进京证 路线规划 问题小记
38k Star!颠覆传统BI,Metabase新一代智能数据分析工具
Metabase 是一个开源的商业智能(BI)工具,帮助用户轻松地从数据库中提取数据,并将其转化为易于理解的图表和仪表板。与传统的 BI 工具相比,Metabase 不需要用户具备编写 SQL 的能力,非技术人员也能通过简单的操作创建有用的报告和可视化数据分析。 Metabase主要特性 部署便捷:
38k Star!颠覆传统BI,Metabase新一代智能数据分析工具 38k Star!颠覆传统BI,Metabase新一代智能数据分析工具 38k Star!颠覆传统BI,Metabase新一代智能数据分析工具
OSI 七层网络模型和 TCP/IP 四层网络模型
OSI 七层网络模型 网络的七层架构从下到上主要分为:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层 物理层主要定义物理设备标准,它的主要作用是传输比特流,具体做法是在发送端将 1、0 码转化为电流强弱来进行传输,在到达目的地后再将电流根据强弱转化为 1、0 码,也就是我们常说的模数转换
面试官:JDK中都用了哪些设计模式?
设计模式是前辈们经过实践验证总结的解决方案,帮助我们构建出更具可维护性、可扩展性和可读性的代码。当然,在面试的过程中,也会或多或少的被问到。那么今天,我们就来看一道设计模式中的常见面试问题:JDK 中都用了哪些设计模式? 我按照大家比较熟悉且好理解的方式,把 JDK 中使用的设计模式总结了一下,如下
面试官:JDK中都用了哪些设计模式? 面试官:JDK中都用了哪些设计模式? 面试官:JDK中都用了哪些设计模式?