接入ARMS应用监控以后,ARMS探针将会对常见的Go组件进行了自动埋点,因此不需要修改任何代码,就可以实现调用链信息的采集。如果您需要在调用链信息中,体现业务方法的执行情况,可以引入OpenTelemetry Go SDK,在业务代码中增加自定义埋点。
前提条件
已为应用安装Golang探针。具体操作,请参见手动安装Golang探针。
步骤一:导入OpenTelemetry Go SDK
在main.go中添加import path。
import ( "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/sdk/trace" )
在main.go中初始化Trace Provider。
func init() { tp := trace.NewTracerProvider() otel.SetTracerProvider(tp) }
步骤二:自定义埋点
埋点示例代码如下:
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)
}
在for语句之前先获取Tracer。
tracer := otel.GetTracerProvider().Tracer("")
在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...)
如果需要设置标签,可以在结束时调用span.End()。
span.SetAttributes(attribute.String("client", "client-with-ot")) span.SetAttributes(attribute.Bool("user.defined", true)) span.End()
步骤三:查询调用链
相关文档
您可以使用ARMS调用链分析的错/慢Trace分析功能,定位系统或应用产生错、慢调用的原因。更多信息,请参见通过错/慢调用链排查应用产生异常的原因。
文档内容是否对您有帮助?