From d683e50be65011186e99cd470b5791ae977d954c Mon Sep 17 00:00:00 2001 From: taoyifan Date: Mon, 2 Mar 2026 17:34:51 +0800 Subject: [PATCH 1/4] Add src params. Change-Id: I09011617cf91421324b9336eb4965b1e709a4b5c --- .../coze.loop.observability.openapi.go | 457 ++++++++++++++++++ ...ze.loop.observability.openapi_validator.go | 23 + .../k-coze.loop.observability.openapi.go | 340 +++++++++++++ .../observability/application/openapi.go | 26 +- .../application/openapi_pre_span_test.go | 4 +- .../observability/application/openapi_test.go | 22 +- .../component/collector/event_collector.go | 2 +- .../collector/mocks/event_collector.go | 8 +- .../infra/collector/event_collector.go | 2 +- .../coze.loop.observability.openapi.thrift | 8 + 10 files changed, 868 insertions(+), 24 deletions(-) diff --git a/backend/kitex_gen/coze/loop/observability/openapi/coze.loop.observability.openapi.go b/backend/kitex_gen/coze/loop/observability/openapi/coze.loop.observability.openapi.go index e2403333f..3ce0b6901 100644 --- a/backend/kitex_gen/coze/loop/observability/openapi/coze.loop.observability.openapi.go +++ b/backend/kitex_gen/coze/loop/observability/openapi/coze.loop.observability.openapi.go @@ -17,6 +17,187 @@ import ( "strings" ) +type Extra struct { + Src *string `thrift:"src,1,optional" frugal:"1,optional,string" header:"src" json:"src,omitempty"` +} + +func NewExtra() *Extra { + return &Extra{} +} + +func (p *Extra) InitDefault() { +} + +var Extra_Src_DEFAULT string + +func (p *Extra) GetSrc() (v string) { + if p == nil { + return + } + if !p.IsSetSrc() { + return Extra_Src_DEFAULT + } + return *p.Src +} +func (p *Extra) SetSrc(val *string) { + p.Src = val +} + +var fieldIDToName_Extra = map[int16]string{ + 1: "src", +} + +func (p *Extra) IsSetSrc() bool { + return p.Src != nil +} + +func (p *Extra) Read(iprot thrift.TProtocol) (err error) { + var fieldTypeId thrift.TType + var fieldId int16 + + if _, err = iprot.ReadStructBegin(); err != nil { + goto ReadStructBeginError + } + + for { + _, fieldTypeId, fieldId, err = iprot.ReadFieldBegin() + if err != nil { + goto ReadFieldBeginError + } + if fieldTypeId == thrift.STOP { + break + } + + switch fieldId { + case 1: + if fieldTypeId == thrift.STRING { + if err = p.ReadField1(iprot); err != nil { + goto ReadFieldError + } + } else if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } + default: + if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } + } + if err = iprot.ReadFieldEnd(); err != nil { + goto ReadFieldEndError + } + } + if err = iprot.ReadStructEnd(); err != nil { + goto ReadStructEndError + } + + return nil +ReadStructBeginError: + return thrift.PrependError(fmt.Sprintf("%T read struct begin error: ", p), err) +ReadFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T read field %d begin error: ", p, fieldId), err) +ReadFieldError: + return thrift.PrependError(fmt.Sprintf("%T read field %d '%s' error: ", p, fieldId, fieldIDToName_Extra[fieldId]), err) +SkipFieldError: + return thrift.PrependError(fmt.Sprintf("%T field %d skip type %d error: ", p, fieldId, fieldTypeId), err) + +ReadFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T read field end error", p), err) +ReadStructEndError: + return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) +} + +func (p *Extra) ReadField1(iprot thrift.TProtocol) error { + + var _field *string + if v, err := iprot.ReadString(); err != nil { + return err + } else { + _field = &v + } + p.Src = _field + return nil +} + +func (p *Extra) Write(oprot thrift.TProtocol) (err error) { + var fieldId int16 + if err = oprot.WriteStructBegin("Extra"); err != nil { + goto WriteStructBeginError + } + if p != nil { + if err = p.writeField1(oprot); err != nil { + fieldId = 1 + goto WriteFieldError + } + } + if err = oprot.WriteFieldStop(); err != nil { + goto WriteFieldStopError + } + if err = oprot.WriteStructEnd(); err != nil { + goto WriteStructEndError + } + return nil +WriteStructBeginError: + return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) +WriteFieldError: + return thrift.PrependError(fmt.Sprintf("%T write field %d error: ", p, fieldId), err) +WriteFieldStopError: + return thrift.PrependError(fmt.Sprintf("%T write field stop error: ", p), err) +WriteStructEndError: + return thrift.PrependError(fmt.Sprintf("%T write struct end error: ", p), err) +} + +func (p *Extra) writeField1(oprot thrift.TProtocol) (err error) { + if p.IsSetSrc() { + if err = oprot.WriteFieldBegin("src", thrift.STRING, 1); err != nil { + goto WriteFieldBeginError + } + if err := oprot.WriteString(*p.Src); err != nil { + return err + } + if err = oprot.WriteFieldEnd(); err != nil { + goto WriteFieldEndError + } + } + return nil +WriteFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T write field 1 begin error: ", p), err) +WriteFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T write field 1 end error: ", p), err) +} + +func (p *Extra) String() string { + if p == nil { + return "" + } + return fmt.Sprintf("Extra(%+v)", *p) + +} + +func (p *Extra) DeepEqual(ano *Extra) bool { + if p == ano { + return true + } else if p == nil || ano == nil { + return false + } + if !p.Field1DeepEqual(ano.Src) { + return false + } + return true +} + +func (p *Extra) Field1DeepEqual(src *string) bool { + + if p.Src == src { + return true + } else if p.Src == nil || src == nil { + return false + } + if strings.Compare(*p.Src, *src) != 0 { + return false + } + return true +} + type IngestTracesRequest struct { Spans []*span.InputSpan `thrift:"spans,1,optional" frugal:"1,optional,list" form:"spans" json:"spans,omitempty"` Base *base.Base `thrift:"Base,255,optional" frugal:"255,optional,base.Base" form:"Base" json:"Base,omitempty" query:"Base"` @@ -2869,6 +3050,7 @@ type SearchTraceOApiRequest struct { PlatformType *common.PlatformType `thrift:"platform_type,8,optional" frugal:"8,optional,string" form:"platform_type" json:"platform_type,omitempty"` SpanIds []string `thrift:"span_ids,9,optional" frugal:"9,optional,list" form:"span_ids" json:"span_ids,omitempty"` NeedOriginalTags *bool `thrift:"need_original_tags,100,optional" frugal:"100,optional,bool" form:"need_original_tags" json:"need_original_tags,omitempty"` + Extra *Extra `thrift:"extra,254,optional" frugal:"254,optional,Extra" form:"extra" json:"extra,omitempty" query:"extra"` Base *base.Base `thrift:"Base,255,optional" frugal:"255,optional,base.Base" form:"Base" json:"Base,omitempty" query:"Base"` } @@ -2967,6 +3149,18 @@ func (p *SearchTraceOApiRequest) GetNeedOriginalTags() (v bool) { return *p.NeedOriginalTags } +var SearchTraceOApiRequest_Extra_DEFAULT *Extra + +func (p *SearchTraceOApiRequest) GetExtra() (v *Extra) { + if p == nil { + return + } + if !p.IsSetExtra() { + return SearchTraceOApiRequest_Extra_DEFAULT + } + return p.Extra +} + var SearchTraceOApiRequest_Base_DEFAULT *base.Base func (p *SearchTraceOApiRequest) GetBase() (v *base.Base) { @@ -3005,6 +3199,9 @@ func (p *SearchTraceOApiRequest) SetSpanIds(val []string) { func (p *SearchTraceOApiRequest) SetNeedOriginalTags(val *bool) { p.NeedOriginalTags = val } +func (p *SearchTraceOApiRequest) SetExtra(val *Extra) { + p.Extra = val +} func (p *SearchTraceOApiRequest) SetBase(val *base.Base) { p.Base = val } @@ -3019,6 +3216,7 @@ var fieldIDToName_SearchTraceOApiRequest = map[int16]string{ 8: "platform_type", 9: "span_ids", 100: "need_original_tags", + 254: "extra", 255: "Base", } @@ -3042,6 +3240,10 @@ func (p *SearchTraceOApiRequest) IsSetNeedOriginalTags() bool { return p.NeedOriginalTags != nil } +func (p *SearchTraceOApiRequest) IsSetExtra() bool { + return p.Extra != nil +} + func (p *SearchTraceOApiRequest) IsSetBase() bool { return p.Base != nil } @@ -3144,6 +3346,14 @@ func (p *SearchTraceOApiRequest) Read(iprot thrift.TProtocol) (err error) { } else if err = iprot.Skip(fieldTypeId); err != nil { goto SkipFieldError } + case 254: + if fieldTypeId == thrift.STRUCT { + if err = p.ReadField254(iprot); err != nil { + goto ReadFieldError + } + } else if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } case 255: if fieldTypeId == thrift.STRUCT { if err = p.ReadField255(iprot); err != nil { @@ -3313,6 +3523,14 @@ func (p *SearchTraceOApiRequest) ReadField100(iprot thrift.TProtocol) error { p.NeedOriginalTags = _field return nil } +func (p *SearchTraceOApiRequest) ReadField254(iprot thrift.TProtocol) error { + _field := NewExtra() + if err := _field.Read(iprot); err != nil { + return err + } + p.Extra = _field + return nil +} func (p *SearchTraceOApiRequest) ReadField255(iprot thrift.TProtocol) error { _field := base.NewBase() if err := _field.Read(iprot); err != nil { @@ -3364,6 +3582,10 @@ func (p *SearchTraceOApiRequest) Write(oprot thrift.TProtocol) (err error) { fieldId = 100 goto WriteFieldError } + if err = p.writeField254(oprot); err != nil { + fieldId = 254 + goto WriteFieldError + } if err = p.writeField255(oprot); err != nil { fieldId = 255 goto WriteFieldError @@ -3548,6 +3770,24 @@ WriteFieldBeginError: WriteFieldEndError: return thrift.PrependError(fmt.Sprintf("%T write field 100 end error: ", p), err) } +func (p *SearchTraceOApiRequest) writeField254(oprot thrift.TProtocol) (err error) { + if p.IsSetExtra() { + if err = oprot.WriteFieldBegin("extra", thrift.STRUCT, 254); err != nil { + goto WriteFieldBeginError + } + if err := p.Extra.Write(oprot); err != nil { + return err + } + if err = oprot.WriteFieldEnd(); err != nil { + goto WriteFieldEndError + } + } + return nil +WriteFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T write field 254 begin error: ", p), err) +WriteFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T write field 254 end error: ", p), err) +} func (p *SearchTraceOApiRequest) writeField255(oprot thrift.TProtocol) (err error) { if p.IsSetBase() { if err = oprot.WriteFieldBegin("Base", thrift.STRUCT, 255); err != nil { @@ -3608,6 +3848,9 @@ func (p *SearchTraceOApiRequest) DeepEqual(ano *SearchTraceOApiRequest) bool { if !p.Field100DeepEqual(ano.NeedOriginalTags) { return false } + if !p.Field254DeepEqual(ano.Extra) { + return false + } if !p.Field255DeepEqual(ano.Base) { return false } @@ -3703,6 +3946,13 @@ func (p *SearchTraceOApiRequest) Field100DeepEqual(src *bool) bool { } return true } +func (p *SearchTraceOApiRequest) Field254DeepEqual(src *Extra) bool { + + if !p.Extra.DeepEqual(src) { + return false + } + return true +} func (p *SearchTraceOApiRequest) Field255DeepEqual(src *base.Base) bool { if !p.Base.DeepEqual(src) { @@ -4385,6 +4635,7 @@ type SearchTraceTreeOApiRequest struct { Limit int32 `thrift:"limit,6,required" frugal:"6,required,i32" form:"limit,required" json:"limit,required"` PlatformType *common.PlatformType `thrift:"platform_type,8,optional" frugal:"8,optional,string" form:"platform_type" json:"platform_type,omitempty"` Filters *filter.FilterFields `thrift:"filters,10,optional" frugal:"10,optional,filter.FilterFields" form:"filters" json:"filters,omitempty"` + Extra *Extra `thrift:"extra,254,optional" frugal:"254,optional,Extra" form:"extra" json:"extra,omitempty" query:"extra"` Base *base.Base `thrift:"Base,255,optional" frugal:"255,optional,base.Base" form:"Base" json:"Base,omitempty" query:"Base"` } @@ -4474,6 +4725,18 @@ func (p *SearchTraceTreeOApiRequest) GetFilters() (v *filter.FilterFields) { return p.Filters } +var SearchTraceTreeOApiRequest_Extra_DEFAULT *Extra + +func (p *SearchTraceTreeOApiRequest) GetExtra() (v *Extra) { + if p == nil { + return + } + if !p.IsSetExtra() { + return SearchTraceTreeOApiRequest_Extra_DEFAULT + } + return p.Extra +} + var SearchTraceTreeOApiRequest_Base_DEFAULT *base.Base func (p *SearchTraceTreeOApiRequest) GetBase() (v *base.Base) { @@ -4506,6 +4769,9 @@ func (p *SearchTraceTreeOApiRequest) SetPlatformType(val *common.PlatformType) { func (p *SearchTraceTreeOApiRequest) SetFilters(val *filter.FilterFields) { p.Filters = val } +func (p *SearchTraceTreeOApiRequest) SetExtra(val *Extra) { + p.Extra = val +} func (p *SearchTraceTreeOApiRequest) SetBase(val *base.Base) { p.Base = val } @@ -4518,6 +4784,7 @@ var fieldIDToName_SearchTraceTreeOApiRequest = map[int16]string{ 6: "limit", 8: "platform_type", 10: "filters", + 254: "extra", 255: "Base", } @@ -4545,6 +4812,10 @@ func (p *SearchTraceTreeOApiRequest) IsSetFilters() bool { return p.Filters != nil } +func (p *SearchTraceTreeOApiRequest) IsSetExtra() bool { + return p.Extra != nil +} + func (p *SearchTraceTreeOApiRequest) IsSetBase() bool { return p.Base != nil } @@ -4625,6 +4896,14 @@ func (p *SearchTraceTreeOApiRequest) Read(iprot thrift.TProtocol) (err error) { } else if err = iprot.Skip(fieldTypeId); err != nil { goto SkipFieldError } + case 254: + if fieldTypeId == thrift.STRUCT { + if err = p.ReadField254(iprot); err != nil { + goto ReadFieldError + } + } else if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } case 255: if fieldTypeId == thrift.STRUCT { if err = p.ReadField255(iprot); err != nil { @@ -4742,6 +5021,14 @@ func (p *SearchTraceTreeOApiRequest) ReadField10(iprot thrift.TProtocol) error { p.Filters = _field return nil } +func (p *SearchTraceTreeOApiRequest) ReadField254(iprot thrift.TProtocol) error { + _field := NewExtra() + if err := _field.Read(iprot); err != nil { + return err + } + p.Extra = _field + return nil +} func (p *SearchTraceTreeOApiRequest) ReadField255(iprot thrift.TProtocol) error { _field := base.NewBase() if err := _field.Read(iprot); err != nil { @@ -4785,6 +5072,10 @@ func (p *SearchTraceTreeOApiRequest) Write(oprot thrift.TProtocol) (err error) { fieldId = 10 goto WriteFieldError } + if err = p.writeField254(oprot); err != nil { + fieldId = 254 + goto WriteFieldError + } if err = p.writeField255(oprot); err != nil { fieldId = 255 goto WriteFieldError @@ -4931,6 +5222,24 @@ WriteFieldBeginError: WriteFieldEndError: return thrift.PrependError(fmt.Sprintf("%T write field 10 end error: ", p), err) } +func (p *SearchTraceTreeOApiRequest) writeField254(oprot thrift.TProtocol) (err error) { + if p.IsSetExtra() { + if err = oprot.WriteFieldBegin("extra", thrift.STRUCT, 254); err != nil { + goto WriteFieldBeginError + } + if err := p.Extra.Write(oprot); err != nil { + return err + } + if err = oprot.WriteFieldEnd(); err != nil { + goto WriteFieldEndError + } + } + return nil +WriteFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T write field 254 begin error: ", p), err) +WriteFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T write field 254 end error: ", p), err) +} func (p *SearchTraceTreeOApiRequest) writeField255(oprot thrift.TProtocol) (err error) { if p.IsSetBase() { if err = oprot.WriteFieldBegin("Base", thrift.STRUCT, 255); err != nil { @@ -4985,6 +5294,9 @@ func (p *SearchTraceTreeOApiRequest) DeepEqual(ano *SearchTraceTreeOApiRequest) if !p.Field10DeepEqual(ano.Filters) { return false } + if !p.Field254DeepEqual(ano.Extra) { + return false + } if !p.Field255DeepEqual(ano.Base) { return false } @@ -5065,6 +5377,13 @@ func (p *SearchTraceTreeOApiRequest) Field10DeepEqual(src *filter.FilterFields) } return true } +func (p *SearchTraceTreeOApiRequest) Field254DeepEqual(src *Extra) bool { + + if !p.Extra.DeepEqual(src) { + return false + } + return true +} func (p *SearchTraceTreeOApiRequest) Field255DeepEqual(src *base.Base) bool { if !p.Base.DeepEqual(src) { @@ -5750,6 +6069,7 @@ type ListSpansOApiRequest struct { PlatformType *common.PlatformType `thrift:"platform_type,8,optional" frugal:"8,optional,string" form:"platform_type" json:"platform_type,omitempty"` SpanListType *common.SpanListType `thrift:"span_list_type,9,optional" frugal:"9,optional,string" form:"span_list_type" json:"span_list_type,omitempty"` NeedOriginalTags *bool `thrift:"need_original_tags,100,optional" frugal:"100,optional,bool" form:"need_original_tags" json:"need_original_tags,omitempty"` + Extra *Extra `thrift:"extra,254,optional" frugal:"254,optional,Extra" form:"extra" json:"extra,omitempty" query:"extra"` Base *base.Base `thrift:"Base,255,optional" frugal:"255,optional,base.Base" form:"Base" json:"Base,omitempty" query:"Base"` } @@ -5865,6 +6185,18 @@ func (p *ListSpansOApiRequest) GetNeedOriginalTags() (v bool) { return *p.NeedOriginalTags } +var ListSpansOApiRequest_Extra_DEFAULT *Extra + +func (p *ListSpansOApiRequest) GetExtra() (v *Extra) { + if p == nil { + return + } + if !p.IsSetExtra() { + return ListSpansOApiRequest_Extra_DEFAULT + } + return p.Extra +} + var ListSpansOApiRequest_Base_DEFAULT *base.Base func (p *ListSpansOApiRequest) GetBase() (v *base.Base) { @@ -5906,6 +6238,9 @@ func (p *ListSpansOApiRequest) SetSpanListType(val *common.SpanListType) { func (p *ListSpansOApiRequest) SetNeedOriginalTags(val *bool) { p.NeedOriginalTags = val } +func (p *ListSpansOApiRequest) SetExtra(val *Extra) { + p.Extra = val +} func (p *ListSpansOApiRequest) SetBase(val *base.Base) { p.Base = val } @@ -5921,6 +6256,7 @@ var fieldIDToName_ListSpansOApiRequest = map[int16]string{ 8: "platform_type", 9: "span_list_type", 100: "need_original_tags", + 254: "extra", 255: "Base", } @@ -5952,6 +6288,10 @@ func (p *ListSpansOApiRequest) IsSetNeedOriginalTags() bool { return p.NeedOriginalTags != nil } +func (p *ListSpansOApiRequest) IsSetExtra() bool { + return p.Extra != nil +} + func (p *ListSpansOApiRequest) IsSetBase() bool { return p.Base != nil } @@ -6060,6 +6400,14 @@ func (p *ListSpansOApiRequest) Read(iprot thrift.TProtocol) (err error) { } else if err = iprot.Skip(fieldTypeId); err != nil { goto SkipFieldError } + case 254: + if fieldTypeId == thrift.STRUCT { + if err = p.ReadField254(iprot); err != nil { + goto ReadFieldError + } + } else if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } case 255: if fieldTypeId == thrift.STRUCT { if err = p.ReadField255(iprot); err != nil { @@ -6232,6 +6580,14 @@ func (p *ListSpansOApiRequest) ReadField100(iprot thrift.TProtocol) error { p.NeedOriginalTags = _field return nil } +func (p *ListSpansOApiRequest) ReadField254(iprot thrift.TProtocol) error { + _field := NewExtra() + if err := _field.Read(iprot); err != nil { + return err + } + p.Extra = _field + return nil +} func (p *ListSpansOApiRequest) ReadField255(iprot thrift.TProtocol) error { _field := base.NewBase() if err := _field.Read(iprot); err != nil { @@ -6287,6 +6643,10 @@ func (p *ListSpansOApiRequest) Write(oprot thrift.TProtocol) (err error) { fieldId = 100 goto WriteFieldError } + if err = p.writeField254(oprot); err != nil { + fieldId = 254 + goto WriteFieldError + } if err = p.writeField255(oprot); err != nil { fieldId = 255 goto WriteFieldError @@ -6491,6 +6851,24 @@ WriteFieldBeginError: WriteFieldEndError: return thrift.PrependError(fmt.Sprintf("%T write field 100 end error: ", p), err) } +func (p *ListSpansOApiRequest) writeField254(oprot thrift.TProtocol) (err error) { + if p.IsSetExtra() { + if err = oprot.WriteFieldBegin("extra", thrift.STRUCT, 254); err != nil { + goto WriteFieldBeginError + } + if err := p.Extra.Write(oprot); err != nil { + return err + } + if err = oprot.WriteFieldEnd(); err != nil { + goto WriteFieldEndError + } + } + return nil +WriteFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T write field 254 begin error: ", p), err) +WriteFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T write field 254 end error: ", p), err) +} func (p *ListSpansOApiRequest) writeField255(oprot thrift.TProtocol) (err error) { if p.IsSetBase() { if err = oprot.WriteFieldBegin("Base", thrift.STRUCT, 255); err != nil { @@ -6554,6 +6932,9 @@ func (p *ListSpansOApiRequest) DeepEqual(ano *ListSpansOApiRequest) bool { if !p.Field100DeepEqual(ano.NeedOriginalTags) { return false } + if !p.Field254DeepEqual(ano.Extra) { + return false + } if !p.Field255DeepEqual(ano.Base) { return false } @@ -6661,6 +7042,13 @@ func (p *ListSpansOApiRequest) Field100DeepEqual(src *bool) bool { } return true } +func (p *ListSpansOApiRequest) Field254DeepEqual(src *Extra) bool { + + if !p.Extra.DeepEqual(src) { + return false + } + return true +} func (p *ListSpansOApiRequest) Field255DeepEqual(src *base.Base) bool { if !p.Base.DeepEqual(src) { @@ -7408,6 +7796,7 @@ type ListPreSpanOApiRequest struct { SpanID *string `thrift:"span_id,4,optional" frugal:"4,optional,string" form:"span_id" json:"span_id,omitempty"` PreviousResponseID *string `thrift:"previous_response_id,5,optional" frugal:"5,optional,string" form:"previous_response_id" json:"previous_response_id,omitempty"` PlatformType *common.PlatformType `thrift:"platform_type,6,optional" frugal:"6,optional,string" form:"platform_type" json:"platform_type,omitempty"` + Extra *Extra `thrift:"extra,254,optional" frugal:"254,optional,Extra" form:"extra" json:"extra,omitempty" query:"extra"` Base *base.Base `thrift:"Base,255,optional" frugal:"255,optional,base.Base" form:"Base" json:"Base,omitempty" query:"Base"` } @@ -7475,6 +7864,18 @@ func (p *ListPreSpanOApiRequest) GetPlatformType() (v common.PlatformType) { return *p.PlatformType } +var ListPreSpanOApiRequest_Extra_DEFAULT *Extra + +func (p *ListPreSpanOApiRequest) GetExtra() (v *Extra) { + if p == nil { + return + } + if !p.IsSetExtra() { + return ListPreSpanOApiRequest_Extra_DEFAULT + } + return p.Extra +} + var ListPreSpanOApiRequest_Base_DEFAULT *base.Base func (p *ListPreSpanOApiRequest) GetBase() (v *base.Base) { @@ -7504,6 +7905,9 @@ func (p *ListPreSpanOApiRequest) SetPreviousResponseID(val *string) { func (p *ListPreSpanOApiRequest) SetPlatformType(val *common.PlatformType) { p.PlatformType = val } +func (p *ListPreSpanOApiRequest) SetExtra(val *Extra) { + p.Extra = val +} func (p *ListPreSpanOApiRequest) SetBase(val *base.Base) { p.Base = val } @@ -7515,6 +7919,7 @@ var fieldIDToName_ListPreSpanOApiRequest = map[int16]string{ 4: "span_id", 5: "previous_response_id", 6: "platform_type", + 254: "extra", 255: "Base", } @@ -7530,6 +7935,10 @@ func (p *ListPreSpanOApiRequest) IsSetPlatformType() bool { return p.PlatformType != nil } +func (p *ListPreSpanOApiRequest) IsSetExtra() bool { + return p.Extra != nil +} + func (p *ListPreSpanOApiRequest) IsSetBase() bool { return p.Base != nil } @@ -7606,6 +8015,14 @@ func (p *ListPreSpanOApiRequest) Read(iprot thrift.TProtocol) (err error) { } else if err = iprot.Skip(fieldTypeId); err != nil { goto SkipFieldError } + case 254: + if fieldTypeId == thrift.STRUCT { + if err = p.ReadField254(iprot); err != nil { + goto ReadFieldError + } + } else if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } case 255: if fieldTypeId == thrift.STRUCT { if err = p.ReadField255(iprot); err != nil { @@ -7725,6 +8142,14 @@ func (p *ListPreSpanOApiRequest) ReadField6(iprot thrift.TProtocol) error { p.PlatformType = _field return nil } +func (p *ListPreSpanOApiRequest) ReadField254(iprot thrift.TProtocol) error { + _field := NewExtra() + if err := _field.Read(iprot); err != nil { + return err + } + p.Extra = _field + return nil +} func (p *ListPreSpanOApiRequest) ReadField255(iprot thrift.TProtocol) error { _field := base.NewBase() if err := _field.Read(iprot); err != nil { @@ -7764,6 +8189,10 @@ func (p *ListPreSpanOApiRequest) Write(oprot thrift.TProtocol) (err error) { fieldId = 6 goto WriteFieldError } + if err = p.writeField254(oprot); err != nil { + fieldId = 254 + goto WriteFieldError + } if err = p.writeField255(oprot); err != nil { fieldId = 255 goto WriteFieldError @@ -7888,6 +8317,24 @@ WriteFieldBeginError: WriteFieldEndError: return thrift.PrependError(fmt.Sprintf("%T write field 6 end error: ", p), err) } +func (p *ListPreSpanOApiRequest) writeField254(oprot thrift.TProtocol) (err error) { + if p.IsSetExtra() { + if err = oprot.WriteFieldBegin("extra", thrift.STRUCT, 254); err != nil { + goto WriteFieldBeginError + } + if err := p.Extra.Write(oprot); err != nil { + return err + } + if err = oprot.WriteFieldEnd(); err != nil { + goto WriteFieldEndError + } + } + return nil +WriteFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T write field 254 begin error: ", p), err) +WriteFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T write field 254 end error: ", p), err) +} func (p *ListPreSpanOApiRequest) writeField255(oprot thrift.TProtocol) (err error) { if p.IsSetBase() { if err = oprot.WriteFieldBegin("Base", thrift.STRUCT, 255); err != nil { @@ -7939,6 +8386,9 @@ func (p *ListPreSpanOApiRequest) DeepEqual(ano *ListPreSpanOApiRequest) bool { if !p.Field6DeepEqual(ano.PlatformType) { return false } + if !p.Field254DeepEqual(ano.Extra) { + return false + } if !p.Field255DeepEqual(ano.Base) { return false } @@ -8002,6 +8452,13 @@ func (p *ListPreSpanOApiRequest) Field6DeepEqual(src *common.PlatformType) bool } return true } +func (p *ListPreSpanOApiRequest) Field254DeepEqual(src *Extra) bool { + + if !p.Extra.DeepEqual(src) { + return false + } + return true +} func (p *ListPreSpanOApiRequest) Field255DeepEqual(src *base.Base) bool { if !p.Base.DeepEqual(src) { diff --git a/backend/kitex_gen/coze/loop/observability/openapi/coze.loop.observability.openapi_validator.go b/backend/kitex_gen/coze/loop/observability/openapi/coze.loop.observability.openapi_validator.go index eea2cfeb4..a36397330 100644 --- a/backend/kitex_gen/coze/loop/observability/openapi/coze.loop.observability.openapi_validator.go +++ b/backend/kitex_gen/coze/loop/observability/openapi/coze.loop.observability.openapi_validator.go @@ -21,6 +21,9 @@ var ( _ = time.Nanosecond ) +func (p *Extra) IsValid() error { + return nil +} func (p *IngestTracesRequest) IsValid() error { if p.Base != nil { if err := p.Base.IsValid(); err != nil { @@ -107,6 +110,11 @@ func (p *SearchTraceOApiRequest) IsValid() error { if p.WorkspaceID <= int64(0) { return fmt.Errorf("field WorkspaceID gt rule failed, current value: %v", p.WorkspaceID) } + if p.Extra != nil { + if err := p.Extra.IsValid(); err != nil { + return fmt.Errorf("field Extra not valid, %w", err) + } + } if p.Base != nil { if err := p.Base.IsValid(); err != nil { return fmt.Errorf("field Base not valid, %w", err) @@ -141,6 +149,11 @@ func (p *SearchTraceTreeOApiRequest) IsValid() error { return fmt.Errorf("field Filters not valid, %w", err) } } + if p.Extra != nil { + if err := p.Extra.IsValid(); err != nil { + return fmt.Errorf("field Extra not valid, %w", err) + } + } if p.Base != nil { if err := p.Base.IsValid(); err != nil { return fmt.Errorf("field Base not valid, %w", err) @@ -178,6 +191,11 @@ func (p *ListSpansOApiRequest) IsValid() error { return fmt.Errorf("field Filters not valid, %w", err) } } + if p.Extra != nil { + if err := p.Extra.IsValid(); err != nil { + return fmt.Errorf("field Extra not valid, %w", err) + } + } if p.Base != nil { if err := p.Base.IsValid(); err != nil { return fmt.Errorf("field Base not valid, %w", err) @@ -205,6 +223,11 @@ func (p *ListPreSpanOApiRequest) IsValid() error { if p.WorkspaceID <= int64(0) { return fmt.Errorf("field WorkspaceID gt rule failed, current value: %v", p.WorkspaceID) } + if p.Extra != nil { + if err := p.Extra.IsValid(); err != nil { + return fmt.Errorf("field Extra not valid, %w", err) + } + } if p.Base != nil { if err := p.Base.IsValid(); err != nil { return fmt.Errorf("field Base not valid, %w", err) diff --git a/backend/kitex_gen/coze/loop/observability/openapi/k-coze.loop.observability.openapi.go b/backend/kitex_gen/coze/loop/observability/openapi/k-coze.loop.observability.openapi.go index 03aed7af9..ba282ca17 100644 --- a/backend/kitex_gen/coze/loop/observability/openapi/k-coze.loop.observability.openapi.go +++ b/backend/kitex_gen/coze/loop/observability/openapi/k-coze.loop.observability.openapi.go @@ -39,6 +39,126 @@ var ( _ = thrift.STOP ) +func (p *Extra) FastRead(buf []byte) (int, error) { + + var err error + var offset int + var l int + var fieldTypeId thrift.TType + var fieldId int16 + for { + fieldTypeId, fieldId, l, err = thrift.Binary.ReadFieldBegin(buf[offset:]) + offset += l + if err != nil { + goto ReadFieldBeginError + } + if fieldTypeId == thrift.STOP { + break + } + switch fieldId { + case 1: + if fieldTypeId == thrift.STRING { + l, err = p.FastReadField1(buf[offset:]) + offset += l + if err != nil { + goto ReadFieldError + } + } else { + l, err = thrift.Binary.Skip(buf[offset:], fieldTypeId) + offset += l + if err != nil { + goto SkipFieldError + } + } + default: + l, err = thrift.Binary.Skip(buf[offset:], fieldTypeId) + offset += l + if err != nil { + goto SkipFieldError + } + } + } + + return offset, nil +ReadFieldBeginError: + return offset, thrift.PrependError(fmt.Sprintf("%T read field %d begin error: ", p, fieldId), err) +ReadFieldError: + return offset, thrift.PrependError(fmt.Sprintf("%T read field %d '%s' error: ", p, fieldId, fieldIDToName_Extra[fieldId]), err) +SkipFieldError: + return offset, thrift.PrependError(fmt.Sprintf("%T field %d skip type %d error: ", p, fieldId, fieldTypeId), err) +} + +func (p *Extra) FastReadField1(buf []byte) (int, error) { + offset := 0 + + var _field *string + if v, l, err := thrift.Binary.ReadString(buf[offset:]); err != nil { + return offset, err + } else { + offset += l + _field = &v + } + p.Src = _field + return offset, nil +} + +func (p *Extra) FastWrite(buf []byte) int { + return p.FastWriteNocopy(buf, nil) +} + +func (p *Extra) FastWriteNocopy(buf []byte, w thrift.NocopyWriter) int { + offset := 0 + if p != nil { + offset += p.fastWriteField1(buf[offset:], w) + } + offset += thrift.Binary.WriteFieldStop(buf[offset:]) + return offset +} + +func (p *Extra) BLength() int { + l := 0 + if p != nil { + l += p.field1Length() + } + l += thrift.Binary.FieldStopLength() + return l +} + +func (p *Extra) fastWriteField1(buf []byte, w thrift.NocopyWriter) int { + offset := 0 + if p.IsSetSrc() { + offset += thrift.Binary.WriteFieldBegin(buf[offset:], thrift.STRING, 1) + offset += thrift.Binary.WriteStringNocopy(buf[offset:], w, *p.Src) + } + return offset +} + +func (p *Extra) field1Length() int { + l := 0 + if p.IsSetSrc() { + l += thrift.Binary.FieldBeginLength() + l += thrift.Binary.StringLengthNocopy(*p.Src) + } + return l +} + +func (p *Extra) DeepCopy(s interface{}) error { + src, ok := s.(*Extra) + if !ok { + return fmt.Errorf("%T's type not matched %T", s, p) + } + + if src.Src != nil { + var tmp string + if *src.Src != "" { + tmp = kutils.StringDeepCopy(*src.Src) + } + p.Src = &tmp + } + + return nil +} + func (p *IngestTracesRequest) FastRead(buf []byte) (int, error) { var err error @@ -2267,6 +2387,20 @@ func (p *SearchTraceOApiRequest) FastRead(buf []byte) (int, error) { goto SkipFieldError } } + case 254: + if fieldTypeId == thrift.STRUCT { + l, err = p.FastReadField254(buf[offset:]) + offset += l + if err != nil { + goto ReadFieldError + } + } else { + l, err = thrift.Binary.Skip(buf[offset:], fieldTypeId) + offset += l + if err != nil { + goto SkipFieldError + } + } case 255: if fieldTypeId == thrift.STRUCT { l, err = p.FastReadField255(buf[offset:]) @@ -2456,6 +2590,18 @@ func (p *SearchTraceOApiRequest) FastReadField100(buf []byte) (int, error) { return offset, nil } +func (p *SearchTraceOApiRequest) FastReadField254(buf []byte) (int, error) { + offset := 0 + _field := NewExtra() + if l, err := _field.FastRead(buf[offset:]); err != nil { + return offset, err + } else { + offset += l + } + p.Extra = _field + return offset, nil +} + func (p *SearchTraceOApiRequest) FastReadField255(buf []byte) (int, error) { offset := 0 _field := base.NewBase() @@ -2484,6 +2630,7 @@ func (p *SearchTraceOApiRequest) FastWriteNocopy(buf []byte, w thrift.NocopyWrit offset += p.fastWriteField3(buf[offset:], w) offset += p.fastWriteField8(buf[offset:], w) offset += p.fastWriteField9(buf[offset:], w) + offset += p.fastWriteField254(buf[offset:], w) offset += p.fastWriteField255(buf[offset:], w) } offset += thrift.Binary.WriteFieldStop(buf[offset:]) @@ -2502,6 +2649,7 @@ func (p *SearchTraceOApiRequest) BLength() int { l += p.field8Length() l += p.field9Length() l += p.field100Length() + l += p.field254Length() l += p.field255Length() } l += thrift.Binary.FieldStopLength() @@ -2588,6 +2736,15 @@ func (p *SearchTraceOApiRequest) fastWriteField100(buf []byte, w thrift.NocopyWr return offset } +func (p *SearchTraceOApiRequest) fastWriteField254(buf []byte, w thrift.NocopyWriter) int { + offset := 0 + if p.IsSetExtra() { + offset += thrift.Binary.WriteFieldBegin(buf[offset:], thrift.STRUCT, 254) + offset += p.Extra.FastWriteNocopy(buf[offset:], w) + } + return offset +} + func (p *SearchTraceOApiRequest) fastWriteField255(buf []byte, w thrift.NocopyWriter) int { offset := 0 if p.IsSetBase() { @@ -2674,6 +2831,15 @@ func (p *SearchTraceOApiRequest) field100Length() int { return l } +func (p *SearchTraceOApiRequest) field254Length() int { + l := 0 + if p.IsSetExtra() { + l += thrift.Binary.FieldBeginLength() + l += p.Extra.BLength() + } + return l +} + func (p *SearchTraceOApiRequest) field255Length() int { l := 0 if p.IsSetBase() { @@ -2734,6 +2900,15 @@ func (p *SearchTraceOApiRequest) DeepCopy(s interface{}) error { p.NeedOriginalTags = &tmp } + var _extra *Extra + if src.Extra != nil { + _extra = &Extra{} + if err := _extra.DeepCopy(src.Extra); err != nil { + return err + } + } + p.Extra = _extra + var _base *base.Base if src.Base != nil { _base = &base.Base{} @@ -3354,6 +3529,20 @@ func (p *SearchTraceTreeOApiRequest) FastRead(buf []byte) (int, error) { goto SkipFieldError } } + case 254: + if fieldTypeId == thrift.STRUCT { + l, err = p.FastReadField254(buf[offset:]) + offset += l + if err != nil { + goto ReadFieldError + } + } else { + l, err = thrift.Binary.Skip(buf[offset:], fieldTypeId) + offset += l + if err != nil { + goto SkipFieldError + } + } case 255: if fieldTypeId == thrift.STRUCT { l, err = p.FastReadField255(buf[offset:]) @@ -3488,6 +3677,18 @@ func (p *SearchTraceTreeOApiRequest) FastReadField10(buf []byte) (int, error) { return offset, nil } +func (p *SearchTraceTreeOApiRequest) FastReadField254(buf []byte) (int, error) { + offset := 0 + _field := NewExtra() + if l, err := _field.FastRead(buf[offset:]); err != nil { + return offset, err + } else { + offset += l + } + p.Extra = _field + return offset, nil +} + func (p *SearchTraceTreeOApiRequest) FastReadField255(buf []byte) (int, error) { offset := 0 _field := base.NewBase() @@ -3514,6 +3715,7 @@ func (p *SearchTraceTreeOApiRequest) FastWriteNocopy(buf []byte, w thrift.Nocopy offset += p.fastWriteField3(buf[offset:], w) offset += p.fastWriteField8(buf[offset:], w) offset += p.fastWriteField10(buf[offset:], w) + offset += p.fastWriteField254(buf[offset:], w) offset += p.fastWriteField255(buf[offset:], w) } offset += thrift.Binary.WriteFieldStop(buf[offset:]) @@ -3530,6 +3732,7 @@ func (p *SearchTraceTreeOApiRequest) BLength() int { l += p.field6Length() l += p.field8Length() l += p.field10Length() + l += p.field254Length() l += p.field255Length() } l += thrift.Binary.FieldStopLength() @@ -3597,6 +3800,15 @@ func (p *SearchTraceTreeOApiRequest) fastWriteField10(buf []byte, w thrift.Nocop return offset } +func (p *SearchTraceTreeOApiRequest) fastWriteField254(buf []byte, w thrift.NocopyWriter) int { + offset := 0 + if p.IsSetExtra() { + offset += thrift.Binary.WriteFieldBegin(buf[offset:], thrift.STRUCT, 254) + offset += p.Extra.FastWriteNocopy(buf[offset:], w) + } + return offset +} + func (p *SearchTraceTreeOApiRequest) fastWriteField255(buf []byte, w thrift.NocopyWriter) int { offset := 0 if p.IsSetBase() { @@ -3667,6 +3879,15 @@ func (p *SearchTraceTreeOApiRequest) field10Length() int { return l } +func (p *SearchTraceTreeOApiRequest) field254Length() int { + l := 0 + if p.IsSetExtra() { + l += thrift.Binary.FieldBeginLength() + l += p.Extra.BLength() + } + return l +} + func (p *SearchTraceTreeOApiRequest) field255Length() int { l := 0 if p.IsSetBase() { @@ -3721,6 +3942,15 @@ func (p *SearchTraceTreeOApiRequest) DeepCopy(s interface{}) error { } p.Filters = _filters + var _extra *Extra + if src.Extra != nil { + _extra = &Extra{} + if err := _extra.DeepCopy(src.Extra); err != nil { + return err + } + } + p.Extra = _extra + var _base *base.Base if src.Base != nil { _base = &base.Base{} @@ -4387,6 +4617,20 @@ func (p *ListSpansOApiRequest) FastRead(buf []byte) (int, error) { goto SkipFieldError } } + case 254: + if fieldTypeId == thrift.STRUCT { + l, err = p.FastReadField254(buf[offset:]) + offset += l + if err != nil { + goto ReadFieldError + } + } else { + l, err = thrift.Binary.Skip(buf[offset:], fieldTypeId) + offset += l + if err != nil { + goto SkipFieldError + } + } case 255: if fieldTypeId == thrift.STRUCT { l, err = p.FastReadField255(buf[offset:]) @@ -4584,6 +4828,18 @@ func (p *ListSpansOApiRequest) FastReadField100(buf []byte) (int, error) { return offset, nil } +func (p *ListSpansOApiRequest) FastReadField254(buf []byte) (int, error) { + offset := 0 + _field := NewExtra() + if l, err := _field.FastRead(buf[offset:]); err != nil { + return offset, err + } else { + offset += l + } + p.Extra = _field + return offset, nil +} + func (p *ListSpansOApiRequest) FastReadField255(buf []byte) (int, error) { offset := 0 _field := base.NewBase() @@ -4613,6 +4869,7 @@ func (p *ListSpansOApiRequest) FastWriteNocopy(buf []byte, w thrift.NocopyWriter offset += p.fastWriteField7(buf[offset:], w) offset += p.fastWriteField8(buf[offset:], w) offset += p.fastWriteField9(buf[offset:], w) + offset += p.fastWriteField254(buf[offset:], w) offset += p.fastWriteField255(buf[offset:], w) } offset += thrift.Binary.WriteFieldStop(buf[offset:]) @@ -4632,6 +4889,7 @@ func (p *ListSpansOApiRequest) BLength() int { l += p.field8Length() l += p.field9Length() l += p.field100Length() + l += p.field254Length() l += p.field255Length() } l += thrift.Binary.FieldStopLength() @@ -4729,6 +4987,15 @@ func (p *ListSpansOApiRequest) fastWriteField100(buf []byte, w thrift.NocopyWrit return offset } +func (p *ListSpansOApiRequest) fastWriteField254(buf []byte, w thrift.NocopyWriter) int { + offset := 0 + if p.IsSetExtra() { + offset += thrift.Binary.WriteFieldBegin(buf[offset:], thrift.STRUCT, 254) + offset += p.Extra.FastWriteNocopy(buf[offset:], w) + } + return offset +} + func (p *ListSpansOApiRequest) fastWriteField255(buf []byte, w thrift.NocopyWriter) int { offset := 0 if p.IsSetBase() { @@ -4826,6 +5093,15 @@ func (p *ListSpansOApiRequest) field100Length() int { return l } +func (p *ListSpansOApiRequest) field254Length() int { + l := 0 + if p.IsSetExtra() { + l += thrift.Binary.FieldBeginLength() + l += p.Extra.BLength() + } + return l +} + func (p *ListSpansOApiRequest) field255Length() int { l := 0 if p.IsSetBase() { @@ -4899,6 +5175,15 @@ func (p *ListSpansOApiRequest) DeepCopy(s interface{}) error { p.NeedOriginalTags = &tmp } + var _extra *Extra + if src.Extra != nil { + _extra = &Extra{} + if err := _extra.DeepCopy(src.Extra); err != nil { + return err + } + } + p.Extra = _extra + var _base *base.Base if src.Base != nil { _base = &base.Base{} @@ -5562,6 +5847,20 @@ func (p *ListPreSpanOApiRequest) FastRead(buf []byte) (int, error) { goto SkipFieldError } } + case 254: + if fieldTypeId == thrift.STRUCT { + l, err = p.FastReadField254(buf[offset:]) + offset += l + if err != nil { + goto ReadFieldError + } + } else { + l, err = thrift.Binary.Skip(buf[offset:], fieldTypeId) + offset += l + if err != nil { + goto SkipFieldError + } + } case 255: if fieldTypeId == thrift.STRUCT { l, err = p.FastReadField255(buf[offset:]) @@ -5694,6 +5993,18 @@ func (p *ListPreSpanOApiRequest) FastReadField6(buf []byte) (int, error) { return offset, nil } +func (p *ListPreSpanOApiRequest) FastReadField254(buf []byte) (int, error) { + offset := 0 + _field := NewExtra() + if l, err := _field.FastRead(buf[offset:]); err != nil { + return offset, err + } else { + offset += l + } + p.Extra = _field + return offset, nil +} + func (p *ListPreSpanOApiRequest) FastReadField255(buf []byte) (int, error) { offset := 0 _field := base.NewBase() @@ -5719,6 +6030,7 @@ func (p *ListPreSpanOApiRequest) FastWriteNocopy(buf []byte, w thrift.NocopyWrit offset += p.fastWriteField4(buf[offset:], w) offset += p.fastWriteField5(buf[offset:], w) offset += p.fastWriteField6(buf[offset:], w) + offset += p.fastWriteField254(buf[offset:], w) offset += p.fastWriteField255(buf[offset:], w) } offset += thrift.Binary.WriteFieldStop(buf[offset:]) @@ -5734,6 +6046,7 @@ func (p *ListPreSpanOApiRequest) BLength() int { l += p.field4Length() l += p.field5Length() l += p.field6Length() + l += p.field254Length() l += p.field255Length() } l += thrift.Binary.FieldStopLength() @@ -5788,6 +6101,15 @@ func (p *ListPreSpanOApiRequest) fastWriteField6(buf []byte, w thrift.NocopyWrit return offset } +func (p *ListPreSpanOApiRequest) fastWriteField254(buf []byte, w thrift.NocopyWriter) int { + offset := 0 + if p.IsSetExtra() { + offset += thrift.Binary.WriteFieldBegin(buf[offset:], thrift.STRUCT, 254) + offset += p.Extra.FastWriteNocopy(buf[offset:], w) + } + return offset +} + func (p *ListPreSpanOApiRequest) fastWriteField255(buf []byte, w thrift.NocopyWriter) int { offset := 0 if p.IsSetBase() { @@ -5845,6 +6167,15 @@ func (p *ListPreSpanOApiRequest) field6Length() int { return l } +func (p *ListPreSpanOApiRequest) field254Length() int { + l := 0 + if p.IsSetExtra() { + l += thrift.Binary.FieldBeginLength() + l += p.Extra.BLength() + } + return l +} + func (p *ListPreSpanOApiRequest) field255Length() int { l := 0 if p.IsSetBase() { @@ -5889,6 +6220,15 @@ func (p *ListPreSpanOApiRequest) DeepCopy(s interface{}) error { p.PlatformType = &tmp } + var _extra *Extra + if src.Extra != nil { + _extra = &Extra{} + if err := _extra.DeepCopy(src.Extra); err != nil { + return err + } + } + p.Extra = _extra + var _base *base.Base if src.Base != nil { _base = &base.Base{} diff --git a/backend/modules/observability/application/openapi.go b/backend/modules/observability/application/openapi.go index 461b5630c..43cda9953 100644 --- a/backend/modules/observability/application/openapi.go +++ b/backend/modules/observability/application/openapi.go @@ -499,8 +499,12 @@ func (o *OpenAPIApplication) SearchTraceOApi(ctx context.Context, req *openapi.S errCode := 0 defer func() { if req != nil { + src := "" + if req.Extra != nil { + src = req.Extra.GetSrc() + } o.metrics.EmitTraceOapi("SearchTraceOApi", req.WorkspaceID, req.GetPlatformType(), "", int64(spansSize), errCode, st, err != nil) - o.collector.CollectTraceOpenAPIEvent(ctx, "SearchTraceOApi", req.WorkspaceID, req.GetPlatformType(), "", int64(spansSize), errCode, st, err != nil) + o.collector.CollectTraceOpenAPIEvent(ctx, "SearchTraceOApi", req.WorkspaceID, req.GetPlatformType(), "", src, int64(spansSize), errCode, st, err != nil) } }() @@ -602,8 +606,12 @@ func (o *OpenAPIApplication) SearchTraceTreeOApi(ctx context.Context, req *opena errCode := 0 defer func() { if req != nil { + src := "" + if req.Extra != nil { + src = req.Extra.GetSrc() + } o.metrics.EmitTraceOapi("SearchTraceTreeOApi", req.GetWorkspaceID(), req.GetPlatformType(), "", int64(spansSize), errCode, st, err != nil) - o.collector.CollectTraceOpenAPIEvent(ctx, "SearchTraceTreeOApi", req.GetWorkspaceID(), req.GetPlatformType(), "", int64(spansSize), errCode, st, err != nil) + o.collector.CollectTraceOpenAPIEvent(ctx, "SearchTraceTreeOApi", req.GetWorkspaceID(), req.GetPlatformType(), "", src, int64(spansSize), errCode, st, err != nil) } }() @@ -713,8 +721,12 @@ func (o *OpenAPIApplication) ListSpansOApi(ctx context.Context, req *openapi.Lis resp := openapi.NewListSpansOApiResponse() defer func() { if req != nil { + src := "" + if req.Extra != nil { + src = req.Extra.GetSrc() + } o.metrics.EmitTraceOapi("ListSpansOApi", req.WorkspaceID, req.GetPlatformType(), req.GetSpanListType(), int64(spansSize), errCode, st, err != nil) - o.collector.CollectTraceOpenAPIEvent(ctx, "ListSpansOApi", req.WorkspaceID, req.GetPlatformType(), req.GetSpanListType(), int64(spansSize), errCode, st, err != nil) + o.collector.CollectTraceOpenAPIEvent(ctx, "ListSpansOApi", req.WorkspaceID, req.GetPlatformType(), req.GetSpanListType(), src, int64(spansSize), errCode, st, err != nil) } }() if err = o.validateListSpansOApi(ctx, req); err != nil { @@ -824,8 +836,12 @@ func (o *OpenAPIApplication) ListPreSpanOApi(ctx context.Context, req *openapi.L st := time.Now() errCode := 0 defer func() { + src := "" + if req.Extra != nil { + src = req.Extra.GetSrc() + } o.metrics.EmitTraceOapi("ListPreSpanOApi", req.WorkspaceID, "", "", 0, errCode, st, err != nil) - o.collector.CollectTraceOpenAPIEvent(ctx, "ListPreSpanOApi", req.WorkspaceID, "", "", 0, errCode, st, err != nil) + o.collector.CollectTraceOpenAPIEvent(ctx, "ListPreSpanOApi", req.WorkspaceID, "", "", src, 0, errCode, st, err != nil) }() if err = o.validateListPreSpanOApiReq(ctx, req); err != nil { @@ -920,7 +936,7 @@ func (o *OpenAPIApplication) ListTracesOApi(ctx context.Context, req *openapi.Li errCode := 0 defer func() { o.metrics.EmitTraceOapi("ListTracesOApi", req.WorkspaceID, "", "", 0, errCode, st, err != nil) - o.collector.CollectTraceOpenAPIEvent(ctx, "ListTracesOApi", req.WorkspaceID, "", "", 0, errCode, st, err != nil) + o.collector.CollectTraceOpenAPIEvent(ctx, "ListTracesOApi", req.WorkspaceID, "", "", "", 0, errCode, st, err != nil) }() if err = o.validateListTracesOApiReq(ctx, req); err != nil { diff --git a/backend/modules/observability/application/openapi_pre_span_test.go b/backend/modules/observability/application/openapi_pre_span_test.go index 08a6218b6..6371263da 100644 --- a/backend/modules/observability/application/openapi_pre_span_test.go +++ b/backend/modules/observability/application/openapi_pre_span_test.go @@ -142,7 +142,7 @@ func TestOpenAPIApplication_ListPreSpanOApi(t *testing.T) { // 公共期望:允许速率 traceCfg.EXPECT().GetQueryMaxQPS(gomock.Any(), gomock.Any()).Return(10, nil).AnyTimes() metricsProv.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() - collectorProv.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + collectorProv.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() // 成功场景 auth.EXPECT().CheckQueryPermission(gomock.Any(), "1", gomock.Any()).Return(nil) @@ -216,7 +216,7 @@ func TestOpenAPIApplication_ListPreSpanOApi_NoPermission(t *testing.T) { // 公共期望:允许速率 traceCfg.EXPECT().GetQueryMaxQPS(gomock.Any(), gomock.Any()).Return(10, nil).AnyTimes() metricsProv.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() - collectorProv.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + collectorProv.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() // 无权限场景 auth.EXPECT().CheckQueryPermission(gomock.Any(), "1", gomock.Any()).Return(errors.New("permission denied")) diff --git a/backend/modules/observability/application/openapi_test.go b/backend/modules/observability/application/openapi_test.go index 691e3f7ec..5f6cb5012 100755 --- a/backend/modules/observability/application/openapi_test.go +++ b/backend/modules/observability/application/openapi_test.go @@ -1896,7 +1896,7 @@ func TestOpenAPIApplication_SearchTraceOApi_Success(t *testing.T) { Spans: []*loop_span.Span{{SpanID: "test"}}, }, nil) metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() - collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() app := &OpenAPIApplication{ traceService: traceServiceMock, @@ -1947,7 +1947,7 @@ func TestOpenAPIApplication_SearchTraceOApi_Success(t *testing.T) { rateLimiter.EXPECT().AllowN(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(&limiter.Result{Allowed: false}, nil) traceConfigMock.EXPECT().GetQueryMaxQPS(gomock.Any(), gomock.Any()).Return(10, nil) metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() - collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() app := &OpenAPIApplication{ traceService: traceServiceMock, @@ -2243,7 +2243,7 @@ func TestOpenAPIApplication_SearchTraceTreeOApi(t *testing.T) { Spans: []*loop_span.Span{{SpanID: "test"}}, }, nil) metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() - collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() app := &OpenAPIApplication{ traceService: traceServiceMock, @@ -2287,7 +2287,7 @@ func TestOpenAPIApplication_SearchTraceTreeOApi(t *testing.T) { // Set expectations for the calls triggered inside the deferred function. metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() - collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() app := &OpenAPIApplication{ metrics: metricsMock, @@ -2319,7 +2319,7 @@ func TestOpenAPIApplication_SearchTraceTreeOApi(t *testing.T) { authMock.EXPECT().CheckQueryPermission(gomock.Any(), "123", "platform").Return(assert.AnError) metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() - collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() app := &OpenAPIApplication{ auth: authMock, @@ -2358,7 +2358,7 @@ func TestOpenAPIApplication_SearchTraceTreeOApi(t *testing.T) { rateLimiter.EXPECT().AllowN(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(&limiter.Result{Allowed: false}, nil) traceConfigMock.EXPECT().GetQueryMaxQPS(gomock.Any(), gomock.Any()).Return(10, nil) metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() - collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() app := &OpenAPIApplication{ auth: authMock, @@ -2403,7 +2403,7 @@ func TestOpenAPIApplication_SearchTraceTreeOApi(t *testing.T) { tenantMock.EXPECT().GetOAPIQueryTenants(gomock.Any(), gomock.Any()).Return([]string{}) // Empty tenants should trigger an error. workspaceMock.EXPECT().GetThirdPartyQueryWorkSpaceID(gomock.Any(), int64(123)).Return("third-party-123") metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() - collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() app := &OpenAPIApplication{ auth: authMock, @@ -2454,7 +2454,7 @@ func TestOpenAPIApplication_SearchTraceTreeOApi(t *testing.T) { tenantMock.EXPECT().GetOAPIQueryTenants(gomock.Any(), gomock.Any()).Return([]string{"tenant1", "tenant2"}) traceServiceMock.EXPECT().SearchTraceOApi(gomock.Any(), gomock.Any()).Return(nil, assert.AnError) metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() - collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() app := &OpenAPIApplication{ traceService: traceServiceMock, @@ -2516,7 +2516,7 @@ func TestOpenAPIApplication_ListSpansOApi(t *testing.T) { HasMore: true, }, nil) metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() - collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() app := &OpenAPIApplication{ traceService: traceServiceMock, @@ -2582,7 +2582,7 @@ func TestOpenAPIApplication_ListTracesOApi(t *testing.T) { Infos: []*loop_span.TraceAdvanceInfo{{TraceId: "trace123"}}, }, nil).AnyTimes() metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() - collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() app := &OpenAPIApplication{ traceService: traceServiceMock, @@ -2628,7 +2628,7 @@ func TestOpenAPIApplication_ListTracesOApi(t *testing.T) { // 设置期望 - 这些会在defer函数中被调用 metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() - collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() app := &OpenAPIApplication{ metrics: metricsMock, diff --git a/backend/modules/observability/domain/component/collector/event_collector.go b/backend/modules/observability/domain/component/collector/event_collector.go index 4a1bd7a50..cb82e7799 100644 --- a/backend/modules/observability/domain/component/collector/event_collector.go +++ b/backend/modules/observability/domain/component/collector/event_collector.go @@ -9,5 +9,5 @@ import ( //go:generate mockgen -destination=mocks/event_collector.go -package=mocks . ICollectorProvider type ICollectorProvider interface { - CollectTraceOpenAPIEvent(ctx context.Context, method string, workspaceId int64, platformType, spanListType string, spanSize int64, errorCode int, start time.Time, isError bool) + CollectTraceOpenAPIEvent(ctx context.Context, method string, workspaceId int64, platformType, spanListType, src string, spanSize int64, errorCode int, start time.Time, isError bool) } diff --git a/backend/modules/observability/domain/component/collector/mocks/event_collector.go b/backend/modules/observability/domain/component/collector/mocks/event_collector.go index 32863623a..11c218315 100644 --- a/backend/modules/observability/domain/component/collector/mocks/event_collector.go +++ b/backend/modules/observability/domain/component/collector/mocks/event_collector.go @@ -42,13 +42,13 @@ func (m *MockICollectorProvider) EXPECT() *MockICollectorProviderMockRecorder { } // CollectTraceOpenAPIEvent mocks base method. -func (m *MockICollectorProvider) CollectTraceOpenAPIEvent(ctx context.Context, method string, workspaceId int64, platformType, spanListType string, spanSize int64, errorCode int, start time.Time, isError bool) { +func (m *MockICollectorProvider) CollectTraceOpenAPIEvent(ctx context.Context, method string, workspaceId int64, platformType, spanListType, src string, spanSize int64, errorCode int, start time.Time, isError bool) { m.ctrl.T.Helper() - m.ctrl.Call(m, "CollectTraceOpenAPIEvent", ctx, method, workspaceId, platformType, spanListType, spanSize, errorCode, start, isError) + m.ctrl.Call(m, "CollectTraceOpenAPIEvent", ctx, method, workspaceId, platformType, spanListType, src, spanSize, errorCode, start, isError) } // CollectTraceOpenAPIEvent indicates an expected call of CollectTraceOpenAPIEvent. -func (mr *MockICollectorProviderMockRecorder) CollectTraceOpenAPIEvent(ctx, method, workspaceId, platformType, spanListType, spanSize, errorCode, start, isError any) *gomock.Call { +func (mr *MockICollectorProviderMockRecorder) CollectTraceOpenAPIEvent(ctx, method, workspaceId, platformType, spanListType, src, spanSize, errorCode, start, isError any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CollectTraceOpenAPIEvent", reflect.TypeOf((*MockICollectorProvider)(nil).CollectTraceOpenAPIEvent), ctx, method, workspaceId, platformType, spanListType, spanSize, errorCode, start, isError) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CollectTraceOpenAPIEvent", reflect.TypeOf((*MockICollectorProvider)(nil).CollectTraceOpenAPIEvent), ctx, method, workspaceId, platformType, spanListType, src, spanSize, errorCode, start, isError) } diff --git a/backend/modules/observability/infra/collector/event_collector.go b/backend/modules/observability/infra/collector/event_collector.go index a6e925e9e..9d8924869 100644 --- a/backend/modules/observability/infra/collector/event_collector.go +++ b/backend/modules/observability/infra/collector/event_collector.go @@ -15,5 +15,5 @@ func NewEventCollectorProvider() collector.ICollectorProvider { return &EventCollectorProviderImpl{} } -func (p *EventCollectorProviderImpl) CollectTraceOpenAPIEvent(ctx context.Context, method string, workspaceId int64, platformType, spanListType string, spanSize int64, errorCode int, start time.Time, isError bool) { +func (p *EventCollectorProviderImpl) CollectTraceOpenAPIEvent(ctx context.Context, method string, workspaceId int64, platformType, spanListType, src string, spanSize int64, errorCode int, start time.Time, isError bool) { } diff --git a/idl/thrift/coze/loop/observability/coze.loop.observability.openapi.thrift b/idl/thrift/coze/loop/observability/coze.loop.observability.openapi.thrift index 4ad4e23fa..14fd9e963 100644 --- a/idl/thrift/coze/loop/observability/coze.loop.observability.openapi.thrift +++ b/idl/thrift/coze/loop/observability/coze.loop.observability.openapi.thrift @@ -8,6 +8,10 @@ include "./domain/common.thrift" include "./domain/filter.thrift" include "coze.loop.observability.trace.thrift" +struct Extra { + 1: optional string src (api.header="src") +} + struct IngestTracesRequest { 1: optional list spans (api.body='spans') @@ -77,6 +81,7 @@ struct SearchTraceOApiRequest { 9: optional list span_ids (api.body="span_ids") 100: optional bool need_original_tags (api.body='need_original_tags') + 254: optional Extra extra 255: optional base.Base Base } @@ -102,6 +107,7 @@ struct SearchTraceTreeOApiRequest { 8: optional common.PlatformType platform_type (api.body="platform_type") 10: optional filter.FilterFields filters (api.body="filters") + 254: optional Extra extra 255: optional base.Base Base } @@ -131,6 +137,7 @@ struct ListSpansOApiRequest { 100: optional bool need_original_tags (api.body='need_original_tags') + 254: optional Extra extra 255: optional base.Base Base } @@ -157,6 +164,7 @@ struct ListPreSpanOApiRequest { 5: optional string previous_response_id (api.body="previous_response_id") 6: optional common.PlatformType platform_type (api.body="platform_type") + 254: optional Extra extra 255: optional base.Base Base } From 3b9060c933684403208767b0f248c98665f60d1e Mon Sep 17 00:00:00 2001 From: taoyifan Date: Mon, 2 Mar 2026 19:17:28 +0800 Subject: [PATCH 2/4] update idl. Change-Id: I367fa09e23fe05f4f8d015d70fbd3e57afad5183 --- .../observability/coze.loop.observability.openapi.thrift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/idl/thrift/coze/loop/observability/coze.loop.observability.openapi.thrift b/idl/thrift/coze/loop/observability/coze.loop.observability.openapi.thrift index 14fd9e963..2af680110 100644 --- a/idl/thrift/coze/loop/observability/coze.loop.observability.openapi.thrift +++ b/idl/thrift/coze/loop/observability/coze.loop.observability.openapi.thrift @@ -81,7 +81,7 @@ struct SearchTraceOApiRequest { 9: optional list span_ids (api.body="span_ids") 100: optional bool need_original_tags (api.body='need_original_tags') - 254: optional Extra extra + 254: optional Extra extra (agw.source="not_body_struct") 255: optional base.Base Base } @@ -107,7 +107,7 @@ struct SearchTraceTreeOApiRequest { 8: optional common.PlatformType platform_type (api.body="platform_type") 10: optional filter.FilterFields filters (api.body="filters") - 254: optional Extra extra + 254: optional Extra extra (agw.source="not_body_struct") 255: optional base.Base Base } @@ -137,7 +137,7 @@ struct ListSpansOApiRequest { 100: optional bool need_original_tags (api.body='need_original_tags') - 254: optional Extra extra + 254: optional Extra extra (agw.source="not_body_struct") 255: optional base.Base Base } @@ -164,7 +164,7 @@ struct ListPreSpanOApiRequest { 5: optional string previous_response_id (api.body="previous_response_id") 6: optional common.PlatformType platform_type (api.body="platform_type") - 254: optional Extra extra + 254: optional Extra extra (agw.source="not_body_struct") 255: optional base.Base Base } From d4351320f1337c8c3bd8fcca45337cd429b4c163 Mon Sep 17 00:00:00 2001 From: taoyifan Date: Mon, 2 Mar 2026 20:04:04 +0800 Subject: [PATCH 3/4] Add ut. Change-Id: I766b4cf718da0468d7e195802a02554304c331f7 --- .../observability/application/openapi_test.go | 165 ++++++++++++++++++ 1 file changed, 165 insertions(+) diff --git a/backend/modules/observability/application/openapi_test.go b/backend/modules/observability/application/openapi_test.go index 5f6cb5012..e81c14abe 100755 --- a/backend/modules/observability/application/openapi_test.go +++ b/backend/modules/observability/application/openapi_test.go @@ -1977,6 +1977,61 @@ func TestOpenAPIApplication_SearchTraceOApi_Success(t *testing.T) { assert.Error(t, err) assert.Nil(t, resp) }) + + t.Run("successful search with nil extra", func(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + traceServiceMock := servicemocks.NewMockITraceService(ctrl) + authMock := rpcmocks.NewMockIAuthProvider(ctrl) + authMock.EXPECT().GetClaim(gomock.Any()).Return(nil).AnyTimes() + benefitMock := benefitmocks.NewMockIBenefitService(ctrl) + tenantMock := tenantmocks.NewMockITenantProvider(ctrl) + workspaceMock := workspacemocks.NewMockIWorkSpaceProvider(ctrl) + rateLimiter := limitermocks.NewMockIRateLimiter(ctrl) + traceConfigMock := configmocks.NewMockITraceConfig(ctrl) + metricsMock := metricsmocks.NewMockITraceMetrics(ctrl) + collectorMock := collectormocks.NewMockICollectorProvider(ctrl) + + authMock.EXPECT().CheckQueryPermission(gomock.Any(), "123", "platform").Return(nil) + rateLimiter.EXPECT().AllowN(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(&limiter.Result{Allowed: true}, nil) + traceConfigMock.EXPECT().GetQueryMaxQPS(gomock.Any(), gomock.Any()).Return(10, nil) + workspaceMock.EXPECT().GetThirdPartyQueryWorkSpaceID(gomock.Any(), int64(123)).Return("third-party-123") + tenantMock.EXPECT().GetOAPIQueryTenants(gomock.Any(), gomock.Any()).Return([]string{"tenant1", "tenant2"}) + traceServiceMock.EXPECT().SearchTraceOApi(gomock.Any(), gomock.Any()).Return(&service.SearchTraceOApiResp{ + Spans: []*loop_span.Span{{SpanID: "test"}}, + }, nil) + metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), "SearchTraceOApi", int64(123), gomock.Any(), gomock.Eq(""), gomock.Eq(""), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(1) + + app := &OpenAPIApplication{ + traceService: traceServiceMock, + auth: authMock, + benefit: benefitMock, + tenant: tenantMock, + workspace: workspaceMock, + rateLimiter: rateLimiter, + traceConfig: traceConfigMock, + metrics: metricsMock, + collector: collectorMock, + } + + now := time.Now().UnixMilli() + startTime := now - 3600000 + endTime := now + req := &openapi.SearchTraceOApiRequest{ + WorkspaceID: 123, + TraceID: ptr.Of("trace123"), + StartTime: startTime, + EndTime: endTime, + Limit: 10, + PlatformType: ptr.Of("platform"), + } + + resp, err := app.SearchTraceOApi(context.Background(), req) + assert.NoError(t, err) + assert.NotNil(t, resp) + }) } func TestOpenAPIApplication_validateSearchTraceOApiReq(t *testing.T) { @@ -2483,6 +2538,61 @@ func TestOpenAPIApplication_SearchTraceTreeOApi(t *testing.T) { assert.Error(t, err) assert.Nil(t, resp) }) + + t.Run("successful search trace tree with nil extra", func(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + traceServiceMock := servicemocks.NewMockITraceService(ctrl) + authMock := rpcmocks.NewMockIAuthProvider(ctrl) + authMock.EXPECT().GetClaim(gomock.Any()).Return(nil).AnyTimes() + benefitMock := benefitmocks.NewMockIBenefitService(ctrl) + tenantMock := tenantmocks.NewMockITenantProvider(ctrl) + workspaceMock := workspacemocks.NewMockIWorkSpaceProvider(ctrl) + rateLimiter := limitermocks.NewMockIRateLimiter(ctrl) + traceConfigMock := configmocks.NewMockITraceConfig(ctrl) + metricsMock := metricsmocks.NewMockITraceMetrics(ctrl) + collectorMock := collectormocks.NewMockICollectorProvider(ctrl) + + authMock.EXPECT().CheckQueryPermission(gomock.Any(), "123", "platform").Return(nil) + rateLimiter.EXPECT().AllowN(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(&limiter.Result{Allowed: true}, nil) + traceConfigMock.EXPECT().GetQueryMaxQPS(gomock.Any(), gomock.Any()).Return(10, nil) + workspaceMock.EXPECT().GetThirdPartyQueryWorkSpaceID(gomock.Any(), int64(123)).Return("third-party-123") + tenantMock.EXPECT().GetOAPIQueryTenants(gomock.Any(), gomock.Any()).Return([]string{"tenant1", "tenant2"}) + traceServiceMock.EXPECT().SearchTraceOApi(gomock.Any(), gomock.Any()).Return(&service.SearchTraceOApiResp{ + Spans: []*loop_span.Span{{SpanID: "test"}}, + }, nil) + metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), "SearchTraceTreeOApi", int64(123), gomock.Any(), gomock.Eq(""), gomock.Eq(""), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(1) + + app := &OpenAPIApplication{ + traceService: traceServiceMock, + auth: authMock, + benefit: benefitMock, + tenant: tenantMock, + workspace: workspaceMock, + rateLimiter: rateLimiter, + traceConfig: traceConfigMock, + metrics: metricsMock, + collector: collectorMock, + } + + now := time.Now().UnixMilli() + startTime := now - 3600000 + endTime := now + req := &openapi.SearchTraceTreeOApiRequest{ + WorkspaceID: ptr.Of(int64(123)), + TraceID: ptr.Of("trace123"), + StartTime: &startTime, + EndTime: &endTime, + Limit: 10, + PlatformType: ptr.Of(common.PlatformType("platform")), + } + + resp, err := app.SearchTraceTreeOApi(context.Background(), req) + assert.NoError(t, err) + assert.NotNil(t, resp) + }) } // Add unit tests for ListSpansOApi. @@ -2551,6 +2661,61 @@ func TestOpenAPIApplication_ListSpansOApi(t *testing.T) { assert.True(t, resp.Data.HasMore) assert.Equal(t, "next_token", resp.Data.NextPageToken) }) + + t.Run("successful list spans with nil extra", func(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + traceServiceMock := servicemocks.NewMockITraceService(ctrl) + authMock := rpcmocks.NewMockIAuthProvider(ctrl) + authMock.EXPECT().GetClaim(gomock.Any()).Return(nil).AnyTimes() + benefitMock := benefitmocks.NewMockIBenefitService(ctrl) + tenantMock := tenantmocks.NewMockITenantProvider(ctrl) + workspaceMock := workspacemocks.NewMockIWorkSpaceProvider(ctrl) + rateLimiter := limitermocks.NewMockIRateLimiter(ctrl) + traceConfigMock := configmocks.NewMockITraceConfig(ctrl) + metricsMock := metricsmocks.NewMockITraceMetrics(ctrl) + collectorMock := collectormocks.NewMockICollectorProvider(ctrl) + + authMock.EXPECT().CheckQueryPermission(gomock.Any(), "123", "platform").Return(nil) + rateLimiter.EXPECT().AllowN(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(&limiter.Result{Allowed: true}, nil) + traceConfigMock.EXPECT().GetQueryMaxQPS(gomock.Any(), gomock.Any()).Return(10, nil) + workspaceMock.EXPECT().GetThirdPartyQueryWorkSpaceID(gomock.Any(), int64(123)).Return("third-party-123") + tenantMock.EXPECT().GetOAPIQueryTenants(gomock.Any(), gomock.Any()).Return([]string{"tenant1", "tenant2"}) + traceServiceMock.EXPECT().ListSpansOApi(gomock.Any(), gomock.Any()).Return(&service.ListSpansOApiResp{ + Spans: []*loop_span.Span{{SpanID: "test"}}, + HasMore: true, + NextPageToken: "next_token", + }, nil) + metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), "ListSpansOApi", int64(123), gomock.Any(), gomock.Any(), gomock.Eq(""), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(1) + + app := &OpenAPIApplication{ + traceService: traceServiceMock, + auth: authMock, + benefit: benefitMock, + tenant: tenantMock, + workspace: workspaceMock, + rateLimiter: rateLimiter, + traceConfig: traceConfigMock, + metrics: metricsMock, + collector: collectorMock, + } + + now := time.Now().UnixMilli() + startTime := now - 3600000 + endTime := now + req := &openapi.ListSpansOApiRequest{ + WorkspaceID: 123, + StartTime: startTime, + EndTime: endTime, + PlatformType: ptr.Of(common.PlatformType("platform")), + } + + resp, err := app.ListSpansOApi(context.Background(), req) + assert.NoError(t, err) + assert.NotNil(t, resp) + }) } // 补充ListTracesOApi测试 From ec195fcb9687df82f908880badf3804a70e0c192 Mon Sep 17 00:00:00 2001 From: taoyifan Date: Mon, 2 Mar 2026 20:51:50 +0800 Subject: [PATCH 4/4] Add src in metrics. Change-Id: Id7fed1e456df83f0c45610e878a70891e3d9cdd6 --- .../observability/application/openapi.go | 10 +- .../application/openapi_pre_span_test.go | 4 +- .../observability/application/openapi_test.go | 198 ++---------------- .../domain/component/metrics/metrics.go | 2 +- .../domain/component/metrics/mocks/metrics.go | 8 +- .../observability/infra/metrics/metrics.go | 5 +- .../infra/metrics/metrics_test.go | 32 +-- 7 files changed, 57 insertions(+), 202 deletions(-) diff --git a/backend/modules/observability/application/openapi.go b/backend/modules/observability/application/openapi.go index 43cda9953..72a28e9e2 100644 --- a/backend/modules/observability/application/openapi.go +++ b/backend/modules/observability/application/openapi.go @@ -503,7 +503,7 @@ func (o *OpenAPIApplication) SearchTraceOApi(ctx context.Context, req *openapi.S if req.Extra != nil { src = req.Extra.GetSrc() } - o.metrics.EmitTraceOapi("SearchTraceOApi", req.WorkspaceID, req.GetPlatformType(), "", int64(spansSize), errCode, st, err != nil) + o.metrics.EmitTraceOapi("SearchTraceOApi", req.WorkspaceID, req.GetPlatformType(), "", src, int64(spansSize), errCode, st, err != nil) o.collector.CollectTraceOpenAPIEvent(ctx, "SearchTraceOApi", req.WorkspaceID, req.GetPlatformType(), "", src, int64(spansSize), errCode, st, err != nil) } }() @@ -610,7 +610,7 @@ func (o *OpenAPIApplication) SearchTraceTreeOApi(ctx context.Context, req *opena if req.Extra != nil { src = req.Extra.GetSrc() } - o.metrics.EmitTraceOapi("SearchTraceTreeOApi", req.GetWorkspaceID(), req.GetPlatformType(), "", int64(spansSize), errCode, st, err != nil) + o.metrics.EmitTraceOapi("SearchTraceTreeOApi", req.GetWorkspaceID(), req.GetPlatformType(), "", src, int64(spansSize), errCode, st, err != nil) o.collector.CollectTraceOpenAPIEvent(ctx, "SearchTraceTreeOApi", req.GetWorkspaceID(), req.GetPlatformType(), "", src, int64(spansSize), errCode, st, err != nil) } }() @@ -725,7 +725,7 @@ func (o *OpenAPIApplication) ListSpansOApi(ctx context.Context, req *openapi.Lis if req.Extra != nil { src = req.Extra.GetSrc() } - o.metrics.EmitTraceOapi("ListSpansOApi", req.WorkspaceID, req.GetPlatformType(), req.GetSpanListType(), int64(spansSize), errCode, st, err != nil) + o.metrics.EmitTraceOapi("ListSpansOApi", req.WorkspaceID, req.GetPlatformType(), req.GetSpanListType(), src, int64(spansSize), errCode, st, err != nil) o.collector.CollectTraceOpenAPIEvent(ctx, "ListSpansOApi", req.WorkspaceID, req.GetPlatformType(), req.GetSpanListType(), src, int64(spansSize), errCode, st, err != nil) } }() @@ -840,7 +840,7 @@ func (o *OpenAPIApplication) ListPreSpanOApi(ctx context.Context, req *openapi.L if req.Extra != nil { src = req.Extra.GetSrc() } - o.metrics.EmitTraceOapi("ListPreSpanOApi", req.WorkspaceID, "", "", 0, errCode, st, err != nil) + o.metrics.EmitTraceOapi("ListPreSpanOApi", req.WorkspaceID, "", "", src, 0, errCode, st, err != nil) o.collector.CollectTraceOpenAPIEvent(ctx, "ListPreSpanOApi", req.WorkspaceID, "", "", src, 0, errCode, st, err != nil) }() @@ -935,7 +935,7 @@ func (o *OpenAPIApplication) ListTracesOApi(ctx context.Context, req *openapi.Li st := time.Now() errCode := 0 defer func() { - o.metrics.EmitTraceOapi("ListTracesOApi", req.WorkspaceID, "", "", 0, errCode, st, err != nil) + o.metrics.EmitTraceOapi("ListTracesOApi", req.WorkspaceID, "", "", "", 0, errCode, st, err != nil) o.collector.CollectTraceOpenAPIEvent(ctx, "ListTracesOApi", req.WorkspaceID, "", "", "", 0, errCode, st, err != nil) }() diff --git a/backend/modules/observability/application/openapi_pre_span_test.go b/backend/modules/observability/application/openapi_pre_span_test.go index 6371263da..eecfebd4b 100644 --- a/backend/modules/observability/application/openapi_pre_span_test.go +++ b/backend/modules/observability/application/openapi_pre_span_test.go @@ -141,7 +141,7 @@ func TestOpenAPIApplication_ListPreSpanOApi(t *testing.T) { // 公共期望:允许速率 traceCfg.EXPECT().GetQueryMaxQPS(gomock.Any(), gomock.Any()).Return(10, nil).AnyTimes() - metricsProv.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + metricsProv.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() collectorProv.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() // 成功场景 @@ -215,7 +215,7 @@ func TestOpenAPIApplication_ListPreSpanOApi_NoPermission(t *testing.T) { // 公共期望:允许速率 traceCfg.EXPECT().GetQueryMaxQPS(gomock.Any(), gomock.Any()).Return(10, nil).AnyTimes() - metricsProv.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + metricsProv.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() collectorProv.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() // 无权限场景 diff --git a/backend/modules/observability/application/openapi_test.go b/backend/modules/observability/application/openapi_test.go index e81c14abe..cc9e6f359 100755 --- a/backend/modules/observability/application/openapi_test.go +++ b/backend/modules/observability/application/openapi_test.go @@ -1895,7 +1895,7 @@ func TestOpenAPIApplication_SearchTraceOApi_Success(t *testing.T) { traceServiceMock.EXPECT().SearchTraceOApi(gomock.Any(), gomock.Any()).Return(&service.SearchTraceOApiResp{ Spans: []*loop_span.Span{{SpanID: "test"}}, }, nil) - metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() app := &OpenAPIApplication{ @@ -1920,6 +1920,7 @@ func TestOpenAPIApplication_SearchTraceOApi_Success(t *testing.T) { EndTime: endTime, Limit: 10, PlatformType: ptr.Of("platform"), + Extra: &openapi.Extra{Src: ptr.Of("test")}, } resp, err := app.SearchTraceOApi(context.Background(), req) @@ -1946,7 +1947,7 @@ func TestOpenAPIApplication_SearchTraceOApi_Success(t *testing.T) { authMock.EXPECT().CheckQueryPermission(gomock.Any(), "123", "platform").Return(nil) rateLimiter.EXPECT().AllowN(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(&limiter.Result{Allowed: false}, nil) traceConfigMock.EXPECT().GetQueryMaxQPS(gomock.Any(), gomock.Any()).Return(10, nil) - metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() app := &OpenAPIApplication{ @@ -1971,67 +1972,13 @@ func TestOpenAPIApplication_SearchTraceOApi_Success(t *testing.T) { EndTime: endTime, Limit: 10, PlatformType: ptr.Of("platform"), + Extra: &openapi.Extra{Src: ptr.Of("test")}, } resp, err := app.SearchTraceOApi(context.Background(), req) assert.Error(t, err) assert.Nil(t, resp) }) - - t.Run("successful search with nil extra", func(t *testing.T) { - ctrl := gomock.NewController(t) - defer ctrl.Finish() - - traceServiceMock := servicemocks.NewMockITraceService(ctrl) - authMock := rpcmocks.NewMockIAuthProvider(ctrl) - authMock.EXPECT().GetClaim(gomock.Any()).Return(nil).AnyTimes() - benefitMock := benefitmocks.NewMockIBenefitService(ctrl) - tenantMock := tenantmocks.NewMockITenantProvider(ctrl) - workspaceMock := workspacemocks.NewMockIWorkSpaceProvider(ctrl) - rateLimiter := limitermocks.NewMockIRateLimiter(ctrl) - traceConfigMock := configmocks.NewMockITraceConfig(ctrl) - metricsMock := metricsmocks.NewMockITraceMetrics(ctrl) - collectorMock := collectormocks.NewMockICollectorProvider(ctrl) - - authMock.EXPECT().CheckQueryPermission(gomock.Any(), "123", "platform").Return(nil) - rateLimiter.EXPECT().AllowN(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(&limiter.Result{Allowed: true}, nil) - traceConfigMock.EXPECT().GetQueryMaxQPS(gomock.Any(), gomock.Any()).Return(10, nil) - workspaceMock.EXPECT().GetThirdPartyQueryWorkSpaceID(gomock.Any(), int64(123)).Return("third-party-123") - tenantMock.EXPECT().GetOAPIQueryTenants(gomock.Any(), gomock.Any()).Return([]string{"tenant1", "tenant2"}) - traceServiceMock.EXPECT().SearchTraceOApi(gomock.Any(), gomock.Any()).Return(&service.SearchTraceOApiResp{ - Spans: []*loop_span.Span{{SpanID: "test"}}, - }, nil) - metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() - collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), "SearchTraceOApi", int64(123), gomock.Any(), gomock.Eq(""), gomock.Eq(""), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(1) - - app := &OpenAPIApplication{ - traceService: traceServiceMock, - auth: authMock, - benefit: benefitMock, - tenant: tenantMock, - workspace: workspaceMock, - rateLimiter: rateLimiter, - traceConfig: traceConfigMock, - metrics: metricsMock, - collector: collectorMock, - } - - now := time.Now().UnixMilli() - startTime := now - 3600000 - endTime := now - req := &openapi.SearchTraceOApiRequest{ - WorkspaceID: 123, - TraceID: ptr.Of("trace123"), - StartTime: startTime, - EndTime: endTime, - Limit: 10, - PlatformType: ptr.Of("platform"), - } - - resp, err := app.SearchTraceOApi(context.Background(), req) - assert.NoError(t, err) - assert.NotNil(t, resp) - }) } func TestOpenAPIApplication_validateSearchTraceOApiReq(t *testing.T) { @@ -2051,6 +1998,7 @@ func TestOpenAPIApplication_validateSearchTraceOApiReq(t *testing.T) { EndTime: now, Limit: 10, PlatformType: ptr.Of("platform"), + Extra: &openapi.Extra{Src: ptr.Of("test")}, } // missing trace and log id @@ -2110,6 +2058,7 @@ func TestOpenAPIApplication_buildSearchTraceOApiReq(t *testing.T) { Limit: 50, PlatformType: ptr.Of("platform"), SpanIds: []string{"span-1", "span-2"}, + Extra: &openapi.Extra{Src: ptr.Of("test")}, } res, err := app.buildSearchTraceOApiReq(ctx, withPlatformReq) @@ -2235,6 +2184,7 @@ func TestOpenAPIApplication_buildSearchTraceTreeOApiReq(t *testing.T) { }, }, }, + Extra: &openapi.Extra{Src: ptr.Of("test")}, } result, err := app.buildSearchTraceTreeOApiReq(context.Background(), req) @@ -2297,7 +2247,7 @@ func TestOpenAPIApplication_SearchTraceTreeOApi(t *testing.T) { traceServiceMock.EXPECT().SearchTraceOApi(gomock.Any(), gomock.Any()).Return(&service.SearchTraceOApiResp{ Spans: []*loop_span.Span{{SpanID: "test"}}, }, nil) - metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() app := &OpenAPIApplication{ @@ -2322,6 +2272,7 @@ func TestOpenAPIApplication_SearchTraceTreeOApi(t *testing.T) { EndTime: &endTime, Limit: 10, PlatformType: ptr.Of(common.PlatformType("platform")), + Extra: &openapi.Extra{Src: ptr.Of("test")}, } resp, err := app.SearchTraceTreeOApi(context.Background(), req) @@ -2341,7 +2292,7 @@ func TestOpenAPIApplication_SearchTraceTreeOApi(t *testing.T) { collectorMock := collectormocks.NewMockICollectorProvider(ctrl) // Set expectations for the calls triggered inside the deferred function. - metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() app := &OpenAPIApplication{ @@ -2373,7 +2324,7 @@ func TestOpenAPIApplication_SearchTraceTreeOApi(t *testing.T) { collectorMock := collectormocks.NewMockICollectorProvider(ctrl) authMock.EXPECT().CheckQueryPermission(gomock.Any(), "123", "platform").Return(assert.AnError) - metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() app := &OpenAPIApplication{ @@ -2391,6 +2342,7 @@ func TestOpenAPIApplication_SearchTraceTreeOApi(t *testing.T) { StartTime: &start, EndTime: &end, PlatformType: ptr.Of(common.PlatformType("platform")), + Extra: &openapi.Extra{Src: ptr.Of("test")}, } resp, err := app.SearchTraceTreeOApi(context.Background(), req) @@ -2412,7 +2364,7 @@ func TestOpenAPIApplication_SearchTraceTreeOApi(t *testing.T) { authMock.EXPECT().CheckQueryPermission(gomock.Any(), "123", "platform").Return(nil) rateLimiter.EXPECT().AllowN(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(&limiter.Result{Allowed: false}, nil) traceConfigMock.EXPECT().GetQueryMaxQPS(gomock.Any(), gomock.Any()).Return(10, nil) - metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() app := &OpenAPIApplication{ @@ -2432,6 +2384,7 @@ func TestOpenAPIApplication_SearchTraceTreeOApi(t *testing.T) { StartTime: &start, EndTime: &end, PlatformType: ptr.Of(common.PlatformType("platform")), + Extra: &openapi.Extra{Src: ptr.Of("test")}, } resp, err := app.SearchTraceTreeOApi(context.Background(), req) @@ -2457,7 +2410,7 @@ func TestOpenAPIApplication_SearchTraceTreeOApi(t *testing.T) { traceConfigMock.EXPECT().GetQueryMaxQPS(gomock.Any(), gomock.Any()).Return(10, nil) tenantMock.EXPECT().GetOAPIQueryTenants(gomock.Any(), gomock.Any()).Return([]string{}) // Empty tenants should trigger an error. workspaceMock.EXPECT().GetThirdPartyQueryWorkSpaceID(gomock.Any(), int64(123)).Return("third-party-123") - metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() app := &OpenAPIApplication{ @@ -2479,6 +2432,7 @@ func TestOpenAPIApplication_SearchTraceTreeOApi(t *testing.T) { StartTime: &start, EndTime: &end, PlatformType: ptr.Of(common.PlatformType("platform")), + Extra: &openapi.Extra{Src: ptr.Of("test")}, } resp, err := app.SearchTraceTreeOApi(context.Background(), req) @@ -2508,7 +2462,7 @@ func TestOpenAPIApplication_SearchTraceTreeOApi(t *testing.T) { workspaceMock.EXPECT().GetThirdPartyQueryWorkSpaceID(gomock.Any(), int64(123)).Return("third-party-123") tenantMock.EXPECT().GetOAPIQueryTenants(gomock.Any(), gomock.Any()).Return([]string{"tenant1", "tenant2"}) traceServiceMock.EXPECT().SearchTraceOApi(gomock.Any(), gomock.Any()).Return(nil, assert.AnError) - metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() app := &OpenAPIApplication{ @@ -2532,67 +2486,13 @@ func TestOpenAPIApplication_SearchTraceTreeOApi(t *testing.T) { StartTime: &start, EndTime: &end, PlatformType: ptr.Of(common.PlatformType("platform")), + Extra: &openapi.Extra{Src: ptr.Of("test")}, } resp, err := app.SearchTraceTreeOApi(context.Background(), req) assert.Error(t, err) assert.Nil(t, resp) }) - - t.Run("successful search trace tree with nil extra", func(t *testing.T) { - ctrl := gomock.NewController(t) - defer ctrl.Finish() - - traceServiceMock := servicemocks.NewMockITraceService(ctrl) - authMock := rpcmocks.NewMockIAuthProvider(ctrl) - authMock.EXPECT().GetClaim(gomock.Any()).Return(nil).AnyTimes() - benefitMock := benefitmocks.NewMockIBenefitService(ctrl) - tenantMock := tenantmocks.NewMockITenantProvider(ctrl) - workspaceMock := workspacemocks.NewMockIWorkSpaceProvider(ctrl) - rateLimiter := limitermocks.NewMockIRateLimiter(ctrl) - traceConfigMock := configmocks.NewMockITraceConfig(ctrl) - metricsMock := metricsmocks.NewMockITraceMetrics(ctrl) - collectorMock := collectormocks.NewMockICollectorProvider(ctrl) - - authMock.EXPECT().CheckQueryPermission(gomock.Any(), "123", "platform").Return(nil) - rateLimiter.EXPECT().AllowN(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(&limiter.Result{Allowed: true}, nil) - traceConfigMock.EXPECT().GetQueryMaxQPS(gomock.Any(), gomock.Any()).Return(10, nil) - workspaceMock.EXPECT().GetThirdPartyQueryWorkSpaceID(gomock.Any(), int64(123)).Return("third-party-123") - tenantMock.EXPECT().GetOAPIQueryTenants(gomock.Any(), gomock.Any()).Return([]string{"tenant1", "tenant2"}) - traceServiceMock.EXPECT().SearchTraceOApi(gomock.Any(), gomock.Any()).Return(&service.SearchTraceOApiResp{ - Spans: []*loop_span.Span{{SpanID: "test"}}, - }, nil) - metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() - collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), "SearchTraceTreeOApi", int64(123), gomock.Any(), gomock.Eq(""), gomock.Eq(""), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(1) - - app := &OpenAPIApplication{ - traceService: traceServiceMock, - auth: authMock, - benefit: benefitMock, - tenant: tenantMock, - workspace: workspaceMock, - rateLimiter: rateLimiter, - traceConfig: traceConfigMock, - metrics: metricsMock, - collector: collectorMock, - } - - now := time.Now().UnixMilli() - startTime := now - 3600000 - endTime := now - req := &openapi.SearchTraceTreeOApiRequest{ - WorkspaceID: ptr.Of(int64(123)), - TraceID: ptr.Of("trace123"), - StartTime: &startTime, - EndTime: &endTime, - Limit: 10, - PlatformType: ptr.Of(common.PlatformType("platform")), - } - - resp, err := app.SearchTraceTreeOApi(context.Background(), req) - assert.NoError(t, err) - assert.NotNil(t, resp) - }) } // Add unit tests for ListSpansOApi. @@ -2625,7 +2525,7 @@ func TestOpenAPIApplication_ListSpansOApi(t *testing.T) { NextPageToken: "next_token", HasMore: true, }, nil) - metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() app := &OpenAPIApplication{ @@ -2653,6 +2553,7 @@ func TestOpenAPIApplication_ListSpansOApi(t *testing.T) { PlatformType: ptr.Of("platform"), SpanListType: ptr.Of(common.SpanListTypeRootSpan), OrderBys: []*common.OrderBy{{Field: ptr.Of("start_time")}}, + Extra: &openapi.Extra{Src: ptr.Of("test")}, } resp, err := app.ListSpansOApi(context.Background(), req) @@ -2661,61 +2562,6 @@ func TestOpenAPIApplication_ListSpansOApi(t *testing.T) { assert.True(t, resp.Data.HasMore) assert.Equal(t, "next_token", resp.Data.NextPageToken) }) - - t.Run("successful list spans with nil extra", func(t *testing.T) { - ctrl := gomock.NewController(t) - defer ctrl.Finish() - - traceServiceMock := servicemocks.NewMockITraceService(ctrl) - authMock := rpcmocks.NewMockIAuthProvider(ctrl) - authMock.EXPECT().GetClaim(gomock.Any()).Return(nil).AnyTimes() - benefitMock := benefitmocks.NewMockIBenefitService(ctrl) - tenantMock := tenantmocks.NewMockITenantProvider(ctrl) - workspaceMock := workspacemocks.NewMockIWorkSpaceProvider(ctrl) - rateLimiter := limitermocks.NewMockIRateLimiter(ctrl) - traceConfigMock := configmocks.NewMockITraceConfig(ctrl) - metricsMock := metricsmocks.NewMockITraceMetrics(ctrl) - collectorMock := collectormocks.NewMockICollectorProvider(ctrl) - - authMock.EXPECT().CheckQueryPermission(gomock.Any(), "123", "platform").Return(nil) - rateLimiter.EXPECT().AllowN(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(&limiter.Result{Allowed: true}, nil) - traceConfigMock.EXPECT().GetQueryMaxQPS(gomock.Any(), gomock.Any()).Return(10, nil) - workspaceMock.EXPECT().GetThirdPartyQueryWorkSpaceID(gomock.Any(), int64(123)).Return("third-party-123") - tenantMock.EXPECT().GetOAPIQueryTenants(gomock.Any(), gomock.Any()).Return([]string{"tenant1", "tenant2"}) - traceServiceMock.EXPECT().ListSpansOApi(gomock.Any(), gomock.Any()).Return(&service.ListSpansOApiResp{ - Spans: []*loop_span.Span{{SpanID: "test"}}, - HasMore: true, - NextPageToken: "next_token", - }, nil) - metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() - collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), "ListSpansOApi", int64(123), gomock.Any(), gomock.Any(), gomock.Eq(""), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(1) - - app := &OpenAPIApplication{ - traceService: traceServiceMock, - auth: authMock, - benefit: benefitMock, - tenant: tenantMock, - workspace: workspaceMock, - rateLimiter: rateLimiter, - traceConfig: traceConfigMock, - metrics: metricsMock, - collector: collectorMock, - } - - now := time.Now().UnixMilli() - startTime := now - 3600000 - endTime := now - req := &openapi.ListSpansOApiRequest{ - WorkspaceID: 123, - StartTime: startTime, - EndTime: endTime, - PlatformType: ptr.Of(common.PlatformType("platform")), - } - - resp, err := app.ListSpansOApi(context.Background(), req) - assert.NoError(t, err) - assert.NotNil(t, resp) - }) } // 补充ListTracesOApi测试 @@ -2746,7 +2592,7 @@ func TestOpenAPIApplication_ListTracesOApi(t *testing.T) { traceServiceMock.EXPECT().GetTracesAdvanceInfo(gomock.Any(), gomock.Any()).Return(&service.GetTracesAdvanceInfoResp{ Infos: []*loop_span.TraceAdvanceInfo{{TraceId: "trace123"}}, }, nil).AnyTimes() - metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() app := &OpenAPIApplication{ @@ -2792,7 +2638,7 @@ func TestOpenAPIApplication_ListTracesOApi(t *testing.T) { collectorMock := collectormocks.NewMockICollectorProvider(ctrl) // 设置期望 - 这些会在defer函数中被调用 - metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + metricsMock.EXPECT().EmitTraceOapi(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() collectorMock.EXPECT().CollectTraceOpenAPIEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() app := &OpenAPIApplication{ diff --git a/backend/modules/observability/domain/component/metrics/metrics.go b/backend/modules/observability/domain/component/metrics/metrics.go index 13876230d..e930d671a 100644 --- a/backend/modules/observability/domain/component/metrics/metrics.go +++ b/backend/modules/observability/domain/component/metrics/metrics.go @@ -9,6 +9,6 @@ import "time" type ITraceMetrics interface { EmitListSpans(workspaceId int64, spanType string, start time.Time, isError bool) EmitGetTrace(workspaceId int64, start time.Time, isError bool) - EmitTraceOapi(method string, workspaceId int64, platformType, spanListType string, spanSize int64, errorCode int, start time.Time, isError bool) + EmitTraceOapi(method string, workspaceId int64, platformType, spanListType, src string, spanSize int64, errorCode int, start time.Time, isError bool) EmitSendMetric(start time.Time, isError bool) } diff --git a/backend/modules/observability/domain/component/metrics/mocks/metrics.go b/backend/modules/observability/domain/component/metrics/mocks/metrics.go index 226706a3a..8d1796e07 100644 --- a/backend/modules/observability/domain/component/metrics/mocks/metrics.go +++ b/backend/modules/observability/domain/component/metrics/mocks/metrics.go @@ -77,13 +77,13 @@ func (mr *MockITraceMetricsMockRecorder) EmitSendMetric(start, isError any) *gom } // EmitTraceOapi mocks base method. -func (m *MockITraceMetrics) EmitTraceOapi(method string, workspaceId int64, platformType, spanListType string, spanSize int64, errorCode int, start time.Time, isError bool) { +func (m *MockITraceMetrics) EmitTraceOapi(method string, workspaceId int64, platformType, spanListType, src string, spanSize int64, errorCode int, start time.Time, isError bool) { m.ctrl.T.Helper() - m.ctrl.Call(m, "EmitTraceOapi", method, workspaceId, platformType, spanListType, spanSize, errorCode, start, isError) + m.ctrl.Call(m, "EmitTraceOapi", method, workspaceId, platformType, spanListType, src, spanSize, errorCode, start, isError) } // EmitTraceOapi indicates an expected call of EmitTraceOapi. -func (mr *MockITraceMetricsMockRecorder) EmitTraceOapi(method, workspaceId, platformType, spanListType, spanSize, errorCode, start, isError any) *gomock.Call { +func (mr *MockITraceMetricsMockRecorder) EmitTraceOapi(method, workspaceId, platformType, spanListType, src, spanSize, errorCode, start, isError any) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EmitTraceOapi", reflect.TypeOf((*MockITraceMetrics)(nil).EmitTraceOapi), method, workspaceId, platformType, spanListType, spanSize, errorCode, start, isError) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EmitTraceOapi", reflect.TypeOf((*MockITraceMetrics)(nil).EmitTraceOapi), method, workspaceId, platformType, spanListType, src, spanSize, errorCode, start, isError) } diff --git a/backend/modules/observability/infra/metrics/metrics.go b/backend/modules/observability/infra/metrics/metrics.go index 60c808448..1e81e0098 100644 --- a/backend/modules/observability/infra/metrics/metrics.go +++ b/backend/modules/observability/infra/metrics/metrics.go @@ -31,6 +31,7 @@ const ( tagSpaceID = "workspace_id" tagPlatformType = "platform_type" tagSpanType = "span_list_type" + tagSrc = "src" tagIsErr = "is_err" tagErrCode = "err_code" ) @@ -41,6 +42,7 @@ func traceQueryTagNames() []string { tagSpaceID, tagPlatformType, tagSpanType, + tagSrc, tagIsErr, tagErrCode, } @@ -103,7 +105,7 @@ func (t *TraceMetricsImpl) EmitGetTrace(workspaceId int64, start time.Time, isEr metrics.Timer(time.Since(start).Microseconds(), metrics.WithSuffix(getTraceSuffix+latencySuffix))) } -func (t *TraceMetricsImpl) EmitTraceOapi(method string, workspaceId int64, platformType, spanListType string, spanSize int64, errorCode int, start time.Time, isError bool) { +func (t *TraceMetricsImpl) EmitTraceOapi(method string, workspaceId int64, platformType, spanListType, src string, spanSize int64, errorCode int, start time.Time, isError bool) { if t.spansMetrics == nil { return } @@ -114,6 +116,7 @@ func (t *TraceMetricsImpl) EmitTraceOapi(method string, workspaceId int64, platf {Name: tagIsErr, Value: strconv.FormatBool(isError)}, {Name: tagPlatformType, Value: platformType}, {Name: tagSpanType, Value: spanListType}, + {Name: tagSrc, Value: src}, {Name: tagErrCode, Value: strconv.Itoa(errorCode)}, }, metrics.Counter(1, metrics.WithSuffix(traceOApiSuffix+throughputSuffix)), diff --git a/backend/modules/observability/infra/metrics/metrics_test.go b/backend/modules/observability/infra/metrics/metrics_test.go index 0d275031d..617de7885 100644 --- a/backend/modules/observability/infra/metrics/metrics_test.go +++ b/backend/modules/observability/infra/metrics/metrics_test.go @@ -203,6 +203,7 @@ func TestTraceMetricsImpl_EmitTraceOapi(t *testing.T) { workspaceId int64 platformType string spanType string + src string spanSize int64 errorCode int start time.Time @@ -221,7 +222,7 @@ func TestTraceMetricsImpl_EmitTraceOapi(t *testing.T) { spansMetrics: nil, } }, - args: args{"ListSpans", 123, "coze", "llm", 1024, 0, time.Now(), false}, + args: args{"ListSpans", 123, "coze", "llm", "", 1024, 0, time.Now(), false}, }, { name: "should emit metrics with correct tags for ListSpans", @@ -235,9 +236,10 @@ func TestTraceMetricsImpl_EmitTraceOapi(t *testing.T) { tagIsErr: "false", tagPlatformType: "coze", tagSpanType: "llm", + tagSrc: "", tagErrCode: "0", } - assert.Len(t, tags, 6) + assert.Len(t, tags, 7) for _, tag := range tags { expectedValue, exists := expectedTags[tag.Name] assert.True(t, exists, "Unexpected tag: %s", tag.Name) @@ -250,7 +252,7 @@ func TestTraceMetricsImpl_EmitTraceOapi(t *testing.T) { spansMetrics: m, } }, - args: args{"ListSpans", 123, "coze", "llm", 1024, 0, time.Now(), false}, + args: args{"ListSpans", 123, "coze", "llm", "", 1024, 0, time.Now(), false}, }, { name: "should emit metrics with correct tags for GetTrace", @@ -263,9 +265,10 @@ func TestTraceMetricsImpl_EmitTraceOapi(t *testing.T) { tagIsErr: "false", tagPlatformType: "dify", tagSpanType: "workflow", + tagSrc: "", tagErrCode: "0", } - assert.Len(t, tags, 6) + assert.Len(t, tags, 7) for _, tag := range tags { expectedValue, exists := expectedTags[tag.Name] assert.True(t, exists, "Unexpected tag: %s", tag.Name) @@ -276,7 +279,7 @@ func TestTraceMetricsImpl_EmitTraceOapi(t *testing.T) { spansMetrics: m, } }, - args: args{"GetTrace", 456, "dify", "workflow", 2048, 0, time.Now(), false}, + args: args{"GetTrace", 456, "dify", "workflow", "", 2048, 0, time.Now(), false}, }, { name: "should emit metrics with error tags", @@ -289,6 +292,7 @@ func TestTraceMetricsImpl_EmitTraceOapi(t *testing.T) { tagIsErr: "true", tagPlatformType: "openai", tagSpanType: "chat", + tagSrc: "", tagErrCode: "500", } for _, tag := range tags { @@ -301,7 +305,7 @@ func TestTraceMetricsImpl_EmitTraceOapi(t *testing.T) { spansMetrics: m, } }, - args: args{"ListSpans", 789, "openai", "chat", 512, 500, time.Now(), true}, + args: args{"ListSpans", 789, "openai", "chat", "", 512, 500, time.Now(), true}, }, { name: "should handle empty method and platform type", @@ -314,6 +318,7 @@ func TestTraceMetricsImpl_EmitTraceOapi(t *testing.T) { tagIsErr: "false", tagPlatformType: "", tagSpanType: "", + tagSrc: "", tagErrCode: "0", } for _, tag := range tags { @@ -326,7 +331,7 @@ func TestTraceMetricsImpl_EmitTraceOapi(t *testing.T) { spansMetrics: m, } }, - args: args{"", 0, "", "", 0, 0, time.Now(), false}, + args: args{"", 0, "", "", "", 0, 0, time.Now(), false}, }, { name: "should handle negative span size", @@ -340,7 +345,7 @@ func TestTraceMetricsImpl_EmitTraceOapi(t *testing.T) { spansMetrics: m, } }, - args: args{"GetTrace", 999, "coze", "agent", -100, 0, time.Now(), false}, + args: args{"GetTrace", 999, "coze", "agent", "", -100, 0, time.Now(), false}, }, } for _, tt := range tests { @@ -356,7 +361,7 @@ func TestTraceMetricsImpl_EmitTraceOapi(t *testing.T) { spansMetrics: fields.spansMetrics, } assert.NotPanics(t, func() { - tr.EmitTraceOapi(tt.args.method, tt.args.workspaceId, tt.args.platformType, tt.args.spanType, tt.args.spanSize, tt.args.errorCode, tt.args.start, tt.args.isError) + tr.EmitTraceOapi(tt.args.method, tt.args.workspaceId, tt.args.platformType, tt.args.spanType, tt.args.src, tt.args.spanSize, tt.args.errorCode, tt.args.start, tt.args.isError) }) }) } @@ -388,7 +393,7 @@ func TestTraceMetricsImpl_EmitTraceOapi_MetricValues(t *testing.T) { } start := time.Now() - tr.EmitTraceOapi("TestMethod", 12345, "test_platform", "test_span", 1024, 200, start, true) + tr.EmitTraceOapi("TestMethod", 12345, "test_platform", "test_span", "test_src", 1024, 200, start, true) } func TestTraceMetricsImpl_EmitTraceOapi_Integration(t *testing.T) { @@ -411,7 +416,7 @@ func TestTraceMetricsImpl_EmitTraceOapi_Integration(t *testing.T) { start := time.Now() domainMetrics.EmitListSpans(123, "llm", start, false) domainMetrics.EmitGetTrace(456, start, true) - domainMetrics.EmitTraceOapi("TestMethod", 789, "coze", "workflow", 2048, 0, start, false) + domainMetrics.EmitTraceOapi("TestMethod", 789, "coze", "workflow", "test_src", 2048, 0, start, false) } func TestTraceMetricsImpl_ConcurrentAccess(t *testing.T) { @@ -437,7 +442,7 @@ func TestTraceMetricsImpl_ConcurrentAccess(t *testing.T) { workspaceId := int64(id + 1000) // 并发调用EmitTraceOapi方法 - tr.EmitTraceOapi("ConcurrentTest", workspaceId, "test_platform", "test_span", int64(id*10), id%2, start, id%2 == 1) + tr.EmitTraceOapi("ConcurrentTest", workspaceId, "test_platform", "test_span", "test_src", int64(id*10), id%2, start, id%2 == 1) }(i) } @@ -459,10 +464,11 @@ func TestTraceQueryTagNames(t *testing.T) { tagSpaceID, tagPlatformType, tagSpanType, + tagSrc, tagIsErr, tagErrCode, } result := traceQueryTagNames() assert.Equal(t, expected, result) - assert.Len(t, result, 6) + assert.Len(t, result, 7) }