更新时间:2025-10-27 GMT+08:00
分享

Go语言接入

限制条件

使用Go 1.23及以上版本。

环境准备

  1. 安装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
  1. 环境验证,命令如下:
    go version

示例demo

以gin框架实现一个简单的掷骰子应用。

  1. 初始化项目,命令如下:
    go mod init demo
  2. 编写业务代码,内容如下:
    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!",
        })
    }
  3. 更新下载依赖,命令如下:
    go mod tidy
  4. 启动,命令如下:
    go run . &
    curl http://localhost:8080/rolldice

操作步骤

  1. 登录APM控制台
  2. 单击左侧,选择“管理与监管 > 应用性能管理 APM”,进入APM服务页面。
  3. 在左侧导航栏中选择“应用监控 > 应用列表”。
  4. 单击“接入应用”,进入接入应用页面。
  5. 选择“区域”和“应用”。单击“创建应用”,弹出“创建应用”弹窗,可以具体操作参见创建应用
  6. “接入方式”选择OpenTelemetry。
  7. “服务端语言”选择Go。
  8. 侵入式接入,相关参数与操作步骤如下。

    表1 参数说明

    参数

    说明

    是否必填

    应用名称

    应用显示的名称。一个应用代表一个逻辑单元,是一个全局概念,各个region都可以看到相同的应用信息,比如一个租户下面比较独立的功能模块可以定义为一个应用。

    必填

    组件名称

    组件名称,代表一个组件,需要使用英文字符开头。同一个应用下,组件名称不能重复。一个组件可以包含多个环境。不能重复,如果要重复,使用instanceName区分。

    必填

    环境名称

    环境名称,代表一个应用在一个地方的部署。一个应用程序根据配置不同可以部署多个环境,比如测试环境,现网环境。每个环境都在一个region部署,具有唯一的region属性。该参数可以为空,代表默认环境。

    选填

    使用otelSDK自动埋点

    1. 添加依赖并初始化自动埋点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
      }
    2. 更新下载依赖,命令如下:
      go mod tidy
    3. 运行,命令如下:
      go run . &
      curl http://localhost:8080/rolldice
    4. 在APM控制台链路追踪中查看应用的监控数据。详细操作参见指标

相关文档