优化jaeger代码,使用otlp规范

This commit is contained in:
2025-11-26 10:38:15 +08:00
parent cf65e0383c
commit 15a5311288
2 changed files with 17 additions and 35 deletions

View File

@@ -4,6 +4,7 @@ import (
"context" "context"
"errors" "errors"
"fmt" "fmt"
_ "gitee.com/red-future---jilin-g/common/consul"
"gitee.com/red-future---jilin-g/common/jaeger" "gitee.com/red-future---jilin-g/common/jaeger"
"gitee.com/red-future---jilin-g/common/utils" "gitee.com/red-future---jilin-g/common/utils"
"github.com/gogf/gf/contrib/registry/consul/v2" "github.com/gogf/gf/contrib/registry/consul/v2"
@@ -31,16 +32,16 @@ type Page struct {
Total int //总页数 Total int //总页数
} }
var HttpServer = g.Server() var Httpserver = g.Server()
func init() { func init() {
//s.Use(common.Cors) //中间件验证 //s.Use(common.Cors) //中间件验证
//s.EnablePProf() //启用性能分析 //s.EnablePProf() //启用性能分析
HttpServer.SetOpenApiPath("/api.json") Httpserver.SetOpenApiPath("/api.json")
HttpServer.SetSwaggerPath("/swagger") //api文档访问路径 Httpserver.SetSwaggerPath("/swagger") //api文档访问路径
HttpServer.SetDumpRouterMap(true) //关闭打印路由注册信息 Httpserver.SetDumpRouterMap(true) //关闭打印路由注册信息
HttpServer.BindMiddlewareDefault(ghttp.MiddlewareHandlerResponse, jaeger.NewTracer) //使用默认http返回结构 Httpserver.BindMiddlewareDefault(ghttp.MiddlewareHandlerResponse, jaeger.NewTracer) //使用默认http返回结构
go HttpServer.Run() go Httpserver.Run()
} }
func RouteRegister(controllers []interface{}) { func RouteRegister(controllers []interface{}) {
re := regexp.MustCompile("[A-Z]") re := regexp.MustCompile("[A-Z]")
@@ -49,7 +50,7 @@ func RouteRegister(controllers []interface{}) {
convertedStr := re.ReplaceAllStringFunc(sName, func(s string) string { convertedStr := re.ReplaceAllStringFunc(sName, func(s string) string {
return fmt.Sprintf("/%s", strings.ToLower(s)) return fmt.Sprintf("/%s", strings.ToLower(s))
}) })
HttpServer.Group(convertedStr, func(group *ghttp.RouterGroup) { Httpserver.Group(convertedStr, func(group *ghttp.RouterGroup) {
group.Bind(t) group.Bind(t)
}) })
} }

View File

@@ -3,55 +3,36 @@ package jaeger
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"github.com/gogf/gf/contrib/trace/otlphttp/v2"
"github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp" "github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/util/gconv" "github.com/gogf/gf/v2/net/gtrace"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/exporters/jaeger"
"go.opentelemetry.io/otel/sdk/resource"
"go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.21.0"
"strconv" "strconv"
) )
var Tp = new(trace.TracerProvider) var ShutDown func(ctx context.Context)
func init() { func init() {
jaegerAgent, err := g.Cfg().Get(context.Background(), "jaeger.addr") jaegerAgent, err := g.Cfg().Get(context.Background(), "jaeger.addr")
if err != nil { if err != nil {
panic(err) panic(err)
} }
exp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(gconv.String(jaegerAgent))))
if err != nil {
panic(err)
}
serverName, err := g.Cfg().Get(context.Background(), "server.Name") serverName, err := g.Cfg().Get(context.Background(), "server.Name")
if err != nil { if err != nil {
panic(err) panic(err)
} }
// 创建一个 TracerProvider并将 Jaeger exporter 设置为其处理器 ShutDown, err = otlphttp.Init(serverName.String(), jaegerAgent.String(), "/v1/traces")
Tp = trace.NewTracerProvider( if err != nil {
// 使用 BatchSpanProcessor 可以提高性能,它会批量发送 span panic(err)
trace.WithBatcher(exp), }
// 设置资源属性,这些属性会附加到所有导出的 span 上
trace.WithResource(resource.NewWithAttributes(
semconv.SchemaURL,
semconv.ServiceName(gconv.String(serverName)), // 服务名称,在 Jaeger UI 中会显示
)),
)
// 将 TracerProvider 设置为全局,方便在应用的任何地方通过 otel.Tracer() 获取
otel.SetTracerProvider(Tp)
} }
func NewTracer(r *ghttp.Request) { func NewTracer(r *ghttp.Request) {
// 从传入的上下文中获取 Tracer或者直接使用全局的 _, span := gtrace.NewSpan(r.Context(), r.GetServeHandler().GetMetaTag("summary"))
tracer := otel.Tracer(r.GetServeHandler().GetMetaTag("summary")) defer span.End()
_, span := tracer.Start(r.Context(), r.GetServeHandler().GetMetaTag("summary"))
defer span.End() // 非常重要:确保 span 在函数结束时被关闭
span.SetAttributes(attribute.String("request", getParams(r))) span.SetAttributes(attribute.String("request", getParams(r)))
r.Middleware.Next() r.Middleware.Next()
span.SetAttributes(attribute.String("response", r.Response.BufferString())) span.SetAttributes(attribute.String("response", r.Response.BufferString()))
//span.AddEvent("Saying hello is done")
} }
func getParams(r *ghttp.Request) string { func getParams(r *ghttp.Request) string {
params := map[string]interface{}{} params := map[string]interface{}{}