通过OpenTelemetry Go接入APM
华为云APM兼容OpenTelemetry协议,支持直接接收通过OpenTelemetry SDK或Agent上报的链路追踪数据。本文将介绍如何通过OpenTelemetry Java Go实现通过链路数据对接到APM。
限制条件
使用Go 1.23及以上版本。
环境准备
- 安装Go,命令如下:
wget https://mirrors.aliyun.com/golang/go1.23.1.linux-amd64.tar.gz tar -C /usr/local -xzf go1.23.1.linux-amd64.tar.gz echo 'export PATH=$PATH:/usr/local/go/bin' >> /etc/profile source /etc/profile
- 环境验证,命令如下:
go version
示例demo
以gin框架实现一个简单的掷骰子应用。
- 初始化项目,命令如下:
go mod init demo
- 编写业务代码,内容如下:
package main import ( "log" "math/rand" "github.com/gin-gonic/gin" ) func main() { // Routes r := gin.Default() r.GET("/rolldice", rolldice) // Run the server log.Println("Server starting on :8080...") r.Run(":8080") } func rolldice(c *gin.Context) { c.JSON(200, gin.H{ "roll": rand.Intn(6) + 1, "message": "Dice rolled!", }) } - 更新下载依赖,命令如下:
go mod tidy
- 启动,命令如下:
go run . & curl http://localhost:8080/rolldice
使用otelSDK通过GRPC协议上报
- 使用otelSDK自动埋点。
- 添加依赖并初始化自动埋点SDK,内容如下:
package main import ( "log" "math/rand" "github.com/gin-gonic/gin" "context" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" "go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin" ) var ( SERVICE_NAME = "应用.组件.环境" APM_ENDPOINT = "上报地址" APM_TOKEN = "鉴权信息" ) func main() { cleanup := initTracer() defer cleanup(context.Background()) // Routes r := gin.Default() //automatic instrumentation r.Use(otelgin.Middleware(SERVICE_NAME)) r.GET("/rolldice", rolldice) // Run the server log.Println("Server starting on :8080...") r.Run(":8080") } func rolldice(c *gin.Context) { c.JSON(200, gin.H{ "roll": rand.Intn(6) + 1, "message": "Dice rolled!", }) } func initTracer() func(context.Context) error { headers := map[string]string{"Authentication": APM_TOKEN} exporter, err := otlptracegrpc.New( context.Background(), otlptracegrpc.WithInsecure(), otlptracegrpc.WithEndpoint(APM_ENDPOINT), otlptracegrpc.WithHeaders(headers), ) if err != nil { log.Fatalf("Failed to create exporter: %v", err) } resources, err := resource.New( context.Background(), resource.WithAttributes( attribute.String("service.name", SERVICE_NAME), attribute.String("library.language", "go"), ), ) if err != nil { log.Fatalf("Could not set resources: %v", err) } otel.SetTracerProvider( sdktrace.NewTracerProvider( sdktrace.WithSampler(sdktrace.AlwaysSample()), sdktrace.WithBatcher(exporter), sdktrace.WithResource(resources), ), ) return exporter.Shutdown } - 更新下载依赖,命令如下:
go mod tidy
- 运行,命令如下:
go run . & curl http://localhost:8080/rolldice

- 登录APM控制台。
- 单击左侧
,选择“管理与监管> 应用性能管理 APM”,进入APM服务页面。 - 在左侧导航栏选择“链路追踪 > 指标”。
- 在界面左侧树单击环境,单击“接口调用”,切换至接口调用页签,在接口调用页签可以查看接口调用的数据。

- 在左侧导航栏选择“链路追踪 > 调用链”,查看调用链信息。
