import { RightAlignedCell } from "@/src/features/dashboard/components/RightAlignedCell"; import { DashboardCard } from "@/src/features/dashboard/components/cards/DashboardCard"; import { DashboardTable } from "@/src/features/dashboard/components/cards/DashboardTable"; import { type FilterState, getGenerationLikeTypes } from "@langfuse/shared"; import { api } from "@/src/utils/api"; import { formatIntervalSeconds } from "@/src/utils/dates"; import { truncate } from "@/src/utils/string"; import { Popup } from "@/src/components/layouts/doc-popup"; import { type QueryType, mapLegacyUiTableFilterToView, } from "@/src/features/query"; export const LatencyTables = ({ projectId, globalFilterState, fromTimestamp, toTimestamp, isLoading = false, }: { projectId: string; globalFilterState: FilterState; fromTimestamp: Date; toTimestamp: Date; isLoading?: boolean; }) => { const generationsLatenciesQuery: QueryType = { view: "observations", dimensions: [{ field: "name" }], metrics: [ { measure: "latency", aggregation: "p50" }, { measure: "latency", aggregation: "p90" }, { measure: "latency", aggregation: "p95" }, { measure: "latency", aggregation: "p99" }, ], filters: [ ...mapLegacyUiTableFilterToView("observations", globalFilterState), { column: "type", operator: "any of", value: getGenerationLikeTypes(), type: "stringOptions", }, ], timeDimension: null, fromTimestamp: fromTimestamp.toISOString(), toTimestamp: toTimestamp.toISOString(), orderBy: [{ field: "p95_latency", direction: "desc" }], }; const generationsLatencies = api.dashboard.executeQuery.useQuery( { projectId, query: generationsLatenciesQuery, }, { trpc: { context: { skipBatch: true, }, }, enabled: !isLoading, }, ); const spansLatenciesQuery: QueryType = { view: "observations", dimensions: [{ field: "name" }], metrics: [ { measure: "latency", aggregation: "p50" }, { measure: "latency", aggregation: "p90" }, { measure: "latency", aggregation: "p95" }, { measure: "latency", aggregation: "p99" }, ], filters: [ ...mapLegacyUiTableFilterToView("observations", globalFilterState), { column: "type", operator: "=", value: "SPAN", type: "string", }, ], timeDimension: null, fromTimestamp: fromTimestamp.toISOString(), toTimestamp: toTimestamp.toISOString(), orderBy: [{ field: "p95_latency", direction: "desc" }], }; const spansLatencies = api.dashboard.executeQuery.useQuery( { projectId, query: spansLatenciesQuery, }, { trpc: { context: { skipBatch: true, }, }, enabled: !isLoading, }, ); const tracesLatenciesQuery: QueryType = { view: "traces", dimensions: [{ field: "name" }], metrics: [ { measure: "latency", aggregation: "p50" }, { measure: "latency", aggregation: "p90" }, { measure: "latency", aggregation: "p95" }, { measure: "latency", aggregation: "p99" }, ], filters: mapLegacyUiTableFilterToView("traces", globalFilterState), timeDimension: null, fromTimestamp: fromTimestamp.toISOString(), toTimestamp: toTimestamp.toISOString(), orderBy: [{ field: "p95_latency", direction: "desc" }], }; const tracesLatencies = api.dashboard.executeQuery.useQuery( { projectId, query: tracesLatenciesQuery, }, { trpc: { context: { skipBatch: true, }, }, enabled: !isLoading, }, ); const generateLatencyData = (data?: Record[]) => { return data ? data .filter((item) => item.name !== null) .map((item, i) => [
, {item.p50_latency ? formatIntervalSeconds(Number(item.p50_latency) / 1000, 3) : "-"} , {item.p90_latency ? formatIntervalSeconds(Number(item.p90_latency) / 1000, 3) : "-"} , {item.p95_latency ? formatIntervalSeconds(Number(item.p95_latency) / 1000, 3) : "-"} , {item.p99_latency ? formatIntervalSeconds(Number(item.p99_latency) / 1000, 3) : "-"} , ]) : []; }; return ( <> p50, p90, p95 , p99, ]} rows={generateLatencyData(tracesLatencies.data)} isLoading={isLoading || tracesLatencies.isPending} collapse={{ collapsed: 5, expanded: 20 }} /> p50, p90, p95 , p99, ]} rows={generateLatencyData(generationsLatencies.data)} isLoading={isLoading || generationsLatencies.isPending} collapse={{ collapsed: 5, expanded: 20 }} /> p50, p90, p95 , p99, ]} rows={generateLatencyData(spansLatencies.data)} isLoading={isLoading || spansLatencies.isPending} collapse={{ collapsed: 5, expanded: 20 }} /> ); };