通过OpenTelemetry Go SDK为Go应用添加自定义埋点

接入ARMS应用监控以后,ARMS探针将会对常见的Go组件进行了自动埋点,因此不需要修改任何代码,就可以实现调用链信息的采集。如果您需要在调用链信息中,体现业务方法的执行情况,可以引入OpenTelemetry Go SDK,在业务代码中增加自定义埋点。

前提条件

步骤一:导入OpenTelemetry Go SDK

main.go中添加import path。

import (
	"go.opentelemetry.io/otel"
	"go.opentelemetry.io/otel/attribute"
)

步骤二:自定义埋点

埋点示例代码如下:

for {
	tracer := otel.GetTracerProvider().Tracer("")
	ctx, span := tracer.Start(context.Background(), "Client/User defined span")
	for i := 0; i < 3; i++ {
		req, err := http.NewRequestWithContext(ctx, "GET", "http://otel-server:9000/http-service1", nil)
		if err != nil {
			fmt.Println(err.Error())
			continue
		}
		client := &http.Client{}
		resp, err := client.Do(req)
		if err != nil {
			fmt.Println(err.Error())
			continue
		}
		defer resp.Body.Close()
		b, err := io.ReadAll(resp.Body)
		if err != nil {
			fmt.Println(err.Error())
			continue
		}
		time.Sleep(time.Millisecond * 10)

	}
	span.SetAttributes(attribute.String("client", "client-with-ot"))
	span.SetAttributes(attribute.Bool("user.defined", true))
	span.End()
	time.Sleep(time.Millisecond * 10)
}
  1. for语句之前先获取Tracer。

    tracer := otel.GetTracerProvider().Tracer("")
  2. for循环开始时调用tracer.Start创建Span。

    ctx, span := tracer.Start(context.Background(), "spanName")

    如果希望这个Span是一个Root Span(例如在一个线程池中调用),代码如下:

    opts := append([]trace.SpanStartOption{}, trace.WithNewRoot())
    ctx, span := tracer.Start(ctx, "spanName", opts...)
  3. 如果需要设置标签,可以在结束时调用span.End()。

    span.SetAttributes(attribute.String("client", "client-with-ot"))
    span.SetAttributes(attribute.Bool("user.defined", true))
    span.End()

步骤三(可选):baggage透传

如果需要在请求中透传标签,可以通过OTel Baggage进行透传。

在请求代码中写入Baggage:

client := http.Client{}
mem, _ := baggage.NewMember("abc1", "abc1")
b, _ := baggage.New(mem)
ctx := baggage.ContextWithBaggage(context.Background(), b)
req, err := http.NewRequestWithContext(ctx, "GET", "http://127.0.0.1:8765/", nil)
if err != nil {
    panic(err)
}

在服务端获取Baggage:

b := baggage.FromContext(context.Background())
mem := b.Member("abc1")
fmt.Printf("%v\n", mem.Value())

步骤四:查询调用链

ARMS控制台应用监控 > 应用列表页面单击应用名称,然后单击调用链分析页签,查看自定义埋点的调用链详情。更多信息,请参见调用链分析

image

相关文档

您可以使用ARMS调用链分析的错/慢Trace分析功能,定位系统或应用产生错、慢调用的原因。更多信息,请参见通过错/慢调用链排查应用产生异常的原因