全部產品
Search
文件中心

Application Real-Time Monitoring Service:通過OpenTelemetry Go SDK為Go應用添加自訂埋點

更新時間:Jul 19, 2025

接入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分析功能,定位系統或應用產生錯、慢調用的原因。更多資訊,請參見通過錯/慢調用鏈排查應用產生異常的原因