
# 使用OpenTelemetry上报Go应用数据
华为云APM兼容OpenTelemetry协议，支持直接接收通过OpenTelemetry SDK或Agent上报的链路追踪数据。本文介绍如何使用OpenTelemetry方式，将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
   ```
   ![](https://support.huaweicloud.com/bestpractice-apm2/zh-cn_image_0000002511796230.png "点击放大")
   
   
5. 登录[APM控制台](https://auth.huaweicloud.com/authui/login.html?service=https://console.huaweicloud.com/console/#/login)。
6. 单击左侧![](https://support.huaweicloud.com/bestpractice-apm2/zh-cn_image_0000001542238060.png)，选择"管理与监管\> 应用性能管理 APM"，进入APM服务页面。
7. 在左侧导航栏选择"链路追踪 \> 指标"。
8. 在界面左侧树单击环境，单击"接口调用"，切换至接口调用页签，在接口调用页签可以查看接口调用的数据。 
   ![](https://support.huaweicloud.com/bestpractice-apm2/zh-cn_image_0000002543356159.png "点击放大")
   
   
9. 在左侧导航栏选择"链路追踪 \> 调用链"，查看调用链信息。 
   ![](https://support.huaweicloud.com/bestpractice-apm2/zh-cn_image_0000002543396159.png "点击放大")
   
   
 
