diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2f04990..7349f39 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -47,7 +47,7 @@ jobs: with: go-version-file: go.mod # go-version: "1.22" - - run: buf generate + - run: buf generate --timeout 10m - name: Check generated code is up to date run: | if [ -n "$(git status --porcelain gen/)" ]; then @@ -80,7 +80,7 @@ jobs: node-version: 20 cache: npm - run: npm ci - - run: buf generate + - run: buf generate --timeout 10m - name: Check generated code is up to date run: | if [ -n "$(git status --porcelain gen/)" ]; then @@ -102,7 +102,7 @@ jobs: with: python-version: "3.12" - run: python -m pip install --upgrade build pip - - run: buf generate + - run: buf generate --timeout 10m - name: Check generated code is up to date run: | if [ -n "$(git status --porcelain gen/)" ]; then diff --git a/descriptions.yaml b/descriptions.yaml index 286c2a7..c18c224 100644 --- a/descriptions.yaml +++ b/descriptions.yaml @@ -258,6 +258,21 @@ MeterService_QueryUsage: >- MeterService_GetUsageSummary: >- Get aggregated usage summary grouped by model, provider, team, agent, surface, or metadata key. Returns totals for tokens and cost. + +# --- traces/v1 --- +SpanIngestService_IngestSpans: >- + Record one or more execution spans for an agent trace. Stores span identity, + parent/child relationships, token usage, governance outcome, latency, and + cost metadata, then returns updated trace summaries for the affected traces. +SpanIngestService_GetTrace: >- + Retrieve a trace by ID. Returns the trace summary plus the flat span list for + inspection or downstream tree reconstruction. +SpanIngestService_ListTraces: >- + List traces by workspace, agent, surface, or time range. Returns paginated + trace summaries with total count metadata. +SpanIngestService_GetSpanTree: >- + Retrieve a trace as a parent/child span tree. Used for execution debugging, + attribution, and governance review. MeterService_GetMeterSummary: >- Get summary for a specific meter ID, grouped by the requested dimension. MeterService_IngestWideEvent: >- diff --git a/gen/go/traces/v1/traces.pb.go b/gen/go/traces/v1/traces.pb.go new file mode 100644 index 0000000..aa597bc --- /dev/null +++ b/gen/go/traces/v1/traces.pb.go @@ -0,0 +1,1148 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.11 +// protoc (unknown) +// source: traces/v1/traces.proto + +package tracesv1 + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + structpb "google.golang.org/protobuf/types/known/structpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type SpanStatus int32 + +const ( + SpanStatus_SPAN_STATUS_UNSPECIFIED SpanStatus = 0 + SpanStatus_SPAN_STATUS_OK SpanStatus = 1 + SpanStatus_SPAN_STATUS_ERROR SpanStatus = 2 + SpanStatus_SPAN_STATUS_CANCELLED SpanStatus = 3 +) + +// Enum value maps for SpanStatus. +var ( + SpanStatus_name = map[int32]string{ + 0: "SPAN_STATUS_UNSPECIFIED", + 1: "SPAN_STATUS_OK", + 2: "SPAN_STATUS_ERROR", + 3: "SPAN_STATUS_CANCELLED", + } + SpanStatus_value = map[string]int32{ + "SPAN_STATUS_UNSPECIFIED": 0, + "SPAN_STATUS_OK": 1, + "SPAN_STATUS_ERROR": 2, + "SPAN_STATUS_CANCELLED": 3, + } +) + +func (x SpanStatus) Enum() *SpanStatus { + p := new(SpanStatus) + *p = x + return p +} + +func (x SpanStatus) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SpanStatus) Descriptor() protoreflect.EnumDescriptor { + return file_traces_v1_traces_proto_enumTypes[0].Descriptor() +} + +func (SpanStatus) Type() protoreflect.EnumType { + return &file_traces_v1_traces_proto_enumTypes[0] +} + +func (x SpanStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SpanStatus.Descriptor instead. +func (SpanStatus) EnumDescriptor() ([]byte, []int) { + return file_traces_v1_traces_proto_rawDescGZIP(), []int{0} +} + +type GovernanceDecision int32 + +const ( + GovernanceDecision_GOVERNANCE_DECISION_UNSPECIFIED GovernanceDecision = 0 + GovernanceDecision_GOVERNANCE_DECISION_ALLOW GovernanceDecision = 1 + GovernanceDecision_GOVERNANCE_DECISION_DENY GovernanceDecision = 2 + GovernanceDecision_GOVERNANCE_DECISION_REQUIRE_APPROVAL GovernanceDecision = 3 + GovernanceDecision_GOVERNANCE_DECISION_AUTO_APPROVED GovernanceDecision = 4 +) + +// Enum value maps for GovernanceDecision. +var ( + GovernanceDecision_name = map[int32]string{ + 0: "GOVERNANCE_DECISION_UNSPECIFIED", + 1: "GOVERNANCE_DECISION_ALLOW", + 2: "GOVERNANCE_DECISION_DENY", + 3: "GOVERNANCE_DECISION_REQUIRE_APPROVAL", + 4: "GOVERNANCE_DECISION_AUTO_APPROVED", + } + GovernanceDecision_value = map[string]int32{ + "GOVERNANCE_DECISION_UNSPECIFIED": 0, + "GOVERNANCE_DECISION_ALLOW": 1, + "GOVERNANCE_DECISION_DENY": 2, + "GOVERNANCE_DECISION_REQUIRE_APPROVAL": 3, + "GOVERNANCE_DECISION_AUTO_APPROVED": 4, + } +) + +func (x GovernanceDecision) Enum() *GovernanceDecision { + p := new(GovernanceDecision) + *p = x + return p +} + +func (x GovernanceDecision) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (GovernanceDecision) Descriptor() protoreflect.EnumDescriptor { + return file_traces_v1_traces_proto_enumTypes[1].Descriptor() +} + +func (GovernanceDecision) Type() protoreflect.EnumType { + return &file_traces_v1_traces_proto_enumTypes[1] +} + +func (x GovernanceDecision) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use GovernanceDecision.Descriptor instead. +func (GovernanceDecision) EnumDescriptor() ([]byte, []int) { + return file_traces_v1_traces_proto_rawDescGZIP(), []int{1} +} + +type Span struct { + state protoimpl.MessageState `protogen:"open.v1"` + TraceId string `protobuf:"bytes,1,opt,name=trace_id,json=traceId,proto3" json:"trace_id,omitempty"` + SpanId string `protobuf:"bytes,2,opt,name=span_id,json=spanId,proto3" json:"span_id,omitempty"` + ParentSpanId string `protobuf:"bytes,3,opt,name=parent_span_id,json=parentSpanId,proto3" json:"parent_span_id,omitempty"` + WorkspaceId string `protobuf:"bytes,4,opt,name=workspace_id,json=workspaceId,proto3" json:"workspace_id,omitempty"` + OrganizationId string `protobuf:"bytes,5,opt,name=organization_id,json=organizationId,proto3" json:"organization_id,omitempty"` + AgentId string `protobuf:"bytes,6,opt,name=agent_id,json=agentId,proto3" json:"agent_id,omitempty"` + Surface string `protobuf:"bytes,7,opt,name=surface,proto3" json:"surface,omitempty"` + Name string `protobuf:"bytes,8,opt,name=name,proto3" json:"name,omitempty"` + Kind string `protobuf:"bytes,9,opt,name=kind,proto3" json:"kind,omitempty"` + Model string `protobuf:"bytes,10,opt,name=model,proto3" json:"model,omitempty"` + Provider string `protobuf:"bytes,11,opt,name=provider,proto3" json:"provider,omitempty"` + TokenInput int64 `protobuf:"varint,12,opt,name=token_input,json=tokenInput,proto3" json:"token_input,omitempty"` + TokenOutput int64 `protobuf:"varint,13,opt,name=token_output,json=tokenOutput,proto3" json:"token_output,omitempty"` + LatencyMs int64 `protobuf:"varint,14,opt,name=latency_ms,json=latencyMs,proto3" json:"latency_ms,omitempty"` + Status SpanStatus `protobuf:"varint,15,opt,name=status,proto3,enum=traces.v1.SpanStatus" json:"status,omitempty"` + GovernanceDecision GovernanceDecision `protobuf:"varint,16,opt,name=governance_decision,json=governanceDecision,proto3,enum=traces.v1.GovernanceDecision" json:"governance_decision,omitempty"` + CostUsd float64 `protobuf:"fixed64,17,opt,name=cost_usd,json=costUsd,proto3" json:"cost_usd,omitempty"` + Attributes *structpb.Struct `protobuf:"bytes,18,opt,name=attributes,proto3" json:"attributes,omitempty"` + StartedAt *timestamppb.Timestamp `protobuf:"bytes,19,opt,name=started_at,json=startedAt,proto3" json:"started_at,omitempty"` + EndedAt *timestamppb.Timestamp `protobuf:"bytes,20,opt,name=ended_at,json=endedAt,proto3" json:"ended_at,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Span) Reset() { + *x = Span{} + mi := &file_traces_v1_traces_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Span) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Span) ProtoMessage() {} + +func (x *Span) ProtoReflect() protoreflect.Message { + mi := &file_traces_v1_traces_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Span.ProtoReflect.Descriptor instead. +func (*Span) Descriptor() ([]byte, []int) { + return file_traces_v1_traces_proto_rawDescGZIP(), []int{0} +} + +func (x *Span) GetTraceId() string { + if x != nil { + return x.TraceId + } + return "" +} + +func (x *Span) GetSpanId() string { + if x != nil { + return x.SpanId + } + return "" +} + +func (x *Span) GetParentSpanId() string { + if x != nil { + return x.ParentSpanId + } + return "" +} + +func (x *Span) GetWorkspaceId() string { + if x != nil { + return x.WorkspaceId + } + return "" +} + +func (x *Span) GetOrganizationId() string { + if x != nil { + return x.OrganizationId + } + return "" +} + +func (x *Span) GetAgentId() string { + if x != nil { + return x.AgentId + } + return "" +} + +func (x *Span) GetSurface() string { + if x != nil { + return x.Surface + } + return "" +} + +func (x *Span) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Span) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *Span) GetModel() string { + if x != nil { + return x.Model + } + return "" +} + +func (x *Span) GetProvider() string { + if x != nil { + return x.Provider + } + return "" +} + +func (x *Span) GetTokenInput() int64 { + if x != nil { + return x.TokenInput + } + return 0 +} + +func (x *Span) GetTokenOutput() int64 { + if x != nil { + return x.TokenOutput + } + return 0 +} + +func (x *Span) GetLatencyMs() int64 { + if x != nil { + return x.LatencyMs + } + return 0 +} + +func (x *Span) GetStatus() SpanStatus { + if x != nil { + return x.Status + } + return SpanStatus_SPAN_STATUS_UNSPECIFIED +} + +func (x *Span) GetGovernanceDecision() GovernanceDecision { + if x != nil { + return x.GovernanceDecision + } + return GovernanceDecision_GOVERNANCE_DECISION_UNSPECIFIED +} + +func (x *Span) GetCostUsd() float64 { + if x != nil { + return x.CostUsd + } + return 0 +} + +func (x *Span) GetAttributes() *structpb.Struct { + if x != nil { + return x.Attributes + } + return nil +} + +func (x *Span) GetStartedAt() *timestamppb.Timestamp { + if x != nil { + return x.StartedAt + } + return nil +} + +func (x *Span) GetEndedAt() *timestamppb.Timestamp { + if x != nil { + return x.EndedAt + } + return nil +} + +type TraceSummary struct { + state protoimpl.MessageState `protogen:"open.v1"` + TraceId string `protobuf:"bytes,1,opt,name=trace_id,json=traceId,proto3" json:"trace_id,omitempty"` + WorkspaceId string `protobuf:"bytes,2,opt,name=workspace_id,json=workspaceId,proto3" json:"workspace_id,omitempty"` + OrganizationId string `protobuf:"bytes,3,opt,name=organization_id,json=organizationId,proto3" json:"organization_id,omitempty"` + AgentId string `protobuf:"bytes,4,opt,name=agent_id,json=agentId,proto3" json:"agent_id,omitempty"` + Surface string `protobuf:"bytes,5,opt,name=surface,proto3" json:"surface,omitempty"` + RootSpanName string `protobuf:"bytes,6,opt,name=root_span_name,json=rootSpanName,proto3" json:"root_span_name,omitempty"` + TotalSpans int32 `protobuf:"varint,7,opt,name=total_spans,json=totalSpans,proto3" json:"total_spans,omitempty"` + TotalTokenInput int64 `protobuf:"varint,8,opt,name=total_token_input,json=totalTokenInput,proto3" json:"total_token_input,omitempty"` + TotalTokenOutput int64 `protobuf:"varint,9,opt,name=total_token_output,json=totalTokenOutput,proto3" json:"total_token_output,omitempty"` + TotalCostUsd float64 `protobuf:"fixed64,10,opt,name=total_cost_usd,json=totalCostUsd,proto3" json:"total_cost_usd,omitempty"` + TotalLatencyMs int64 `protobuf:"varint,11,opt,name=total_latency_ms,json=totalLatencyMs,proto3" json:"total_latency_ms,omitempty"` + StartedAt *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=started_at,json=startedAt,proto3" json:"started_at,omitempty"` + EndedAt *timestamppb.Timestamp `protobuf:"bytes,13,opt,name=ended_at,json=endedAt,proto3" json:"ended_at,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TraceSummary) Reset() { + *x = TraceSummary{} + mi := &file_traces_v1_traces_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TraceSummary) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TraceSummary) ProtoMessage() {} + +func (x *TraceSummary) ProtoReflect() protoreflect.Message { + mi := &file_traces_v1_traces_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TraceSummary.ProtoReflect.Descriptor instead. +func (*TraceSummary) Descriptor() ([]byte, []int) { + return file_traces_v1_traces_proto_rawDescGZIP(), []int{1} +} + +func (x *TraceSummary) GetTraceId() string { + if x != nil { + return x.TraceId + } + return "" +} + +func (x *TraceSummary) GetWorkspaceId() string { + if x != nil { + return x.WorkspaceId + } + return "" +} + +func (x *TraceSummary) GetOrganizationId() string { + if x != nil { + return x.OrganizationId + } + return "" +} + +func (x *TraceSummary) GetAgentId() string { + if x != nil { + return x.AgentId + } + return "" +} + +func (x *TraceSummary) GetSurface() string { + if x != nil { + return x.Surface + } + return "" +} + +func (x *TraceSummary) GetRootSpanName() string { + if x != nil { + return x.RootSpanName + } + return "" +} + +func (x *TraceSummary) GetTotalSpans() int32 { + if x != nil { + return x.TotalSpans + } + return 0 +} + +func (x *TraceSummary) GetTotalTokenInput() int64 { + if x != nil { + return x.TotalTokenInput + } + return 0 +} + +func (x *TraceSummary) GetTotalTokenOutput() int64 { + if x != nil { + return x.TotalTokenOutput + } + return 0 +} + +func (x *TraceSummary) GetTotalCostUsd() float64 { + if x != nil { + return x.TotalCostUsd + } + return 0 +} + +func (x *TraceSummary) GetTotalLatencyMs() int64 { + if x != nil { + return x.TotalLatencyMs + } + return 0 +} + +func (x *TraceSummary) GetStartedAt() *timestamppb.Timestamp { + if x != nil { + return x.StartedAt + } + return nil +} + +func (x *TraceSummary) GetEndedAt() *timestamppb.Timestamp { + if x != nil { + return x.EndedAt + } + return nil +} + +type IngestSpansRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Spans []*Span `protobuf:"bytes,1,rep,name=spans,proto3" json:"spans,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *IngestSpansRequest) Reset() { + *x = IngestSpansRequest{} + mi := &file_traces_v1_traces_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *IngestSpansRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IngestSpansRequest) ProtoMessage() {} + +func (x *IngestSpansRequest) ProtoReflect() protoreflect.Message { + mi := &file_traces_v1_traces_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use IngestSpansRequest.ProtoReflect.Descriptor instead. +func (*IngestSpansRequest) Descriptor() ([]byte, []int) { + return file_traces_v1_traces_proto_rawDescGZIP(), []int{2} +} + +func (x *IngestSpansRequest) GetSpans() []*Span { + if x != nil { + return x.Spans + } + return nil +} + +type IngestSpansResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + IngestedCount int32 `protobuf:"varint,1,opt,name=ingested_count,json=ingestedCount,proto3" json:"ingested_count,omitempty"` + Traces []*TraceSummary `protobuf:"bytes,2,rep,name=traces,proto3" json:"traces,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *IngestSpansResponse) Reset() { + *x = IngestSpansResponse{} + mi := &file_traces_v1_traces_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *IngestSpansResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IngestSpansResponse) ProtoMessage() {} + +func (x *IngestSpansResponse) ProtoReflect() protoreflect.Message { + mi := &file_traces_v1_traces_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use IngestSpansResponse.ProtoReflect.Descriptor instead. +func (*IngestSpansResponse) Descriptor() ([]byte, []int) { + return file_traces_v1_traces_proto_rawDescGZIP(), []int{3} +} + +func (x *IngestSpansResponse) GetIngestedCount() int32 { + if x != nil { + return x.IngestedCount + } + return 0 +} + +func (x *IngestSpansResponse) GetTraces() []*TraceSummary { + if x != nil { + return x.Traces + } + return nil +} + +type GetTraceRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + TraceId string `protobuf:"bytes,1,opt,name=trace_id,json=traceId,proto3" json:"trace_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetTraceRequest) Reset() { + *x = GetTraceRequest{} + mi := &file_traces_v1_traces_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetTraceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetTraceRequest) ProtoMessage() {} + +func (x *GetTraceRequest) ProtoReflect() protoreflect.Message { + mi := &file_traces_v1_traces_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetTraceRequest.ProtoReflect.Descriptor instead. +func (*GetTraceRequest) Descriptor() ([]byte, []int) { + return file_traces_v1_traces_proto_rawDescGZIP(), []int{4} +} + +func (x *GetTraceRequest) GetTraceId() string { + if x != nil { + return x.TraceId + } + return "" +} + +type GetTraceResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Trace *TraceSummary `protobuf:"bytes,1,opt,name=trace,proto3" json:"trace,omitempty"` + Spans []*Span `protobuf:"bytes,2,rep,name=spans,proto3" json:"spans,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetTraceResponse) Reset() { + *x = GetTraceResponse{} + mi := &file_traces_v1_traces_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetTraceResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetTraceResponse) ProtoMessage() {} + +func (x *GetTraceResponse) ProtoReflect() protoreflect.Message { + mi := &file_traces_v1_traces_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetTraceResponse.ProtoReflect.Descriptor instead. +func (*GetTraceResponse) Descriptor() ([]byte, []int) { + return file_traces_v1_traces_proto_rawDescGZIP(), []int{5} +} + +func (x *GetTraceResponse) GetTrace() *TraceSummary { + if x != nil { + return x.Trace + } + return nil +} + +func (x *GetTraceResponse) GetSpans() []*Span { + if x != nil { + return x.Spans + } + return nil +} + +type ListTracesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + WorkspaceId string `protobuf:"bytes,1,opt,name=workspace_id,json=workspaceId,proto3" json:"workspace_id,omitempty"` + AgentId string `protobuf:"bytes,2,opt,name=agent_id,json=agentId,proto3" json:"agent_id,omitempty"` + Surface string `protobuf:"bytes,3,opt,name=surface,proto3" json:"surface,omitempty"` + StartTime *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` + Limit int32 `protobuf:"varint,6,opt,name=limit,proto3" json:"limit,omitempty"` + Offset int32 `protobuf:"varint,7,opt,name=offset,proto3" json:"offset,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListTracesRequest) Reset() { + *x = ListTracesRequest{} + mi := &file_traces_v1_traces_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListTracesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListTracesRequest) ProtoMessage() {} + +func (x *ListTracesRequest) ProtoReflect() protoreflect.Message { + mi := &file_traces_v1_traces_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListTracesRequest.ProtoReflect.Descriptor instead. +func (*ListTracesRequest) Descriptor() ([]byte, []int) { + return file_traces_v1_traces_proto_rawDescGZIP(), []int{6} +} + +func (x *ListTracesRequest) GetWorkspaceId() string { + if x != nil { + return x.WorkspaceId + } + return "" +} + +func (x *ListTracesRequest) GetAgentId() string { + if x != nil { + return x.AgentId + } + return "" +} + +func (x *ListTracesRequest) GetSurface() string { + if x != nil { + return x.Surface + } + return "" +} + +func (x *ListTracesRequest) GetStartTime() *timestamppb.Timestamp { + if x != nil { + return x.StartTime + } + return nil +} + +func (x *ListTracesRequest) GetEndTime() *timestamppb.Timestamp { + if x != nil { + return x.EndTime + } + return nil +} + +func (x *ListTracesRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *ListTracesRequest) GetOffset() int32 { + if x != nil { + return x.Offset + } + return 0 +} + +type ListTracesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Traces []*TraceSummary `protobuf:"bytes,1,rep,name=traces,proto3" json:"traces,omitempty"` + Total int32 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` + HasMore bool `protobuf:"varint,3,opt,name=has_more,json=hasMore,proto3" json:"has_more,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListTracesResponse) Reset() { + *x = ListTracesResponse{} + mi := &file_traces_v1_traces_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListTracesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListTracesResponse) ProtoMessage() {} + +func (x *ListTracesResponse) ProtoReflect() protoreflect.Message { + mi := &file_traces_v1_traces_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListTracesResponse.ProtoReflect.Descriptor instead. +func (*ListTracesResponse) Descriptor() ([]byte, []int) { + return file_traces_v1_traces_proto_rawDescGZIP(), []int{7} +} + +func (x *ListTracesResponse) GetTraces() []*TraceSummary { + if x != nil { + return x.Traces + } + return nil +} + +func (x *ListTracesResponse) GetTotal() int32 { + if x != nil { + return x.Total + } + return 0 +} + +func (x *ListTracesResponse) GetHasMore() bool { + if x != nil { + return x.HasMore + } + return false +} + +type GetSpanTreeRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + TraceId string `protobuf:"bytes,1,opt,name=trace_id,json=traceId,proto3" json:"trace_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetSpanTreeRequest) Reset() { + *x = GetSpanTreeRequest{} + mi := &file_traces_v1_traces_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetSpanTreeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSpanTreeRequest) ProtoMessage() {} + +func (x *GetSpanTreeRequest) ProtoReflect() protoreflect.Message { + mi := &file_traces_v1_traces_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSpanTreeRequest.ProtoReflect.Descriptor instead. +func (*GetSpanTreeRequest) Descriptor() ([]byte, []int) { + return file_traces_v1_traces_proto_rawDescGZIP(), []int{8} +} + +func (x *GetSpanTreeRequest) GetTraceId() string { + if x != nil { + return x.TraceId + } + return "" +} + +type SpanNode struct { + state protoimpl.MessageState `protogen:"open.v1"` + Span *Span `protobuf:"bytes,1,opt,name=span,proto3" json:"span,omitempty"` + Children []*SpanNode `protobuf:"bytes,2,rep,name=children,proto3" json:"children,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SpanNode) Reset() { + *x = SpanNode{} + mi := &file_traces_v1_traces_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SpanNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SpanNode) ProtoMessage() {} + +func (x *SpanNode) ProtoReflect() protoreflect.Message { + mi := &file_traces_v1_traces_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SpanNode.ProtoReflect.Descriptor instead. +func (*SpanNode) Descriptor() ([]byte, []int) { + return file_traces_v1_traces_proto_rawDescGZIP(), []int{9} +} + +func (x *SpanNode) GetSpan() *Span { + if x != nil { + return x.Span + } + return nil +} + +func (x *SpanNode) GetChildren() []*SpanNode { + if x != nil { + return x.Children + } + return nil +} + +type GetSpanTreeResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Trace *TraceSummary `protobuf:"bytes,1,opt,name=trace,proto3" json:"trace,omitempty"` + Roots []*SpanNode `protobuf:"bytes,2,rep,name=roots,proto3" json:"roots,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetSpanTreeResponse) Reset() { + *x = GetSpanTreeResponse{} + mi := &file_traces_v1_traces_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetSpanTreeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSpanTreeResponse) ProtoMessage() {} + +func (x *GetSpanTreeResponse) ProtoReflect() protoreflect.Message { + mi := &file_traces_v1_traces_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSpanTreeResponse.ProtoReflect.Descriptor instead. +func (*GetSpanTreeResponse) Descriptor() ([]byte, []int) { + return file_traces_v1_traces_proto_rawDescGZIP(), []int{10} +} + +func (x *GetSpanTreeResponse) GetTrace() *TraceSummary { + if x != nil { + return x.Trace + } + return nil +} + +func (x *GetSpanTreeResponse) GetRoots() []*SpanNode { + if x != nil { + return x.Roots + } + return nil +} + +var File_traces_v1_traces_proto protoreflect.FileDescriptor + +const file_traces_v1_traces_proto_rawDesc = "" + + "\n" + + "\x16traces/v1/traces.proto\x12\ttraces.v1\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xe3\x05\n" + + "\x04Span\x12\x19\n" + + "\btrace_id\x18\x01 \x01(\tR\atraceId\x12\x17\n" + + "\aspan_id\x18\x02 \x01(\tR\x06spanId\x12$\n" + + "\x0eparent_span_id\x18\x03 \x01(\tR\fparentSpanId\x12!\n" + + "\fworkspace_id\x18\x04 \x01(\tR\vworkspaceId\x12'\n" + + "\x0forganization_id\x18\x05 \x01(\tR\x0eorganizationId\x12\x19\n" + + "\bagent_id\x18\x06 \x01(\tR\aagentId\x12\x18\n" + + "\asurface\x18\a \x01(\tR\asurface\x12\x12\n" + + "\x04name\x18\b \x01(\tR\x04name\x12\x12\n" + + "\x04kind\x18\t \x01(\tR\x04kind\x12\x14\n" + + "\x05model\x18\n" + + " \x01(\tR\x05model\x12\x1a\n" + + "\bprovider\x18\v \x01(\tR\bprovider\x12\x1f\n" + + "\vtoken_input\x18\f \x01(\x03R\n" + + "tokenInput\x12!\n" + + "\ftoken_output\x18\r \x01(\x03R\vtokenOutput\x12\x1d\n" + + "\n" + + "latency_ms\x18\x0e \x01(\x03R\tlatencyMs\x12-\n" + + "\x06status\x18\x0f \x01(\x0e2\x15.traces.v1.SpanStatusR\x06status\x12N\n" + + "\x13governance_decision\x18\x10 \x01(\x0e2\x1d.traces.v1.GovernanceDecisionR\x12governanceDecision\x12\x19\n" + + "\bcost_usd\x18\x11 \x01(\x01R\acostUsd\x127\n" + + "\n" + + "attributes\x18\x12 \x01(\v2\x17.google.protobuf.StructR\n" + + "attributes\x129\n" + + "\n" + + "started_at\x18\x13 \x01(\v2\x1a.google.protobuf.TimestampR\tstartedAt\x125\n" + + "\bended_at\x18\x14 \x01(\v2\x1a.google.protobuf.TimestampR\aendedAt\"\x8d\x04\n" + + "\fTraceSummary\x12\x19\n" + + "\btrace_id\x18\x01 \x01(\tR\atraceId\x12!\n" + + "\fworkspace_id\x18\x02 \x01(\tR\vworkspaceId\x12'\n" + + "\x0forganization_id\x18\x03 \x01(\tR\x0eorganizationId\x12\x19\n" + + "\bagent_id\x18\x04 \x01(\tR\aagentId\x12\x18\n" + + "\asurface\x18\x05 \x01(\tR\asurface\x12$\n" + + "\x0eroot_span_name\x18\x06 \x01(\tR\frootSpanName\x12\x1f\n" + + "\vtotal_spans\x18\a \x01(\x05R\n" + + "totalSpans\x12*\n" + + "\x11total_token_input\x18\b \x01(\x03R\x0ftotalTokenInput\x12,\n" + + "\x12total_token_output\x18\t \x01(\x03R\x10totalTokenOutput\x12$\n" + + "\x0etotal_cost_usd\x18\n" + + " \x01(\x01R\ftotalCostUsd\x12(\n" + + "\x10total_latency_ms\x18\v \x01(\x03R\x0etotalLatencyMs\x129\n" + + "\n" + + "started_at\x18\f \x01(\v2\x1a.google.protobuf.TimestampR\tstartedAt\x125\n" + + "\bended_at\x18\r \x01(\v2\x1a.google.protobuf.TimestampR\aendedAt\";\n" + + "\x12IngestSpansRequest\x12%\n" + + "\x05spans\x18\x01 \x03(\v2\x0f.traces.v1.SpanR\x05spans\"m\n" + + "\x13IngestSpansResponse\x12%\n" + + "\x0eingested_count\x18\x01 \x01(\x05R\ringestedCount\x12/\n" + + "\x06traces\x18\x02 \x03(\v2\x17.traces.v1.TraceSummaryR\x06traces\",\n" + + "\x0fGetTraceRequest\x12\x19\n" + + "\btrace_id\x18\x01 \x01(\tR\atraceId\"h\n" + + "\x10GetTraceResponse\x12-\n" + + "\x05trace\x18\x01 \x01(\v2\x17.traces.v1.TraceSummaryR\x05trace\x12%\n" + + "\x05spans\x18\x02 \x03(\v2\x0f.traces.v1.SpanR\x05spans\"\x8b\x02\n" + + "\x11ListTracesRequest\x12!\n" + + "\fworkspace_id\x18\x01 \x01(\tR\vworkspaceId\x12\x19\n" + + "\bagent_id\x18\x02 \x01(\tR\aagentId\x12\x18\n" + + "\asurface\x18\x03 \x01(\tR\asurface\x129\n" + + "\n" + + "start_time\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampR\tstartTime\x125\n" + + "\bend_time\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\aendTime\x12\x14\n" + + "\x05limit\x18\x06 \x01(\x05R\x05limit\x12\x16\n" + + "\x06offset\x18\a \x01(\x05R\x06offset\"v\n" + + "\x12ListTracesResponse\x12/\n" + + "\x06traces\x18\x01 \x03(\v2\x17.traces.v1.TraceSummaryR\x06traces\x12\x14\n" + + "\x05total\x18\x02 \x01(\x05R\x05total\x12\x19\n" + + "\bhas_more\x18\x03 \x01(\bR\ahasMore\"/\n" + + "\x12GetSpanTreeRequest\x12\x19\n" + + "\btrace_id\x18\x01 \x01(\tR\atraceId\"`\n" + + "\bSpanNode\x12#\n" + + "\x04span\x18\x01 \x01(\v2\x0f.traces.v1.SpanR\x04span\x12/\n" + + "\bchildren\x18\x02 \x03(\v2\x13.traces.v1.SpanNodeR\bchildren\"o\n" + + "\x13GetSpanTreeResponse\x12-\n" + + "\x05trace\x18\x01 \x01(\v2\x17.traces.v1.TraceSummaryR\x05trace\x12)\n" + + "\x05roots\x18\x02 \x03(\v2\x13.traces.v1.SpanNodeR\x05roots*o\n" + + "\n" + + "SpanStatus\x12\x1b\n" + + "\x17SPAN_STATUS_UNSPECIFIED\x10\x00\x12\x12\n" + + "\x0eSPAN_STATUS_OK\x10\x01\x12\x15\n" + + "\x11SPAN_STATUS_ERROR\x10\x02\x12\x19\n" + + "\x15SPAN_STATUS_CANCELLED\x10\x03*\xc7\x01\n" + + "\x12GovernanceDecision\x12#\n" + + "\x1fGOVERNANCE_DECISION_UNSPECIFIED\x10\x00\x12\x1d\n" + + "\x19GOVERNANCE_DECISION_ALLOW\x10\x01\x12\x1c\n" + + "\x18GOVERNANCE_DECISION_DENY\x10\x02\x12(\n" + + "$GOVERNANCE_DECISION_REQUIRE_APPROVAL\x10\x03\x12%\n" + + "!GOVERNANCE_DECISION_AUTO_APPROVED\x10\x042\xbf\x02\n" + + "\x11SpanIngestService\x12L\n" + + "\vIngestSpans\x12\x1d.traces.v1.IngestSpansRequest\x1a\x1e.traces.v1.IngestSpansResponse\x12C\n" + + "\bGetTrace\x12\x1a.traces.v1.GetTraceRequest\x1a\x1b.traces.v1.GetTraceResponse\x12I\n" + + "\n" + + "ListTraces\x12\x1c.traces.v1.ListTracesRequest\x1a\x1d.traces.v1.ListTracesResponse\x12L\n" + + "\vGetSpanTree\x12\x1d.traces.v1.GetSpanTreeRequest\x1a\x1e.traces.v1.GetSpanTreeResponseB4Z2github.com/evalops/proto/gen/go/traces/v1;tracesv1b\x06proto3" + +var ( + file_traces_v1_traces_proto_rawDescOnce sync.Once + file_traces_v1_traces_proto_rawDescData []byte +) + +func file_traces_v1_traces_proto_rawDescGZIP() []byte { + file_traces_v1_traces_proto_rawDescOnce.Do(func() { + file_traces_v1_traces_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_traces_v1_traces_proto_rawDesc), len(file_traces_v1_traces_proto_rawDesc))) + }) + return file_traces_v1_traces_proto_rawDescData +} + +var file_traces_v1_traces_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_traces_v1_traces_proto_msgTypes = make([]protoimpl.MessageInfo, 11) +var file_traces_v1_traces_proto_goTypes = []any{ + (SpanStatus)(0), // 0: traces.v1.SpanStatus + (GovernanceDecision)(0), // 1: traces.v1.GovernanceDecision + (*Span)(nil), // 2: traces.v1.Span + (*TraceSummary)(nil), // 3: traces.v1.TraceSummary + (*IngestSpansRequest)(nil), // 4: traces.v1.IngestSpansRequest + (*IngestSpansResponse)(nil), // 5: traces.v1.IngestSpansResponse + (*GetTraceRequest)(nil), // 6: traces.v1.GetTraceRequest + (*GetTraceResponse)(nil), // 7: traces.v1.GetTraceResponse + (*ListTracesRequest)(nil), // 8: traces.v1.ListTracesRequest + (*ListTracesResponse)(nil), // 9: traces.v1.ListTracesResponse + (*GetSpanTreeRequest)(nil), // 10: traces.v1.GetSpanTreeRequest + (*SpanNode)(nil), // 11: traces.v1.SpanNode + (*GetSpanTreeResponse)(nil), // 12: traces.v1.GetSpanTreeResponse + (*structpb.Struct)(nil), // 13: google.protobuf.Struct + (*timestamppb.Timestamp)(nil), // 14: google.protobuf.Timestamp +} +var file_traces_v1_traces_proto_depIdxs = []int32{ + 0, // 0: traces.v1.Span.status:type_name -> traces.v1.SpanStatus + 1, // 1: traces.v1.Span.governance_decision:type_name -> traces.v1.GovernanceDecision + 13, // 2: traces.v1.Span.attributes:type_name -> google.protobuf.Struct + 14, // 3: traces.v1.Span.started_at:type_name -> google.protobuf.Timestamp + 14, // 4: traces.v1.Span.ended_at:type_name -> google.protobuf.Timestamp + 14, // 5: traces.v1.TraceSummary.started_at:type_name -> google.protobuf.Timestamp + 14, // 6: traces.v1.TraceSummary.ended_at:type_name -> google.protobuf.Timestamp + 2, // 7: traces.v1.IngestSpansRequest.spans:type_name -> traces.v1.Span + 3, // 8: traces.v1.IngestSpansResponse.traces:type_name -> traces.v1.TraceSummary + 3, // 9: traces.v1.GetTraceResponse.trace:type_name -> traces.v1.TraceSummary + 2, // 10: traces.v1.GetTraceResponse.spans:type_name -> traces.v1.Span + 14, // 11: traces.v1.ListTracesRequest.start_time:type_name -> google.protobuf.Timestamp + 14, // 12: traces.v1.ListTracesRequest.end_time:type_name -> google.protobuf.Timestamp + 3, // 13: traces.v1.ListTracesResponse.traces:type_name -> traces.v1.TraceSummary + 2, // 14: traces.v1.SpanNode.span:type_name -> traces.v1.Span + 11, // 15: traces.v1.SpanNode.children:type_name -> traces.v1.SpanNode + 3, // 16: traces.v1.GetSpanTreeResponse.trace:type_name -> traces.v1.TraceSummary + 11, // 17: traces.v1.GetSpanTreeResponse.roots:type_name -> traces.v1.SpanNode + 4, // 18: traces.v1.SpanIngestService.IngestSpans:input_type -> traces.v1.IngestSpansRequest + 6, // 19: traces.v1.SpanIngestService.GetTrace:input_type -> traces.v1.GetTraceRequest + 8, // 20: traces.v1.SpanIngestService.ListTraces:input_type -> traces.v1.ListTracesRequest + 10, // 21: traces.v1.SpanIngestService.GetSpanTree:input_type -> traces.v1.GetSpanTreeRequest + 5, // 22: traces.v1.SpanIngestService.IngestSpans:output_type -> traces.v1.IngestSpansResponse + 7, // 23: traces.v1.SpanIngestService.GetTrace:output_type -> traces.v1.GetTraceResponse + 9, // 24: traces.v1.SpanIngestService.ListTraces:output_type -> traces.v1.ListTracesResponse + 12, // 25: traces.v1.SpanIngestService.GetSpanTree:output_type -> traces.v1.GetSpanTreeResponse + 22, // [22:26] is the sub-list for method output_type + 18, // [18:22] is the sub-list for method input_type + 18, // [18:18] is the sub-list for extension type_name + 18, // [18:18] is the sub-list for extension extendee + 0, // [0:18] is the sub-list for field type_name +} + +func init() { file_traces_v1_traces_proto_init() } +func file_traces_v1_traces_proto_init() { + if File_traces_v1_traces_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: unsafe.Slice(unsafe.StringData(file_traces_v1_traces_proto_rawDesc), len(file_traces_v1_traces_proto_rawDesc)), + NumEnums: 2, + NumMessages: 11, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_traces_v1_traces_proto_goTypes, + DependencyIndexes: file_traces_v1_traces_proto_depIdxs, + EnumInfos: file_traces_v1_traces_proto_enumTypes, + MessageInfos: file_traces_v1_traces_proto_msgTypes, + }.Build() + File_traces_v1_traces_proto = out.File + file_traces_v1_traces_proto_goTypes = nil + file_traces_v1_traces_proto_depIdxs = nil +} diff --git a/gen/go/traces/v1/tracesv1connect/traces.connect.go b/gen/go/traces/v1/tracesv1connect/traces.connect.go new file mode 100644 index 0000000..18252ab --- /dev/null +++ b/gen/go/traces/v1/tracesv1connect/traces.connect.go @@ -0,0 +1,196 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: traces/v1/traces.proto + +package tracesv1connect + +import ( + connect "connectrpc.com/connect" + context "context" + errors "errors" + v1 "github.com/evalops/proto/gen/go/traces/v1" + http "net/http" + strings "strings" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // SpanIngestServiceName is the fully-qualified name of the SpanIngestService service. + SpanIngestServiceName = "traces.v1.SpanIngestService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // SpanIngestServiceIngestSpansProcedure is the fully-qualified name of the SpanIngestService's + // IngestSpans RPC. + SpanIngestServiceIngestSpansProcedure = "/traces.v1.SpanIngestService/IngestSpans" + // SpanIngestServiceGetTraceProcedure is the fully-qualified name of the SpanIngestService's + // GetTrace RPC. + SpanIngestServiceGetTraceProcedure = "/traces.v1.SpanIngestService/GetTrace" + // SpanIngestServiceListTracesProcedure is the fully-qualified name of the SpanIngestService's + // ListTraces RPC. + SpanIngestServiceListTracesProcedure = "/traces.v1.SpanIngestService/ListTraces" + // SpanIngestServiceGetSpanTreeProcedure is the fully-qualified name of the SpanIngestService's + // GetSpanTree RPC. + SpanIngestServiceGetSpanTreeProcedure = "/traces.v1.SpanIngestService/GetSpanTree" +) + +// SpanIngestServiceClient is a client for the traces.v1.SpanIngestService service. +type SpanIngestServiceClient interface { + IngestSpans(context.Context, *connect.Request[v1.IngestSpansRequest]) (*connect.Response[v1.IngestSpansResponse], error) + GetTrace(context.Context, *connect.Request[v1.GetTraceRequest]) (*connect.Response[v1.GetTraceResponse], error) + ListTraces(context.Context, *connect.Request[v1.ListTracesRequest]) (*connect.Response[v1.ListTracesResponse], error) + GetSpanTree(context.Context, *connect.Request[v1.GetSpanTreeRequest]) (*connect.Response[v1.GetSpanTreeResponse], error) +} + +// NewSpanIngestServiceClient constructs a client for the traces.v1.SpanIngestService service. By +// default, it uses the Connect protocol with the binary Protobuf Codec, asks for gzipped responses, +// and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply the +// connect.WithGRPC() or connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewSpanIngestServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) SpanIngestServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + spanIngestServiceMethods := v1.File_traces_v1_traces_proto.Services().ByName("SpanIngestService").Methods() + return &spanIngestServiceClient{ + ingestSpans: connect.NewClient[v1.IngestSpansRequest, v1.IngestSpansResponse]( + httpClient, + baseURL+SpanIngestServiceIngestSpansProcedure, + connect.WithSchema(spanIngestServiceMethods.ByName("IngestSpans")), + connect.WithClientOptions(opts...), + ), + getTrace: connect.NewClient[v1.GetTraceRequest, v1.GetTraceResponse]( + httpClient, + baseURL+SpanIngestServiceGetTraceProcedure, + connect.WithSchema(spanIngestServiceMethods.ByName("GetTrace")), + connect.WithClientOptions(opts...), + ), + listTraces: connect.NewClient[v1.ListTracesRequest, v1.ListTracesResponse]( + httpClient, + baseURL+SpanIngestServiceListTracesProcedure, + connect.WithSchema(spanIngestServiceMethods.ByName("ListTraces")), + connect.WithClientOptions(opts...), + ), + getSpanTree: connect.NewClient[v1.GetSpanTreeRequest, v1.GetSpanTreeResponse]( + httpClient, + baseURL+SpanIngestServiceGetSpanTreeProcedure, + connect.WithSchema(spanIngestServiceMethods.ByName("GetSpanTree")), + connect.WithClientOptions(opts...), + ), + } +} + +// spanIngestServiceClient implements SpanIngestServiceClient. +type spanIngestServiceClient struct { + ingestSpans *connect.Client[v1.IngestSpansRequest, v1.IngestSpansResponse] + getTrace *connect.Client[v1.GetTraceRequest, v1.GetTraceResponse] + listTraces *connect.Client[v1.ListTracesRequest, v1.ListTracesResponse] + getSpanTree *connect.Client[v1.GetSpanTreeRequest, v1.GetSpanTreeResponse] +} + +// IngestSpans calls traces.v1.SpanIngestService.IngestSpans. +func (c *spanIngestServiceClient) IngestSpans(ctx context.Context, req *connect.Request[v1.IngestSpansRequest]) (*connect.Response[v1.IngestSpansResponse], error) { + return c.ingestSpans.CallUnary(ctx, req) +} + +// GetTrace calls traces.v1.SpanIngestService.GetTrace. +func (c *spanIngestServiceClient) GetTrace(ctx context.Context, req *connect.Request[v1.GetTraceRequest]) (*connect.Response[v1.GetTraceResponse], error) { + return c.getTrace.CallUnary(ctx, req) +} + +// ListTraces calls traces.v1.SpanIngestService.ListTraces. +func (c *spanIngestServiceClient) ListTraces(ctx context.Context, req *connect.Request[v1.ListTracesRequest]) (*connect.Response[v1.ListTracesResponse], error) { + return c.listTraces.CallUnary(ctx, req) +} + +// GetSpanTree calls traces.v1.SpanIngestService.GetSpanTree. +func (c *spanIngestServiceClient) GetSpanTree(ctx context.Context, req *connect.Request[v1.GetSpanTreeRequest]) (*connect.Response[v1.GetSpanTreeResponse], error) { + return c.getSpanTree.CallUnary(ctx, req) +} + +// SpanIngestServiceHandler is an implementation of the traces.v1.SpanIngestService service. +type SpanIngestServiceHandler interface { + IngestSpans(context.Context, *connect.Request[v1.IngestSpansRequest]) (*connect.Response[v1.IngestSpansResponse], error) + GetTrace(context.Context, *connect.Request[v1.GetTraceRequest]) (*connect.Response[v1.GetTraceResponse], error) + ListTraces(context.Context, *connect.Request[v1.ListTracesRequest]) (*connect.Response[v1.ListTracesResponse], error) + GetSpanTree(context.Context, *connect.Request[v1.GetSpanTreeRequest]) (*connect.Response[v1.GetSpanTreeResponse], error) +} + +// NewSpanIngestServiceHandler builds an HTTP handler from the service implementation. It returns +// the path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewSpanIngestServiceHandler(svc SpanIngestServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + spanIngestServiceMethods := v1.File_traces_v1_traces_proto.Services().ByName("SpanIngestService").Methods() + spanIngestServiceIngestSpansHandler := connect.NewUnaryHandler( + SpanIngestServiceIngestSpansProcedure, + svc.IngestSpans, + connect.WithSchema(spanIngestServiceMethods.ByName("IngestSpans")), + connect.WithHandlerOptions(opts...), + ) + spanIngestServiceGetTraceHandler := connect.NewUnaryHandler( + SpanIngestServiceGetTraceProcedure, + svc.GetTrace, + connect.WithSchema(spanIngestServiceMethods.ByName("GetTrace")), + connect.WithHandlerOptions(opts...), + ) + spanIngestServiceListTracesHandler := connect.NewUnaryHandler( + SpanIngestServiceListTracesProcedure, + svc.ListTraces, + connect.WithSchema(spanIngestServiceMethods.ByName("ListTraces")), + connect.WithHandlerOptions(opts...), + ) + spanIngestServiceGetSpanTreeHandler := connect.NewUnaryHandler( + SpanIngestServiceGetSpanTreeProcedure, + svc.GetSpanTree, + connect.WithSchema(spanIngestServiceMethods.ByName("GetSpanTree")), + connect.WithHandlerOptions(opts...), + ) + return "/traces.v1.SpanIngestService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case SpanIngestServiceIngestSpansProcedure: + spanIngestServiceIngestSpansHandler.ServeHTTP(w, r) + case SpanIngestServiceGetTraceProcedure: + spanIngestServiceGetTraceHandler.ServeHTTP(w, r) + case SpanIngestServiceListTracesProcedure: + spanIngestServiceListTracesHandler.ServeHTTP(w, r) + case SpanIngestServiceGetSpanTreeProcedure: + spanIngestServiceGetSpanTreeHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedSpanIngestServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedSpanIngestServiceHandler struct{} + +func (UnimplementedSpanIngestServiceHandler) IngestSpans(context.Context, *connect.Request[v1.IngestSpansRequest]) (*connect.Response[v1.IngestSpansResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("traces.v1.SpanIngestService.IngestSpans is not implemented")) +} + +func (UnimplementedSpanIngestServiceHandler) GetTrace(context.Context, *connect.Request[v1.GetTraceRequest]) (*connect.Response[v1.GetTraceResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("traces.v1.SpanIngestService.GetTrace is not implemented")) +} + +func (UnimplementedSpanIngestServiceHandler) ListTraces(context.Context, *connect.Request[v1.ListTracesRequest]) (*connect.Response[v1.ListTracesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("traces.v1.SpanIngestService.ListTraces is not implemented")) +} + +func (UnimplementedSpanIngestServiceHandler) GetSpanTree(context.Context, *connect.Request[v1.GetSpanTreeRequest]) (*connect.Response[v1.GetSpanTreeResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("traces.v1.SpanIngestService.GetSpanTree is not implemented")) +} diff --git a/gen/python/traces/v1/traces_pb2.py b/gen/python/traces/v1/traces_pb2.py new file mode 100644 index 0000000..211361c --- /dev/null +++ b/gen/python/traces/v1/traces_pb2.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: traces/v1/traces.proto +# Protobuf Python Version: 7.34.1 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 7, + 34, + 1, + '', + 'traces/v1/traces.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2 +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16traces/v1/traces.proto\x12\ttraces.v1\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xe3\x05\n\x04Span\x12\x19\n\x08trace_id\x18\x01 \x01(\tR\x07traceId\x12\x17\n\x07span_id\x18\x02 \x01(\tR\x06spanId\x12$\n\x0eparent_span_id\x18\x03 \x01(\tR\x0cparentSpanId\x12!\n\x0cworkspace_id\x18\x04 \x01(\tR\x0bworkspaceId\x12\'\n\x0forganization_id\x18\x05 \x01(\tR\x0eorganizationId\x12\x19\n\x08\x61gent_id\x18\x06 \x01(\tR\x07\x61gentId\x12\x18\n\x07surface\x18\x07 \x01(\tR\x07surface\x12\x12\n\x04name\x18\x08 \x01(\tR\x04name\x12\x12\n\x04kind\x18\t \x01(\tR\x04kind\x12\x14\n\x05model\x18\n \x01(\tR\x05model\x12\x1a\n\x08provider\x18\x0b \x01(\tR\x08provider\x12\x1f\n\x0btoken_input\x18\x0c \x01(\x03R\ntokenInput\x12!\n\x0ctoken_output\x18\r \x01(\x03R\x0btokenOutput\x12\x1d\n\nlatency_ms\x18\x0e \x01(\x03R\tlatencyMs\x12-\n\x06status\x18\x0f \x01(\x0e\x32\x15.traces.v1.SpanStatusR\x06status\x12N\n\x13governance_decision\x18\x10 \x01(\x0e\x32\x1d.traces.v1.GovernanceDecisionR\x12governanceDecision\x12\x19\n\x08\x63ost_usd\x18\x11 \x01(\x01R\x07\x63ostUsd\x12\x37\n\nattributes\x18\x12 \x01(\x0b\x32\x17.google.protobuf.StructR\nattributes\x12\x39\n\nstarted_at\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tstartedAt\x12\x35\n\x08\x65nded_at\x18\x14 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x07\x65ndedAt\"\x8d\x04\n\x0cTraceSummary\x12\x19\n\x08trace_id\x18\x01 \x01(\tR\x07traceId\x12!\n\x0cworkspace_id\x18\x02 \x01(\tR\x0bworkspaceId\x12\'\n\x0forganization_id\x18\x03 \x01(\tR\x0eorganizationId\x12\x19\n\x08\x61gent_id\x18\x04 \x01(\tR\x07\x61gentId\x12\x18\n\x07surface\x18\x05 \x01(\tR\x07surface\x12$\n\x0eroot_span_name\x18\x06 \x01(\tR\x0crootSpanName\x12\x1f\n\x0btotal_spans\x18\x07 \x01(\x05R\ntotalSpans\x12*\n\x11total_token_input\x18\x08 \x01(\x03R\x0ftotalTokenInput\x12,\n\x12total_token_output\x18\t \x01(\x03R\x10totalTokenOutput\x12$\n\x0etotal_cost_usd\x18\n \x01(\x01R\x0ctotalCostUsd\x12(\n\x10total_latency_ms\x18\x0b \x01(\x03R\x0etotalLatencyMs\x12\x39\n\nstarted_at\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tstartedAt\x12\x35\n\x08\x65nded_at\x18\r \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x07\x65ndedAt\";\n\x12IngestSpansRequest\x12%\n\x05spans\x18\x01 \x03(\x0b\x32\x0f.traces.v1.SpanR\x05spans\"m\n\x13IngestSpansResponse\x12%\n\x0eingested_count\x18\x01 \x01(\x05R\ringestedCount\x12/\n\x06traces\x18\x02 \x03(\x0b\x32\x17.traces.v1.TraceSummaryR\x06traces\",\n\x0fGetTraceRequest\x12\x19\n\x08trace_id\x18\x01 \x01(\tR\x07traceId\"h\n\x10GetTraceResponse\x12-\n\x05trace\x18\x01 \x01(\x0b\x32\x17.traces.v1.TraceSummaryR\x05trace\x12%\n\x05spans\x18\x02 \x03(\x0b\x32\x0f.traces.v1.SpanR\x05spans\"\x8b\x02\n\x11ListTracesRequest\x12!\n\x0cworkspace_id\x18\x01 \x01(\tR\x0bworkspaceId\x12\x19\n\x08\x61gent_id\x18\x02 \x01(\tR\x07\x61gentId\x12\x18\n\x07surface\x18\x03 \x01(\tR\x07surface\x12\x39\n\nstart_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tstartTime\x12\x35\n\x08\x65nd_time\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x07\x65ndTime\x12\x14\n\x05limit\x18\x06 \x01(\x05R\x05limit\x12\x16\n\x06offset\x18\x07 \x01(\x05R\x06offset\"v\n\x12ListTracesResponse\x12/\n\x06traces\x18\x01 \x03(\x0b\x32\x17.traces.v1.TraceSummaryR\x06traces\x12\x14\n\x05total\x18\x02 \x01(\x05R\x05total\x12\x19\n\x08has_more\x18\x03 \x01(\x08R\x07hasMore\"/\n\x12GetSpanTreeRequest\x12\x19\n\x08trace_id\x18\x01 \x01(\tR\x07traceId\"`\n\x08SpanNode\x12#\n\x04span\x18\x01 \x01(\x0b\x32\x0f.traces.v1.SpanR\x04span\x12/\n\x08\x63hildren\x18\x02 \x03(\x0b\x32\x13.traces.v1.SpanNodeR\x08\x63hildren\"o\n\x13GetSpanTreeResponse\x12-\n\x05trace\x18\x01 \x01(\x0b\x32\x17.traces.v1.TraceSummaryR\x05trace\x12)\n\x05roots\x18\x02 \x03(\x0b\x32\x13.traces.v1.SpanNodeR\x05roots*o\n\nSpanStatus\x12\x1b\n\x17SPAN_STATUS_UNSPECIFIED\x10\x00\x12\x12\n\x0eSPAN_STATUS_OK\x10\x01\x12\x15\n\x11SPAN_STATUS_ERROR\x10\x02\x12\x19\n\x15SPAN_STATUS_CANCELLED\x10\x03*\xc7\x01\n\x12GovernanceDecision\x12#\n\x1fGOVERNANCE_DECISION_UNSPECIFIED\x10\x00\x12\x1d\n\x19GOVERNANCE_DECISION_ALLOW\x10\x01\x12\x1c\n\x18GOVERNANCE_DECISION_DENY\x10\x02\x12(\n$GOVERNANCE_DECISION_REQUIRE_APPROVAL\x10\x03\x12%\n!GOVERNANCE_DECISION_AUTO_APPROVED\x10\x04\x32\xbf\x02\n\x11SpanIngestService\x12L\n\x0bIngestSpans\x12\x1d.traces.v1.IngestSpansRequest\x1a\x1e.traces.v1.IngestSpansResponse\x12\x43\n\x08GetTrace\x12\x1a.traces.v1.GetTraceRequest\x1a\x1b.traces.v1.GetTraceResponse\x12I\n\nListTraces\x12\x1c.traces.v1.ListTracesRequest\x1a\x1d.traces.v1.ListTracesResponse\x12L\n\x0bGetSpanTree\x12\x1d.traces.v1.GetSpanTreeRequest\x1a\x1e.traces.v1.GetSpanTreeResponseB4Z2github.com/evalops/proto/gen/go/traces/v1;tracesv1b\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'traces.v1.traces_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'Z2github.com/evalops/proto/gen/go/traces/v1;tracesv1' + _globals['_SPANSTATUS']._serialized_start=2344 + _globals['_SPANSTATUS']._serialized_end=2455 + _globals['_GOVERNANCEDECISION']._serialized_start=2458 + _globals['_GOVERNANCEDECISION']._serialized_end=2657 + _globals['_SPAN']._serialized_start=101 + _globals['_SPAN']._serialized_end=840 + _globals['_TRACESUMMARY']._serialized_start=843 + _globals['_TRACESUMMARY']._serialized_end=1368 + _globals['_INGESTSPANSREQUEST']._serialized_start=1370 + _globals['_INGESTSPANSREQUEST']._serialized_end=1429 + _globals['_INGESTSPANSRESPONSE']._serialized_start=1431 + _globals['_INGESTSPANSRESPONSE']._serialized_end=1540 + _globals['_GETTRACEREQUEST']._serialized_start=1542 + _globals['_GETTRACEREQUEST']._serialized_end=1586 + _globals['_GETTRACERESPONSE']._serialized_start=1588 + _globals['_GETTRACERESPONSE']._serialized_end=1692 + _globals['_LISTTRACESREQUEST']._serialized_start=1695 + _globals['_LISTTRACESREQUEST']._serialized_end=1962 + _globals['_LISTTRACESRESPONSE']._serialized_start=1964 + _globals['_LISTTRACESRESPONSE']._serialized_end=2082 + _globals['_GETSPANTREEREQUEST']._serialized_start=2084 + _globals['_GETSPANTREEREQUEST']._serialized_end=2131 + _globals['_SPANNODE']._serialized_start=2133 + _globals['_SPANNODE']._serialized_end=2229 + _globals['_GETSPANTREERESPONSE']._serialized_start=2231 + _globals['_GETSPANTREERESPONSE']._serialized_end=2342 + _globals['_SPANINGESTSERVICE']._serialized_start=2660 + _globals['_SPANINGESTSERVICE']._serialized_end=2979 +# @@protoc_insertion_point(module_scope) diff --git a/gen/ts/traces/v1/traces_connect.ts b/gen/ts/traces/v1/traces_connect.ts new file mode 100644 index 0000000..ac0a4bf --- /dev/null +++ b/gen/ts/traces/v1/traces_connect.ts @@ -0,0 +1,55 @@ +// @generated by protoc-gen-connect-es v1.6.1 with parameter "target=ts,import_extension=.js" +// @generated from file traces/v1/traces.proto (package traces.v1, syntax proto3) +/* eslint-disable */ +// @ts-nocheck + +import { GetSpanTreeRequest, GetSpanTreeResponse, GetTraceRequest, GetTraceResponse, IngestSpansRequest, IngestSpansResponse, ListTracesRequest, ListTracesResponse } from "./traces_pb.js"; +import { MethodKind } from "@bufbuild/protobuf"; + +/** + * SpanIngestService records and queries agent execution traces. + * + * @generated from service traces.v1.SpanIngestService + */ +export const SpanIngestService = { + typeName: "traces.v1.SpanIngestService", + methods: { + /** + * @generated from rpc traces.v1.SpanIngestService.IngestSpans + */ + ingestSpans: { + name: "IngestSpans", + I: IngestSpansRequest, + O: IngestSpansResponse, + kind: MethodKind.Unary, + }, + /** + * @generated from rpc traces.v1.SpanIngestService.GetTrace + */ + getTrace: { + name: "GetTrace", + I: GetTraceRequest, + O: GetTraceResponse, + kind: MethodKind.Unary, + }, + /** + * @generated from rpc traces.v1.SpanIngestService.ListTraces + */ + listTraces: { + name: "ListTraces", + I: ListTracesRequest, + O: ListTracesResponse, + kind: MethodKind.Unary, + }, + /** + * @generated from rpc traces.v1.SpanIngestService.GetSpanTree + */ + getSpanTree: { + name: "GetSpanTree", + I: GetSpanTreeRequest, + O: GetSpanTreeResponse, + kind: MethodKind.Unary, + }, + } +} as const; + diff --git a/gen/ts/traces/v1/traces_pb.ts b/gen/ts/traces/v1/traces_pb.ts new file mode 100644 index 0000000..db45f53 --- /dev/null +++ b/gen/ts/traces/v1/traces_pb.ts @@ -0,0 +1,526 @@ +// @generated by protoc-gen-es v2.11.0 with parameter "target=ts,import_extension=.js" +// @generated from file traces/v1/traces.proto (package traces.v1, syntax proto3) +/* eslint-disable */ + +import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2"; +import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2"; +import type { Timestamp } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_struct, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt"; +import type { JsonObject, Message } from "@bufbuild/protobuf"; + +/** + * Describes the file traces/v1/traces.proto. + */ +export const file_traces_v1_traces: GenFile = /*@__PURE__*/ + fileDesc("ChZ0cmFjZXMvdjEvdHJhY2VzLnByb3RvEgl0cmFjZXMudjEijwQKBFNwYW4SEAoIdHJhY2VfaWQYASABKAkSDwoHc3Bhbl9pZBgCIAEoCRIWCg5wYXJlbnRfc3Bhbl9pZBgDIAEoCRIUCgx3b3Jrc3BhY2VfaWQYBCABKAkSFwoPb3JnYW5pemF0aW9uX2lkGAUgASgJEhAKCGFnZW50X2lkGAYgASgJEg8KB3N1cmZhY2UYByABKAkSDAoEbmFtZRgIIAEoCRIMCgRraW5kGAkgASgJEg0KBW1vZGVsGAogASgJEhAKCHByb3ZpZGVyGAsgASgJEhMKC3Rva2VuX2lucHV0GAwgASgDEhQKDHRva2VuX291dHB1dBgNIAEoAxISCgpsYXRlbmN5X21zGA4gASgDEiUKBnN0YXR1cxgPIAEoDjIVLnRyYWNlcy52MS5TcGFuU3RhdHVzEjoKE2dvdmVybmFuY2VfZGVjaXNpb24YECABKA4yHS50cmFjZXMudjEuR292ZXJuYW5jZURlY2lzaW9uEhAKCGNvc3RfdXNkGBEgASgBEisKCmF0dHJpYnV0ZXMYEiABKAsyFy5nb29nbGUucHJvdG9idWYuU3RydWN0Ei4KCnN0YXJ0ZWRfYXQYEyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEiwKCGVuZGVkX2F0GBQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCLmAgoMVHJhY2VTdW1tYXJ5EhAKCHRyYWNlX2lkGAEgASgJEhQKDHdvcmtzcGFjZV9pZBgCIAEoCRIXCg9vcmdhbml6YXRpb25faWQYAyABKAkSEAoIYWdlbnRfaWQYBCABKAkSDwoHc3VyZmFjZRgFIAEoCRIWCg5yb290X3NwYW5fbmFtZRgGIAEoCRITCgt0b3RhbF9zcGFucxgHIAEoBRIZChF0b3RhbF90b2tlbl9pbnB1dBgIIAEoAxIaChJ0b3RhbF90b2tlbl9vdXRwdXQYCSABKAMSFgoOdG90YWxfY29zdF91c2QYCiABKAESGAoQdG90YWxfbGF0ZW5jeV9tcxgLIAEoAxIuCgpzdGFydGVkX2F0GAwgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIsCghlbmRlZF9hdBgNIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiNAoSSW5nZXN0U3BhbnNSZXF1ZXN0Eh4KBXNwYW5zGAEgAygLMg8udHJhY2VzLnYxLlNwYW4iVgoTSW5nZXN0U3BhbnNSZXNwb25zZRIWCg5pbmdlc3RlZF9jb3VudBgBIAEoBRInCgZ0cmFjZXMYAiADKAsyFy50cmFjZXMudjEuVHJhY2VTdW1tYXJ5IiMKD0dldFRyYWNlUmVxdWVzdBIQCgh0cmFjZV9pZBgBIAEoCSJaChBHZXRUcmFjZVJlc3BvbnNlEiYKBXRyYWNlGAEgASgLMhcudHJhY2VzLnYxLlRyYWNlU3VtbWFyeRIeCgVzcGFucxgCIAMoCzIPLnRyYWNlcy52MS5TcGFuIskBChFMaXN0VHJhY2VzUmVxdWVzdBIUCgx3b3Jrc3BhY2VfaWQYASABKAkSEAoIYWdlbnRfaWQYAiABKAkSDwoHc3VyZmFjZRgDIAEoCRIuCgpzdGFydF90aW1lGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIsCghlbmRfdGltZRgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASDQoFbGltaXQYBiABKAUSDgoGb2Zmc2V0GAcgASgFIl4KEkxpc3RUcmFjZXNSZXNwb25zZRInCgZ0cmFjZXMYASADKAsyFy50cmFjZXMudjEuVHJhY2VTdW1tYXJ5Eg0KBXRvdGFsGAIgASgFEhAKCGhhc19tb3JlGAMgASgIIiYKEkdldFNwYW5UcmVlUmVxdWVzdBIQCgh0cmFjZV9pZBgBIAEoCSJQCghTcGFuTm9kZRIdCgRzcGFuGAEgASgLMg8udHJhY2VzLnYxLlNwYW4SJQoIY2hpbGRyZW4YAiADKAsyEy50cmFjZXMudjEuU3Bhbk5vZGUiYQoTR2V0U3BhblRyZWVSZXNwb25zZRImCgV0cmFjZRgBIAEoCzIXLnRyYWNlcy52MS5UcmFjZVN1bW1hcnkSIgoFcm9vdHMYAiADKAsyEy50cmFjZXMudjEuU3Bhbk5vZGUqbwoKU3BhblN0YXR1cxIbChdTUEFOX1NUQVRVU19VTlNQRUNJRklFRBAAEhIKDlNQQU5fU1RBVFVTX09LEAESFQoRU1BBTl9TVEFUVVNfRVJST1IQAhIZChVTUEFOX1NUQVRVU19DQU5DRUxMRUQQAyrHAQoSR292ZXJuYW5jZURlY2lzaW9uEiMKH0dPVkVSTkFOQ0VfREVDSVNJT05fVU5TUEVDSUZJRUQQABIdChlHT1ZFUk5BTkNFX0RFQ0lTSU9OX0FMTE9XEAESHAoYR09WRVJOQU5DRV9ERUNJU0lPTl9ERU5ZEAISKAokR09WRVJOQU5DRV9ERUNJU0lPTl9SRVFVSVJFX0FQUFJPVkFMEAMSJQohR09WRVJOQU5DRV9ERUNJU0lPTl9BVVRPX0FQUFJPVkVEEAQyvwIKEVNwYW5Jbmdlc3RTZXJ2aWNlEkwKC0luZ2VzdFNwYW5zEh0udHJhY2VzLnYxLkluZ2VzdFNwYW5zUmVxdWVzdBoeLnRyYWNlcy52MS5Jbmdlc3RTcGFuc1Jlc3BvbnNlEkMKCEdldFRyYWNlEhoudHJhY2VzLnYxLkdldFRyYWNlUmVxdWVzdBobLnRyYWNlcy52MS5HZXRUcmFjZVJlc3BvbnNlEkkKCkxpc3RUcmFjZXMSHC50cmFjZXMudjEuTGlzdFRyYWNlc1JlcXVlc3QaHS50cmFjZXMudjEuTGlzdFRyYWNlc1Jlc3BvbnNlEkwKC0dldFNwYW5UcmVlEh0udHJhY2VzLnYxLkdldFNwYW5UcmVlUmVxdWVzdBoeLnRyYWNlcy52MS5HZXRTcGFuVHJlZVJlc3BvbnNlQjRaMmdpdGh1Yi5jb20vZXZhbG9wcy9wcm90by9nZW4vZ28vdHJhY2VzL3YxO3RyYWNlc3YxYgZwcm90bzM", [file_google_protobuf_struct, file_google_protobuf_timestamp]); + +/** + * @generated from message traces.v1.Span + */ +export type Span = Message<"traces.v1.Span"> & { + /** + * @generated from field: string trace_id = 1; + */ + traceId: string; + + /** + * @generated from field: string span_id = 2; + */ + spanId: string; + + /** + * @generated from field: string parent_span_id = 3; + */ + parentSpanId: string; + + /** + * @generated from field: string workspace_id = 4; + */ + workspaceId: string; + + /** + * @generated from field: string organization_id = 5; + */ + organizationId: string; + + /** + * @generated from field: string agent_id = 6; + */ + agentId: string; + + /** + * @generated from field: string surface = 7; + */ + surface: string; + + /** + * @generated from field: string name = 8; + */ + name: string; + + /** + * @generated from field: string kind = 9; + */ + kind: string; + + /** + * @generated from field: string model = 10; + */ + model: string; + + /** + * @generated from field: string provider = 11; + */ + provider: string; + + /** + * @generated from field: int64 token_input = 12; + */ + tokenInput: bigint; + + /** + * @generated from field: int64 token_output = 13; + */ + tokenOutput: bigint; + + /** + * @generated from field: int64 latency_ms = 14; + */ + latencyMs: bigint; + + /** + * @generated from field: traces.v1.SpanStatus status = 15; + */ + status: SpanStatus; + + /** + * @generated from field: traces.v1.GovernanceDecision governance_decision = 16; + */ + governanceDecision: GovernanceDecision; + + /** + * @generated from field: double cost_usd = 17; + */ + costUsd: number; + + /** + * @generated from field: google.protobuf.Struct attributes = 18; + */ + attributes?: JsonObject; + + /** + * @generated from field: google.protobuf.Timestamp started_at = 19; + */ + startedAt?: Timestamp; + + /** + * @generated from field: google.protobuf.Timestamp ended_at = 20; + */ + endedAt?: Timestamp; +}; + +/** + * Describes the message traces.v1.Span. + * Use `create(SpanSchema)` to create a new message. + */ +export const SpanSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_traces_v1_traces, 0); + +/** + * @generated from message traces.v1.TraceSummary + */ +export type TraceSummary = Message<"traces.v1.TraceSummary"> & { + /** + * @generated from field: string trace_id = 1; + */ + traceId: string; + + /** + * @generated from field: string workspace_id = 2; + */ + workspaceId: string; + + /** + * @generated from field: string organization_id = 3; + */ + organizationId: string; + + /** + * @generated from field: string agent_id = 4; + */ + agentId: string; + + /** + * @generated from field: string surface = 5; + */ + surface: string; + + /** + * @generated from field: string root_span_name = 6; + */ + rootSpanName: string; + + /** + * @generated from field: int32 total_spans = 7; + */ + totalSpans: number; + + /** + * @generated from field: int64 total_token_input = 8; + */ + totalTokenInput: bigint; + + /** + * @generated from field: int64 total_token_output = 9; + */ + totalTokenOutput: bigint; + + /** + * @generated from field: double total_cost_usd = 10; + */ + totalCostUsd: number; + + /** + * @generated from field: int64 total_latency_ms = 11; + */ + totalLatencyMs: bigint; + + /** + * @generated from field: google.protobuf.Timestamp started_at = 12; + */ + startedAt?: Timestamp; + + /** + * @generated from field: google.protobuf.Timestamp ended_at = 13; + */ + endedAt?: Timestamp; +}; + +/** + * Describes the message traces.v1.TraceSummary. + * Use `create(TraceSummarySchema)` to create a new message. + */ +export const TraceSummarySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_traces_v1_traces, 1); + +/** + * @generated from message traces.v1.IngestSpansRequest + */ +export type IngestSpansRequest = Message<"traces.v1.IngestSpansRequest"> & { + /** + * @generated from field: repeated traces.v1.Span spans = 1; + */ + spans: Span[]; +}; + +/** + * Describes the message traces.v1.IngestSpansRequest. + * Use `create(IngestSpansRequestSchema)` to create a new message. + */ +export const IngestSpansRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_traces_v1_traces, 2); + +/** + * @generated from message traces.v1.IngestSpansResponse + */ +export type IngestSpansResponse = Message<"traces.v1.IngestSpansResponse"> & { + /** + * @generated from field: int32 ingested_count = 1; + */ + ingestedCount: number; + + /** + * @generated from field: repeated traces.v1.TraceSummary traces = 2; + */ + traces: TraceSummary[]; +}; + +/** + * Describes the message traces.v1.IngestSpansResponse. + * Use `create(IngestSpansResponseSchema)` to create a new message. + */ +export const IngestSpansResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_traces_v1_traces, 3); + +/** + * @generated from message traces.v1.GetTraceRequest + */ +export type GetTraceRequest = Message<"traces.v1.GetTraceRequest"> & { + /** + * @generated from field: string trace_id = 1; + */ + traceId: string; +}; + +/** + * Describes the message traces.v1.GetTraceRequest. + * Use `create(GetTraceRequestSchema)` to create a new message. + */ +export const GetTraceRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_traces_v1_traces, 4); + +/** + * @generated from message traces.v1.GetTraceResponse + */ +export type GetTraceResponse = Message<"traces.v1.GetTraceResponse"> & { + /** + * @generated from field: traces.v1.TraceSummary trace = 1; + */ + trace?: TraceSummary; + + /** + * @generated from field: repeated traces.v1.Span spans = 2; + */ + spans: Span[]; +}; + +/** + * Describes the message traces.v1.GetTraceResponse. + * Use `create(GetTraceResponseSchema)` to create a new message. + */ +export const GetTraceResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_traces_v1_traces, 5); + +/** + * @generated from message traces.v1.ListTracesRequest + */ +export type ListTracesRequest = Message<"traces.v1.ListTracesRequest"> & { + /** + * @generated from field: string workspace_id = 1; + */ + workspaceId: string; + + /** + * @generated from field: string agent_id = 2; + */ + agentId: string; + + /** + * @generated from field: string surface = 3; + */ + surface: string; + + /** + * @generated from field: google.protobuf.Timestamp start_time = 4; + */ + startTime?: Timestamp; + + /** + * @generated from field: google.protobuf.Timestamp end_time = 5; + */ + endTime?: Timestamp; + + /** + * @generated from field: int32 limit = 6; + */ + limit: number; + + /** + * @generated from field: int32 offset = 7; + */ + offset: number; +}; + +/** + * Describes the message traces.v1.ListTracesRequest. + * Use `create(ListTracesRequestSchema)` to create a new message. + */ +export const ListTracesRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_traces_v1_traces, 6); + +/** + * @generated from message traces.v1.ListTracesResponse + */ +export type ListTracesResponse = Message<"traces.v1.ListTracesResponse"> & { + /** + * @generated from field: repeated traces.v1.TraceSummary traces = 1; + */ + traces: TraceSummary[]; + + /** + * @generated from field: int32 total = 2; + */ + total: number; + + /** + * @generated from field: bool has_more = 3; + */ + hasMore: boolean; +}; + +/** + * Describes the message traces.v1.ListTracesResponse. + * Use `create(ListTracesResponseSchema)` to create a new message. + */ +export const ListTracesResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_traces_v1_traces, 7); + +/** + * @generated from message traces.v1.GetSpanTreeRequest + */ +export type GetSpanTreeRequest = Message<"traces.v1.GetSpanTreeRequest"> & { + /** + * @generated from field: string trace_id = 1; + */ + traceId: string; +}; + +/** + * Describes the message traces.v1.GetSpanTreeRequest. + * Use `create(GetSpanTreeRequestSchema)` to create a new message. + */ +export const GetSpanTreeRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_traces_v1_traces, 8); + +/** + * @generated from message traces.v1.SpanNode + */ +export type SpanNode = Message<"traces.v1.SpanNode"> & { + /** + * @generated from field: traces.v1.Span span = 1; + */ + span?: Span; + + /** + * @generated from field: repeated traces.v1.SpanNode children = 2; + */ + children: SpanNode[]; +}; + +/** + * Describes the message traces.v1.SpanNode. + * Use `create(SpanNodeSchema)` to create a new message. + */ +export const SpanNodeSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_traces_v1_traces, 9); + +/** + * @generated from message traces.v1.GetSpanTreeResponse + */ +export type GetSpanTreeResponse = Message<"traces.v1.GetSpanTreeResponse"> & { + /** + * @generated from field: traces.v1.TraceSummary trace = 1; + */ + trace?: TraceSummary; + + /** + * @generated from field: repeated traces.v1.SpanNode roots = 2; + */ + roots: SpanNode[]; +}; + +/** + * Describes the message traces.v1.GetSpanTreeResponse. + * Use `create(GetSpanTreeResponseSchema)` to create a new message. + */ +export const GetSpanTreeResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_traces_v1_traces, 10); + +/** + * @generated from enum traces.v1.SpanStatus + */ +export enum SpanStatus { + /** + * @generated from enum value: SPAN_STATUS_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: SPAN_STATUS_OK = 1; + */ + OK = 1, + + /** + * @generated from enum value: SPAN_STATUS_ERROR = 2; + */ + ERROR = 2, + + /** + * @generated from enum value: SPAN_STATUS_CANCELLED = 3; + */ + CANCELLED = 3, +} + +/** + * Describes the enum traces.v1.SpanStatus. + */ +export const SpanStatusSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_traces_v1_traces, 0); + +/** + * @generated from enum traces.v1.GovernanceDecision + */ +export enum GovernanceDecision { + /** + * @generated from enum value: GOVERNANCE_DECISION_UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: GOVERNANCE_DECISION_ALLOW = 1; + */ + ALLOW = 1, + + /** + * @generated from enum value: GOVERNANCE_DECISION_DENY = 2; + */ + DENY = 2, + + /** + * @generated from enum value: GOVERNANCE_DECISION_REQUIRE_APPROVAL = 3; + */ + REQUIRE_APPROVAL = 3, + + /** + * @generated from enum value: GOVERNANCE_DECISION_AUTO_APPROVED = 4; + */ + AUTO_APPROVED = 4, +} + +/** + * Describes the enum traces.v1.GovernanceDecision. + */ +export const GovernanceDecisionSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_traces_v1_traces, 1); + +/** + * SpanIngestService records and queries agent execution traces. + * + * @generated from service traces.v1.SpanIngestService + */ +export const SpanIngestService: GenService<{ + /** + * @generated from rpc traces.v1.SpanIngestService.IngestSpans + */ + ingestSpans: { + methodKind: "unary"; + input: typeof IngestSpansRequestSchema; + output: typeof IngestSpansResponseSchema; + }, + /** + * @generated from rpc traces.v1.SpanIngestService.GetTrace + */ + getTrace: { + methodKind: "unary"; + input: typeof GetTraceRequestSchema; + output: typeof GetTraceResponseSchema; + }, + /** + * @generated from rpc traces.v1.SpanIngestService.ListTraces + */ + listTraces: { + methodKind: "unary"; + input: typeof ListTracesRequestSchema; + output: typeof ListTracesResponseSchema; + }, + /** + * @generated from rpc traces.v1.SpanIngestService.GetSpanTree + */ + getSpanTree: { + methodKind: "unary"; + input: typeof GetSpanTreeRequestSchema; + output: typeof GetSpanTreeResponseSchema; + }, +}> = /*@__PURE__*/ + serviceDesc(file_traces_v1_traces, 0); + diff --git a/proto/traces/v1/traces.proto b/proto/traces/v1/traces.proto new file mode 100644 index 0000000..f870608 --- /dev/null +++ b/proto/traces/v1/traces.proto @@ -0,0 +1,118 @@ +syntax = "proto3"; + +package traces.v1; + +option go_package = "github.com/evalops/proto/gen/go/traces/v1;tracesv1"; + +import "google/protobuf/struct.proto"; +import "google/protobuf/timestamp.proto"; + +// SpanIngestService records and queries agent execution traces. +service SpanIngestService { + rpc IngestSpans(IngestSpansRequest) returns (IngestSpansResponse); + rpc GetTrace(GetTraceRequest) returns (GetTraceResponse); + rpc ListTraces(ListTracesRequest) returns (ListTracesResponse); + rpc GetSpanTree(GetSpanTreeRequest) returns (GetSpanTreeResponse); +} + +enum SpanStatus { + SPAN_STATUS_UNSPECIFIED = 0; + SPAN_STATUS_OK = 1; + SPAN_STATUS_ERROR = 2; + SPAN_STATUS_CANCELLED = 3; +} + +enum GovernanceDecision { + GOVERNANCE_DECISION_UNSPECIFIED = 0; + GOVERNANCE_DECISION_ALLOW = 1; + GOVERNANCE_DECISION_DENY = 2; + GOVERNANCE_DECISION_REQUIRE_APPROVAL = 3; + GOVERNANCE_DECISION_AUTO_APPROVED = 4; +} + +message Span { + string trace_id = 1; + string span_id = 2; + string parent_span_id = 3; + string workspace_id = 4; + string organization_id = 5; + string agent_id = 6; + string surface = 7; + string name = 8; + string kind = 9; + string model = 10; + string provider = 11; + int64 token_input = 12; + int64 token_output = 13; + int64 latency_ms = 14; + SpanStatus status = 15; + GovernanceDecision governance_decision = 16; + double cost_usd = 17; + google.protobuf.Struct attributes = 18; + google.protobuf.Timestamp started_at = 19; + google.protobuf.Timestamp ended_at = 20; +} + +message TraceSummary { + string trace_id = 1; + string workspace_id = 2; + string organization_id = 3; + string agent_id = 4; + string surface = 5; + string root_span_name = 6; + int32 total_spans = 7; + int64 total_token_input = 8; + int64 total_token_output = 9; + double total_cost_usd = 10; + int64 total_latency_ms = 11; + google.protobuf.Timestamp started_at = 12; + google.protobuf.Timestamp ended_at = 13; +} + +message IngestSpansRequest { + repeated Span spans = 1; +} + +message IngestSpansResponse { + int32 ingested_count = 1; + repeated TraceSummary traces = 2; +} + +message GetTraceRequest { + string trace_id = 1; +} + +message GetTraceResponse { + TraceSummary trace = 1; + repeated Span spans = 2; +} + +message ListTracesRequest { + string workspace_id = 1; + string agent_id = 2; + string surface = 3; + google.protobuf.Timestamp start_time = 4; + google.protobuf.Timestamp end_time = 5; + int32 limit = 6; + int32 offset = 7; +} + +message ListTracesResponse { + repeated TraceSummary traces = 1; + int32 total = 2; + bool has_more = 3; +} + +message GetSpanTreeRequest { + string trace_id = 1; +} + +message SpanNode { + Span span = 1; + repeated SpanNode children = 2; +} + +message GetSpanTreeResponse { + TraceSummary trace = 1; + repeated SpanNode roots = 2; +}