From 7e510695958780ed7c99ded63d8d47a22f15a0ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=96=8C?= <259278618@qq.com> Date: Tue, 23 Jun 2026 16:51:39 +0800 Subject: [PATCH] =?UTF-8?q?jaeger=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- http/http.go | 2 -- jaeger/jaeger.go | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/http/http.go b/http/http.go index 3ca13a0..79e8fb8 100644 --- a/http/http.go +++ b/http/http.go @@ -10,7 +10,6 @@ import ( "strings" _ "gitea.redpowerfuture.com/red-future/common/consul" - "gitea.redpowerfuture.com/red-future/common/jaeger" "gitea.redpowerfuture.com/red-future/common/utils" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/gclient" @@ -80,7 +79,6 @@ func RouteRegister(controllers []interface{}) { return fmt.Sprintf("/%s", strings.ToLower(s)) }) Httpserver.Group(convertedStr, func(group *ghttp.RouterGroup) { - group.Middleware(jaeger.NewTracer) group.Bind(t) }) } diff --git a/jaeger/jaeger.go b/jaeger/jaeger.go index 0132dd3..edade4d 100644 --- a/jaeger/jaeger.go +++ b/jaeger/jaeger.go @@ -11,9 +11,12 @@ import ( "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/ghttp" "github.com/gogf/gf/v2/net/gtrace" + "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/trace" + "go.opentelemetry.io/otel/trace/embedded" + "go.opentelemetry.io/otel/trace/noop" ) var ( @@ -41,6 +44,10 @@ func Init() { return } ShutDown = shutdown + + // 包装 TracerProvider:只保留 HTTP Server 追踪,屏蔽 DB/Redis/Client 等内部 span + wrapTracerProvider() + g.Log().Infof(ctx, "✅ Jaeger 初始化成功: %s", jaegerAgent) }) } @@ -50,6 +57,32 @@ func init() { Init() } +// filterTracerProvider 只放行指定 instrument 的 span,其余返回 noop tracer +type filterTracerProvider struct { + embedded.TracerProvider + real trace.TracerProvider + noop trace.TracerProvider + allowed map[string]bool +} + +func (f *filterTracerProvider) Tracer(instrumentName string, opts ...trace.TracerOption) trace.Tracer { + if f.allowed[instrumentName] { + return f.real.Tracer(instrumentName, opts...) + } + return f.noop.Tracer(instrumentName, opts...) +} + +// wrapTracerProvider 包装全局 TracerProvider,只保留 HTTP Server 追踪 +func wrapTracerProvider() { + otel.SetTracerProvider(&filterTracerProvider{ + real: otel.GetTracerProvider(), + noop: noop.NewTracerProvider(), + allowed: map[string]bool{ + "github.com/gogf/gf/v2/net/ghttp.Server": true, + }, + }) +} + // NewSpan 创建新的链路追踪 Span // spanName: Span 名称,用于在 Jaeger UI 中标识 // 返回带有 Span 的 context 和 Span 对象,调用方需 defer span.End()