更新时间:2026-01-21 GMT+08:00
分享

通过OpenTelemetry Go接入APM

华为云APM兼容OpenTelemetry协议,支持直接接收通过OpenTelemetry SDK或Agent上报的链路追踪数据。本文将介绍如何通过OpenTelemetry Java Go实现通过链路数据对接到APM。

限制条件

使用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

使用otelSDK通过GRPC协议上报

  1. 使用otelSDK自动埋点。
  2. 添加依赖并初始化自动埋点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
    }

  3. 更新下载依赖,命令如下:

    go mod tidy

  4. 运行,命令如下:

    go run . &
    curl http://localhost:8080/rolldice

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

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

相关文档