package telemetry_test import ( "context" "net/http/httptest" "testing" omni "git.yuntuo.hk/k2safe/go-omni" apierrors "git.yuntuo.hk/k2safe/go-omni/errors" "git.yuntuo.hk/k2safe/go-omni/response" "git.yuntuo.hk/k2safe/go-omni/telemetry" "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/sdk/trace/tracetest" ) func TestCatalogFailureTraceWithHTTP200(t *testing.T) { exporter := tracetest.NewInMemoryExporter() runtime, err := telemetry.New(telemetry.Config{Service: "fixture", SampleRatio: 1, Exporter: exporter}) if err != nil { t.Fatal(err) } defer runtime.Close() app := omni.New(omni.WithErrors(apierrors.Catalog{DefaultStatus: 200, Definitions: map[string]apierrors.Definition{"INVALID": {Code: 123, Message: "invalid"}}}), omni.WithResponse(response.Config{CodeType: "int32", SuccessCode: 0, ErrorCode: 9999})) defer app.Close() app.Use(runtime.Middleware()) app.GET("/", func(c *omni.Context) error { c.WriteError(apierrors.ByCode("INVALID")); return nil }) w := httptest.NewRecorder() app.ServeHTTP(w, httptest.NewRequest("GET", "/", nil)) if w.Code != 200 { t.Fatal(w.Code) } if err := runtime.Flush(context.Background()); err != nil { t.Fatal(err) } spans := exporter.GetSpans() if len(spans) != 1 || spans[0].Status.Code != codes.Error { t.Fatal(spans) } seenStatus, seenFailure := false, false for _, attr := range spans[0].Attributes { if attr.Key == "http.response.status_code" && attr.Value.AsInt64() == 200 { seenStatus = true } if attr.Key == "omni.request.failed" && attr.Value.AsBool() { seenFailure = true } } if !seenStatus || !seenFailure { t.Fatal(spans[0].Attributes) } }