Explorar o código

Fixed #TASK_QT-9810 AI修复离线问题

abel.shi hai 1 mes
pai
achega
c5370631a7

+ 1 - 1
Makefile

@@ -19,7 +19,7 @@ else
 	DOCKERFILE = Dockerfile
 endif
 
-VERSION=0.0.1
+VERSION=1.6.4
 FILTER=
 PARAMS=
 

+ 1 - 1
flags/flags.go

@@ -83,7 +83,7 @@ var (
 )
 
 var AgentName = "euspace"
-var AgentVersion = "0.0.1"
+var AgentVersion = "1.6.4"
 var GitCommit = ""
 var BuildDate = ""
 

+ 14 - 6
pkg/go.opentelemetry.io/otel/exporters/otlp/otlptrace/apm_exporter.go

@@ -336,8 +336,12 @@ func buildLevelFromEvent(sdl *RootDataT) {
 		}
 		mapSlice = append(mapSlice, timeEndMap)
 	}
-	sort.Slice(mapSlice, func(i, j int) bool {
-		return mapSlice[i].Time < mapSlice[j].Time
+	sort.SliceStable(mapSlice, func(i, j int) bool {
+		if mapSlice[i].Time != mapSlice[j].Time {
+			return mapSlice[i].Time < mapSlice[j].Time
+		}
+		// 同一时刻,入口事件(Type=0)优先于出口事件(Type=1),避免空栈弹出
+		return mapSlice[i].Type < mapSlice[j].Type
 	})
 
 	funStack := []TimeMap{}
@@ -359,12 +363,16 @@ func buildLevelFromEvent(sdl *RootDataT) {
 			Nid += 1
 		} else if v.Type == 1 {
 			// 函数出口
-			len := len(funStack)
-			funStack = funStack[:len-1]
-			if (len - 2) < 0 {
+			l := len(funStack)
+			if l == 0 {
+				// 出口事件无匹配的入口事件(eBPF采样丢失/数据截断),安全跳过
+				continue
+			}
+			funStack = funStack[:l-1]
+			if (l - 2) < 0 {
 				currentNid = 1
 			} else {
-				currentNid = funStack[len-2].Map.Nid
+				currentNid = funStack[l-2].Map.Nid
 			}
 
 			level -= 1

+ 9 - 1
pkg/go.opentelemetry.io/otel/exporters/otlp/otlptrace/exporter.go

@@ -19,8 +19,10 @@ import (
 	"errors"
 	"fmt"
 	"os"
+	"runtime/debug"
 	"sync"
 
+	klog "github.com/sirupsen/logrus"
 	"go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform"
 	tracesdk "go.opentelemetry.io/otel/sdk/trace"
 )
@@ -41,7 +43,13 @@ type Exporter struct {
 }
 
 // ExportSpans exports a batch of spans.
-func (e *Exporter) ExportSpans(ctx context.Context, ss []tracesdk.ReadOnlySpan) error {
+func (e *Exporter) ExportSpans(ctx context.Context, ss []tracesdk.ReadOnlySpan) (retErr error) {
+	defer func() {
+		if r := recover(); r != nil {
+			klog.Errorf("ExportSpans panic recovered: %v\n%s", r, debug.Stack())
+			retErr = fmt.Errorf("ExportSpans panic: %v", r)
+		}
+	}()
 	protoSpans := tracetransform.Spans(ss)
 	if len(protoSpans) == 0 {
 		return nil