使用Gin中间件时Azure Application Insight性能菜单操作名称为空
问题原因
Azure Application Insights的OPERATION NAME字段对应Go SDK请求遥测的Name属性以及遥测上下文的Operation.Name属性,你当前的实现存在两处遗漏:
- 调用
NewRequestTelemetry时第一个入参仅传入了HTTP方法,没有传入可聚合的操作标识,且部分版本的SDK不会自动将请求名称同步到操作上下文 - 使用原始请求URI作为标识会导致带路径参数的请求无法聚合,无法生成统一的操作名称
修复步骤
1. 调整中间件逻辑,生成正确的操作名称
使用Gin提供的c.FullPath()获取路由模板,和HTTP方法拼接为标准的操作名称格式[METHOD] [ROUTE_TEMPLATE],同时显式赋值操作上下文的名称字段,避免SDK版本兼容问题。
2. 修改后的中间件核心代码
import "fmt" // 按需导入fmt包用于拼接操作名称 func InsightsWithConfig(config *InsightsConfig) gin.HandlerFunc { client := createTelemetryClient(config) return func(c *gin.Context) { url := c.Request.RequestURI start := time.Now() c.Next() end := time.Now() duration := end.Sub(start) clientIP := c.ClientIP() method := c.Request.Method statusCode := c.Writer.Status() userAgent := c.Request.UserAgent() bodySize := c.Writer.Size() // 新增:获取路由模板构造操作名称,无匹配路由时 fallback 到原始URI routePath := c.FullPath() if routePath == "" { routePath = url } operationName := fmt.Sprintf("%s %s", method, routePath) // 修改:第一个参数传入构造好的操作名称 telemetry := appinsights.NewRequestTelemetry(operationName, url, duration, strconv.Itoa(statusCode)) // 新增:显式赋值操作上下文名称,兼容不同SDK版本 telemetry.Context.Operation.Name = operationName telemetry.Timestamp = end telemetry.MarkTime(start, end) telemetry.Source = clientIP telemetry.Success = statusCode >= 200 && statusCode < 400 telemetry.Properties["user-agent"] = userAgent telemetry.Measurements["body-size"] = float64(bodySize) client.Track(telemetry) } }
验证
修改上线后等待3-5分钟数据同步,即可在Performance菜单看到格式为GET /api/xxx/:id的操作名称,同路由模板的请求会自动聚合。
内容的提问来源于stack exchange,提问作者Probal
相关产品推荐
相关产品推荐

