Go语言接入
限制条件
使用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
操作步骤
- 登录APM控制台。
- 单击左侧
,选择“管理与监管 > 应用性能管理 APM”,进入APM服务页面。 - 在左侧导航栏中选择“应用监控 > 应用列表”。
- 单击“接入应用”,进入接入应用页面。
- 选择“区域”和“应用”。单击“创建应用”,弹出“创建应用”弹窗,可以具体操作参见创建应用。
- “接入方式”选择OpenTelemetry。
- “服务端语言”选择Go。
- 侵入式接入,相关参数与操作步骤如下。
表1 参数说明 参数
说明
是否必填
应用名称
应用显示的名称。一个应用代表一个逻辑单元,是一个全局概念,各个region都可以看到相同的应用信息,比如一个租户下面比较独立的功能模块可以定义为一个应用。
必填
组件名称
组件名称,代表一个组件,需要使用英文字符开头。同一个应用下,组件名称不能重复。一个组件可以包含多个环境。不能重复,如果要重复,使用instanceName区分。
必填
环境名称
环境名称,代表一个应用在一个地方的部署。一个应用程序根据配置不同可以部署多个环境,比如测试环境,现网环境。每个环境都在一个region部署,具有唯一的region属性。该参数可以为空,代表默认环境。
选填
使用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 = "<endpoint:4317>" APM_TOKEN = "<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控制台链路追踪中查看应用的监控数据。详细操作参见指标。
- 添加依赖并初始化自动埋点SDK,内容如下: