diff --git a/web/oss/src/components/EvalRunDetails/atoms/traces.ts b/web/oss/src/components/EvalRunDetails/atoms/traces.ts index 447eda0662..be71007ef1 100644 --- a/web/oss/src/components/EvalRunDetails/atoms/traces.ts +++ b/web/oss/src/components/EvalRunDetails/atoms/traces.ts @@ -3,11 +3,12 @@ import { traceEntityAtomFamily, transformTracesResponseToTree, } from "@agenta/entities/trace" +import type {TracesResponse} from "@agenta/entities/trace" import {uuidToTraceId} from "@agenta/shared/utils" import {atomFamily, selectAtom} from "jotai/utils" import type {TraceData, TraceNode, TraceTree} from "@/oss/lib/evaluations" -import type {TraceSpanNode, TracesResponse} from "@/oss/services/tracing/types" +import type {TraceSpanNode} from "@/oss/services/tracing/types" import {resolveInvocationTraceValue} from "../utils/traceValue" @@ -160,22 +161,14 @@ const buildTraceDataFromEntry = ( }, } - // OSS TracesResponse is the same backend payload shape the entities-package - // transform expects; align at the boundary, no data is converted. - const spanNodes = transformTracesResponseToTree( - scopedResponse as unknown as Parameters[0], - ) + const spanNodes = transformTracesResponseToTree(scopedResponse) if (!spanNodes.length) return null const flat: TraceNode[] = [] spanNodes.forEach((span) => { const inferredTraceId = span.trace_id ?? traceId ?? (span.span_id ? `${span.span_id}-trace` : "trace") - // `transformTracesResponseToTree` yields the entities-package TraceSpanNode, while - // `convertSpanNodeToTraceNode` is written against the structurally-equivalent OSS - // TraceSpanNode (same backend span shape). Align the annotation at the boundary; no - // data is converted. - convertSpanNodeToTraceNode(span as unknown as TraceSpanNode, inferredTraceId, flat) + convertSpanNodeToTraceNode(span, inferredTraceId, flat) }) const treeEntry: TraceTree = { diff --git a/web/oss/src/components/SharedDrawers/SessionDrawer/store/sessionDrawerStore.ts b/web/oss/src/components/SharedDrawers/SessionDrawer/store/sessionDrawerStore.ts index a28199ff31..9f338aec65 100644 --- a/web/oss/src/components/SharedDrawers/SessionDrawer/store/sessionDrawerStore.ts +++ b/web/oss/src/components/SharedDrawers/SessionDrawer/store/sessionDrawerStore.ts @@ -6,6 +6,7 @@ import { transformTracesResponseToTree, transformTracingResponse, } from "@agenta/entities/trace" +import type {SpanLink, TracesResponse} from "@agenta/entities/trace" import {atom} from "jotai" import {atomWithStorage} from "jotai/utils" // import {atomWithImmer} from "jotai-immer" // Not using immer for now to keep it simple or use it if complexity grows @@ -18,7 +19,7 @@ import {AnnotationDto} from "@/oss/lib/hooks/useAnnotations/types" import {getNodeById, observabilityTransformer} from "@/oss/lib/traces/observability_helpers" import {queryAllAnnotations} from "@/oss/services/annotations/api" import {AgentaTreeDTO, TracesWithAnnotations} from "@/oss/services/observability/types" -import {SpanLink, TraceSpanNode, TracesResponse} from "@/oss/services/tracing/types" +import type {TraceSpanNode} from "@/oss/services/tracing/types" import {selectedAppIdAtom} from "@/oss/state/app/selectors/app" import {getOrgValues} from "@/oss/state/org" import {projectIdAtom} from "@/oss/state/project" @@ -135,16 +136,10 @@ export const sessionTracesAtom = atom((get) => { if (!data) return [] const transformed: TraceSpanNode[] = [] - // entities-package TraceSpanNode is the same backend span shape as the OSS type; - // align the annotation at the boundary, no data is converted. if (isTracesResponse(data)) { - transformed.push( - ...(transformTracingResponse( - transformTracesResponseToTree(data), - ) as unknown as TraceSpanNode[]), - ) + transformed.push(...transformTracingResponse(transformTracesResponseToTree(data))) } else if (isSpansResponse(data)) { - transformed.push(...(transformTracingResponse(data.spans) as unknown as TraceSpanNode[])) + transformed.push(...transformTracingResponse(data.spans)) } const filtred = transformed.filter((node) => node.trace_type !== "annotation") diff --git a/web/oss/src/components/SharedDrawers/TraceDrawer/components/TraceContent/components/OverviewTabItem/index.tsx b/web/oss/src/components/SharedDrawers/TraceDrawer/components/TraceContent/components/OverviewTabItem/index.tsx index bed810406e..3ccacbb2d1 100644 --- a/web/oss/src/components/SharedDrawers/TraceDrawer/components/TraceContent/components/OverviewTabItem/index.tsx +++ b/web/oss/src/components/SharedDrawers/TraceDrawer/components/TraceContent/components/OverviewTabItem/index.tsx @@ -1,6 +1,6 @@ import {useMemo} from "react" -import {traceSpanMolecule, type TraceSpan as EntityTraceSpan} from "@agenta/entities/trace" +import {traceSpanMolecule} from "@agenta/entities/trace" import {Space} from "antd" import {useAtomValue} from "jotai" @@ -33,9 +33,7 @@ const OverviewTabItem = ({ const entityWithDrillIn = traceSpanMolecule as typeof traceSpanMolecule & { drillIn: NonNullable } - // OSS TraceSpanNode is the same backend span shape as the entities-package type - // the drill-in API expects; align at the boundary, no data is converted. - const drillInSpan = activeTrace as unknown as EntityTraceSpan + const drillInSpan = activeTrace const metaConfig = useAtomValue(spanMetaConfigurationAtomFamily(activeTrace)) const inputsFromSelectors = useAtomValue(spanDataInputsAtomFamily(activeTrace)) const outputsFromSelectors = useAtomValue(spanDataOutputsAtomFamily(activeTrace)) diff --git a/web/oss/src/components/SharedDrawers/TraceDrawer/components/TraceContent/components/TraceTypeHeader/index.tsx b/web/oss/src/components/SharedDrawers/TraceDrawer/components/TraceContent/components/TraceTypeHeader/index.tsx index fd6a917a61..5d1ba2806e 100644 --- a/web/oss/src/components/SharedDrawers/TraceDrawer/components/TraceContent/components/TraceTypeHeader/index.tsx +++ b/web/oss/src/components/SharedDrawers/TraceDrawer/components/TraceContent/components/TraceTypeHeader/index.tsx @@ -93,13 +93,9 @@ const TraceTypeHeader = ({ } } - // OSS TraceSpanNode is the same backend span shape as the entities-package type - // these helpers expect; align at the boundary, no data is converted. - const agData = extractAgData(activeTrace as unknown as Parameters[0]) + const agData = extractAgData(activeTrace) const hasExtractableData = Boolean(agData?.inputs || agData?.parameters) - const hasApp = hasAppReference( - activeTrace as unknown as Parameters[0], - ) + const hasApp = hasAppReference(activeTrace) const isInvocation = INVOCATION_SPAN_TYPES.has(spanType) // Invocation spans (workflow, task, agent, chain) represent the unit diff --git a/web/oss/src/components/SharedDrawers/TraceDrawer/components/TraceHeader/index.tsx b/web/oss/src/components/SharedDrawers/TraceDrawer/components/TraceHeader/index.tsx index 2c7d45e0eb..84325469e1 100644 --- a/web/oss/src/components/SharedDrawers/TraceDrawer/components/TraceHeader/index.tsx +++ b/web/oss/src/components/SharedDrawers/TraceDrawer/components/TraceHeader/index.tsx @@ -188,20 +188,12 @@ const TraceHeader = ({ }) let candidates: TraceSpanNode[] = [] - // entities-package TraceSpanNode is the same backend span shape as the - // OSS type; align the annotation at the boundary, no data is converted. if (isTracesResponse(response)) { - candidates = transformTracingResponse( - transformTracesResponseToTree(response), - ) as unknown as TraceSpanNode[] + candidates = transformTracingResponse(transformTracesResponseToTree(response)) } else if (isSpansResponse(response)) { - candidates = transformTracingResponse( - response.spans, - ) as unknown as TraceSpanNode[] + candidates = transformTracingResponse(response.spans) } else if (Array.isArray((response as any)?.spans)) { - candidates = transformTracingResponse( - (response as any).spans, - ) as unknown as TraceSpanNode[] + candidates = transformTracingResponse((response as any).spans) } if (!candidates.length) return null diff --git a/web/oss/src/components/SharedDrawers/TraceDrawer/components/TraceTree/assets/spanVisibility.ts b/web/oss/src/components/SharedDrawers/TraceDrawer/components/TraceTree/assets/spanVisibility.ts index efcd8cbf2e..294b069935 100644 --- a/web/oss/src/components/SharedDrawers/TraceDrawer/components/TraceTree/assets/spanVisibility.ts +++ b/web/oss/src/components/SharedDrawers/TraceDrawer/components/TraceTree/assets/spanVisibility.ts @@ -1,4 +1,6 @@ -import {SpanCategory, StatusCode, TraceSpanNode} from "@/oss/services/tracing/types" +import type {SpanCategory} from "@agenta/entities/trace" + +import type {TraceSpanNode} from "@/oss/services/tracing/types" /** * Span tree visibility modes. @@ -29,14 +31,14 @@ export const SPAN_VISIBILITY_OPTIONS: SpanVisibilityOption[] = [ * category here to change what counts as a key span across the whole app. */ export const KEY_SPAN_TYPES: ReadonlySet = new Set([ - SpanCategory.AGENT, - SpanCategory.LLM, - SpanCategory.CHAT, - SpanCategory.COMPLETION, - SpanCategory.TOOL, - SpanCategory.EMBEDDING, - SpanCategory.QUERY, - SpanCategory.RERANK, + "agent", + "llm", + "chat", + "completion", + "tool", + "embedding", + "query", + "rerank", ]) /** @@ -78,7 +80,7 @@ export const keySpanRules: KeySpanRule[] = [ { id: "errored-span", description: "Spans that ended in an error", - test: (node) => node.status_code === StatusCode.STATUS_CODE_ERROR, + test: (node) => node.status_code === "STATUS_CODE_ERROR", }, ] diff --git a/web/oss/src/components/SharedDrawers/TraceDrawer/components/TraceTree/index.tsx b/web/oss/src/components/SharedDrawers/TraceDrawer/components/TraceTree/index.tsx index bcec532d9c..4102ff52cb 100644 --- a/web/oss/src/components/SharedDrawers/TraceDrawer/components/TraceTree/index.tsx +++ b/web/oss/src/components/SharedDrawers/TraceDrawer/components/TraceTree/index.tsx @@ -16,7 +16,7 @@ import {useLocalStorage} from "usehooks-ts" import CustomTreeComponent from "@/oss/components/CustomUIs/CustomTreeComponent" import {filterTree} from "@/oss/components/pages/observability/assets/utils" import AvatarTreeContent from "@/oss/components/pages/observability/components/AvatarTreeContent" -import {StatusCode, TraceSpanNode} from "@/oss/services/tracing/types" +import type {TraceSpanNode} from "@/oss/services/tracing/types" import { formattedSpanCostAtomFamily, formattedSpanLatencyAtomFamily, @@ -50,7 +50,7 @@ export const TreeContent = ({value, settings}: {value: TraceSpanNode; settings: => { - // OSS TraceSpanNode is the same backend span shape as the entities-package type - // the controller expects; align at the boundary, no data is converted. - return set( - playgroundController.actions.openFromTrace, - activeSpan as unknown as EntityTraceSpanNode, - ) + return set(playgroundController.actions.openFromTrace, activeSpan) }, ) diff --git a/web/oss/src/components/SharedDrawers/TraceDrawer/store/traceDrawerStore.ts b/web/oss/src/components/SharedDrawers/TraceDrawer/store/traceDrawerStore.ts index c6b3d87cce..4605577c68 100644 --- a/web/oss/src/components/SharedDrawers/TraceDrawer/store/traceDrawerStore.ts +++ b/web/oss/src/components/SharedDrawers/TraceDrawer/store/traceDrawerStore.ts @@ -3,6 +3,7 @@ import { transformTracesResponseToTree, transformTracingResponse, } from "@agenta/entities/trace" +import type {SpanLink, TracesResponse} from "@agenta/entities/trace" import {atom} from "jotai" import {atomWithStorage} from "jotai/utils" import {atomWithImmer} from "jotai-immer" @@ -14,7 +15,7 @@ import {AnnotationDto} from "@/oss/lib/hooks/useAnnotations/types" import {getNodeById, observabilityTransformer} from "@/oss/lib/traces/observability_helpers" import {queryAllAnnotations} from "@/oss/services/annotations/api" import {AgentaTreeDTO, TracesWithAnnotations} from "@/oss/services/observability/types" -import {SpanLink, TracesResponse, type TraceSpanNode} from "@/oss/services/tracing/types" +import type {TraceSpanNode} from "@/oss/services/tracing/types" import {getOrgValues} from "@/oss/state/org" import {projectIdAtom} from "@/oss/state/project" diff --git a/web/oss/src/components/pages/observability/assets/constants.ts b/web/oss/src/components/pages/observability/assets/constants.ts index 4a122f9bb2..4da7cee2bc 100644 --- a/web/oss/src/components/pages/observability/assets/constants.ts +++ b/web/oss/src/components/pages/observability/assets/constants.ts @@ -1,3 +1,6 @@ +import type {ComponentType} from "react" + +import type {SpanCategory} from "@agenta/entities/trace" import { ArrowBendRightDownIcon, ArrowBendRightUpIcon, @@ -17,10 +20,10 @@ import { TreeStructureIcon, TreeViewIcon, WarningOctagonIcon, + type IconProps, } from "@phosphor-icons/react" import {FilterMenuNode} from "@/oss/components/Filters/types" -import {SpanCategory} from "@/oss/services/tracing/types" import { COLLECTION_MEMBERSHIP_OPS, @@ -699,63 +702,67 @@ export const FILTER_COLUMNS: FilterMenuNode[] = [ // }, ] -export const spanTypeStyles = { - [SpanCategory.AGENT]: { +/** Keyed by the canonical SpanCategory union, so a new backend category fails the build. */ +export const spanTypeStyles: Record< + SpanCategory, + {bgColor: string; color: string; icon: ComponentType} +> = { + ["agent"]: { bgColor: "var(--ant-blue-1)", color: "var(--ant-blue-5)", icon: Gear, }, - [SpanCategory.WORKFLOW]: { + ["workflow"]: { color: "var(--ant-color-text-secondary)", bgColor: "var(--ant-color-fill-secondary)", icon: TreeStructureIcon, }, - [SpanCategory.CHAIN]: { + ["chain"]: { bgColor: "var(--ant-blue-1)", color: "var(--ant-blue-5)", icon: Gear, }, - [SpanCategory.TASK]: { + ["task"]: { bgColor: "var(--ag-zinc-2)", color: "var(--ant-color-text-secondary)", icon: TreeStructureIcon, }, - [SpanCategory.TOOL]: { + ["tool"]: { bgColor: "var(--ant-purple-1)", color: "var(--ant-purple-5)", icon: Download, }, - [SpanCategory.EMBEDDING]: { + ["embedding"]: { bgColor: "var(--ant-gold-1)", color: "var(--ant-gold-7)", icon: LineSegments, }, - [SpanCategory.COMPLETION]: { + ["completion"]: { bgColor: "var(--ant-cyan-1)", color: "var(--ant-cyan-6)", icon: Sparkle, }, - [SpanCategory.QUERY]: { + ["query"]: { bgColor: "var(--ant-gold-1)", color: "var(--ant-gold-7)", icon: LineSegments, }, - [SpanCategory.CHAT]: { + ["chat"]: { bgColor: "var(--ant-cyan-1)", color: "var(--ant-cyan-6)", icon: Sparkle, }, - [SpanCategory.RERANK]: { + ["rerank"]: { bgColor: "var(--ant-gold-1)", color: "var(--ant-gold-7)", icon: LineSegments, }, - [SpanCategory.LLM]: { + ["llm"]: { bgColor: "var(--ant-cyan-1)", color: "var(--ant-cyan-6)", icon: Sparkle, }, - [SpanCategory.UNDEFINED]: { + ["unknown"]: { bgColor: "var(--ag-zinc-1)", color: "var(--ant-color-text-secondary)", icon: TreeStructureIcon, diff --git a/web/oss/src/components/pages/observability/assets/exportUtils.ts b/web/oss/src/components/pages/observability/assets/exportUtils.ts index 6731c3428a..cfe7148e43 100644 --- a/web/oss/src/components/pages/observability/assets/exportUtils.ts +++ b/web/oss/src/components/pages/observability/assets/exportUtils.ts @@ -1,7 +1,8 @@ +import type {TraceSpan} from "@agenta/entities/trace" import {formatCurrency, formatLatency, formatTokenUsage} from "@agenta/shared/utils" import {formatDay} from "@/oss/lib/helpers/dateTimeHelper" -import {TraceSpan, TraceSpanNode} from "@/oss/services/tracing/types" +import type {TraceSpanNode} from "@/oss/services/tracing/types" import { getAgDataInputs, getAgDataOutputs, diff --git a/web/oss/src/components/pages/observability/components/AvatarTreeContent.tsx b/web/oss/src/components/pages/observability/components/AvatarTreeContent.tsx index 98f1adad65..4fac655ea8 100644 --- a/web/oss/src/components/pages/observability/components/AvatarTreeContent.tsx +++ b/web/oss/src/components/pages/observability/components/AvatarTreeContent.tsx @@ -1,12 +1,11 @@ +import type {SpanCategory} from "@agenta/entities/trace" import {Avatar} from "antd" -import {SpanCategory} from "@/oss/services/tracing/types" - import {spanTypeStyles} from "../assets/constants" import {AvatarTreeContentProps} from "../assets/types" export const statusMapper = (span: SpanCategory | null | undefined) => { - const {bgColor, color, icon: Icon} = spanTypeStyles[span ?? "undefined"] + const {bgColor, color, icon: Icon} = spanTypeStyles[span ?? "unknown"] ?? spanTypeStyles.unknown return { bgColor, color, diff --git a/web/oss/src/components/pages/observability/components/NodeNameCell.tsx b/web/oss/src/components/pages/observability/components/NodeNameCell.tsx index 5e36827eb1..363a4d05fc 100644 --- a/web/oss/src/components/pages/observability/components/NodeNameCell.tsx +++ b/web/oss/src/components/pages/observability/components/NodeNameCell.tsx @@ -1,18 +1,17 @@ import {memo} from "react" +import type {SpanCategory} from "@agenta/entities/trace" import {Typography} from "antd" -import {SpanCategory} from "@/oss/services/tracing/types" - import {spanTypeStyles} from "../assets/constants" interface Props { - name?: string - type?: SpanCategory + name?: string | null + type?: SpanCategory | null } const NodeNameCell = memo(({name, type}: Props) => { - const {icon: Icon} = spanTypeStyles[type ?? "undefined"] + const {icon: Icon} = spanTypeStyles[type ?? "unknown"] ?? spanTypeStyles.unknown return (
diff --git a/web/oss/src/components/pages/observability/components/StatusRenderer.tsx b/web/oss/src/components/pages/observability/components/StatusRenderer.tsx index 491e217373..f1722bc407 100644 --- a/web/oss/src/components/pages/observability/components/StatusRenderer.tsx +++ b/web/oss/src/components/pages/observability/components/StatusRenderer.tsx @@ -1,11 +1,10 @@ +import type {StatusCode} from "@agenta/entities/trace" import {CheckCircleOutlined, CloseCircleOutlined, InfoCircleOutlined} from "@ant-design/icons" import {Space, Tag, TagProps, Tooltip} from "antd" -import {StatusCode} from "@/oss/services/tracing/types" - export const statusMapper = (status: StatusCode) => { switch (status) { - case StatusCode.STATUS_CODE_ERROR: + case "STATUS_CODE_ERROR": return { label: "failure", color: "error", @@ -26,13 +25,13 @@ const StatusRenderer = ({ showMore = false, tagProps, }: { - status?: StatusCode - message?: string + status?: StatusCode | null + message?: string | null showMore?: boolean tagProps?: TagProps }) => { - const {label, color, icon} = statusMapper(status || StatusCode.STATUS_CODE_UNSET) - const errorMsg = status === StatusCode.STATUS_CODE_ERROR ? message : null + const {label, color, icon} = statusMapper(status || "STATUS_CODE_UNSET") + const errorMsg = status === "STATUS_CODE_ERROR" ? message : null const {bordered, variant, ...restTagProps} = tagProps || {} const resolvedVariant = variant ?? (bordered === false ? "filled" : undefined) diff --git a/web/oss/src/components/pages/observability/components/TimestampCell.tsx b/web/oss/src/components/pages/observability/components/TimestampCell.tsx index 0e05cd1abc..761c7a18a6 100644 --- a/web/oss/src/components/pages/observability/components/TimestampCell.tsx +++ b/web/oss/src/components/pages/observability/components/TimestampCell.tsx @@ -5,7 +5,7 @@ import {useAtomValue} from "jotai" import {formattedTimestampAtomFamily} from "@/oss/state/newObservability" interface Props { - timestamp?: string | number + timestamp?: string | number | null } const TimestampCell = memo(({timestamp}: Props) => { diff --git a/web/oss/src/services/tracing/types/index.ts b/web/oss/src/services/tracing/types/index.ts index f94a14b5e6..9d82f361d9 100644 --- a/web/oss/src/services/tracing/types/index.ts +++ b/web/oss/src/services/tracing/types/index.ts @@ -1,125 +1,14 @@ -// --- ENUMS ------------------------------------------------------------------- +// Span types have a single source of truth: the zod schemas in @agenta/entities, +// which validate the backend payload at the boundary. Import them from +// @agenta/entities/trace directly; this module owns only the OSS-only additions. -export enum TraceType { - INVOCATION = "invocation", - ANNOTATION = "annotation", - UNDEFINED = "undefined", -} - -export enum SpanCategory { - AGENT = "agent", - CHAIN = "chain", - WORKFLOW = "workflow", - TASK = "task", - TOOL = "tool", - EMBEDDING = "embedding", - QUERY = "query", - LLM = "llm", - COMPLETION = "completion", - CHAT = "chat", - RERANK = "rerank", - UNDEFINED = "undefined", -} - -export enum SpanKind { - SPAN_KIND_UNSPECIFIED = "SPAN_KIND_UNSPECIFIED", - SPAN_KIND_INTERNAL = "SPAN_KIND_INTERNAL", - SPAN_KIND_SERVER = "SPAN_KIND_SERVER", - SPAN_KIND_CLIENT = "SPAN_KIND_CLIENT", - SPAN_KIND_PRODUCER = "SPAN_KIND_PRODUCER", - SPAN_KIND_CONSUMER = "SPAN_KIND_CONSUMER", -} - -export enum StatusCode { - STATUS_CODE_UNSET = "STATUS_CODE_UNSET", - STATUS_CODE_OK = "STATUS_CODE_OK", - STATUS_CODE_ERROR = "STATUS_CODE_ERROR", -} - -// --- SUB-ENTITIES ------------------------------------------------------------ +import type {TraceSpanNode as EntityTraceSpanNode} from "@agenta/entities/trace" -export type SpanAttributes = Record - -export interface SpanEvent { - name: string - timestamp: string | number - attributes?: SpanAttributes -} - -export interface SpanLink { - trace_id: string - span_id: string - attributes?: SpanAttributes -} - -export interface SpanHash { - id: string - attributes?: SpanAttributes -} - -export interface SpanReference { - id?: string - type?: string - attributes?: SpanAttributes -} +import type {AnnotationDto} from "@/oss/lib/hooks/useAnnotations/types" -// --- MAIN SPAN ENTITY -------------------------------------------------------- - -export interface TraceSpan { - trace_id: string - span_id: string - parent_id?: string - - span_type?: SpanCategory - trace_type?: TraceType - - span_kind?: SpanKind - span_name?: string - - start_time?: string | number - end_time?: string | number - - status_code?: StatusCode - status_message?: string - - attributes?: SpanAttributes - references?: SpanReference[] - links?: SpanLink[] - hashes?: SpanHash[] - events?: SpanEvent[] - - created_at?: string - updated_at?: string - deleted_at?: string - - created_by_id?: string - updated_by_id?: string - deleted_by_id?: string -} - -export interface TraceSpanNode extends TraceSpan { - key?: string - invocationIds?: { - trace_id: string - span_id: string - } - children?: TraceSpan[] +export interface TraceSpanNode extends EntityTraceSpanNode { /** Attached by the trace/session drawer stores when annotation data is loaded */ - annotations?: import("@/oss/lib/hooks/useAnnotations/types").AnnotationDto[] -} - -// --- RESPONSE WRAPPER -------------------------------------------------------- - -export interface TracesResponse { - version?: string - count: number - traces: Record}> -} - -export interface SpansResponse { - version?: string - count: number - spans: TraceSpan[] + annotations?: AnnotationDto[] } // AGE-3788: `TracingDashboardData` (the old success/error bucket split returned diff --git a/web/oss/src/state/newObservability/atoms/queries.ts b/web/oss/src/state/newObservability/atoms/queries.ts index 45d2bb3b9a..e616098249 100644 --- a/web/oss/src/state/newObservability/atoms/queries.ts +++ b/web/oss/src/state/newObservability/atoms/queries.ts @@ -246,7 +246,7 @@ export const traceAnnotationInfoAtomFamily = atomFamily((key: string) => ) // Formatting helpers ---------------------------------------------------------- -export const formattedTimestampAtomFamily = atomFamily((ts?: string | number) => +export const formattedTimestampAtomFamily = atomFamily((ts?: string | number | null) => atom(() => formatDay({date: ts, outputFormat: "HH:mm:ss DD MMM YYYY"})), ) diff --git a/web/oss/src/state/newObservability/atoms/queryHelpers.ts b/web/oss/src/state/newObservability/atoms/queryHelpers.ts index 7787e4164a..2946cd5dae 100644 --- a/web/oss/src/state/newObservability/atoms/queryHelpers.ts +++ b/web/oss/src/state/newObservability/atoms/queryHelpers.ts @@ -364,16 +364,10 @@ export const executeTraceQuery = async ({ // transform to tree const transformed: TraceSpanNode[] = [] - // entities-package TraceSpanNode is the same backend span shape as the OSS type; - // align the annotation at the boundary, no data is converted. if (isTracesResponse(data)) { - transformed.push( - ...(transformTracingResponse( - transformTracesResponseToTree(data), - ) as unknown as TraceSpanNode[]), - ) + transformed.push(...transformTracingResponse(transformTracesResponseToTree(data))) } else if (isSpansResponse(data)) { - transformed.push(...(transformTracingResponse(data.spans) as unknown as TraceSpanNode[])) + transformed.push(...transformTracingResponse(data.spans)) } // cursor diff --git a/web/packages/agenta-entities/src/trace/etl/exportMatchingTraces.ts b/web/packages/agenta-entities/src/trace/etl/exportMatchingTraces.ts index cbabc0c5d7..fb128280b1 100644 --- a/web/packages/agenta-entities/src/trace/etl/exportMatchingTraces.ts +++ b/web/packages/agenta-entities/src/trace/etl/exportMatchingTraces.ts @@ -33,11 +33,11 @@ import { * and `children` here. */ export interface ScannedExportRow { - trace_id?: string - span_id?: string - parent_id?: string - start_time?: string | number - children?: readonly ScannedExportRow[] + trace_id?: string | null + span_id?: string | null + parent_id?: string | null + start_time?: string | number | null + children?: readonly ScannedExportRow[] | null } /** One page of root traces matching the filter. */