Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
67b2280
Generated with Hive: Add performance trace models, ingest endpoint, s…
gonzaloaune Jul 2, 2026
253fbd9
Merge remote-tracking branch 'origin/master' into feature/CMR3M79O1-a…
gonzaloaune Jul 2, 2026
7454fae
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 2, 2026
6c48b35
Generated with Hive: Update PUSHER_EVENTS unit test for performance g…
gonzaloaune Jul 2, 2026
387e3cf
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 2, 2026
a4a27bd
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 2, 2026
1e7fd3e
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 2, 2026
3dbf22c
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 2, 2026
62c1eb4
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 2, 2026
359c519
Generated with Hive: Remove resolveRepoKey DB behavior tests and vali…
gonzaloaune Jul 2, 2026
20efdf5
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 2, 2026
eba78f1
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 2, 2026
609e0b8
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 2, 2026
ed79137
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 2, 2026
17cb707
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 3, 2026
4713cd9
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 3, 2026
b084e68
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 3, 2026
9962ddc
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 3, 2026
99a91d5
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 3, 2026
fba8f6a
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 3, 2026
862c505
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 3, 2026
d6c63e6
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 3, 2026
6702617
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 3, 2026
bb1d770
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 3, 2026
0416fba
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 3, 2026
b430817
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 3, 2026
a22a4c4
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 4, 2026
06684e6
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 4, 2026
0bf5e0a
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 4, 2026
bf2f6c1
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 4, 2026
e8c3462
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 4, 2026
715b229
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 4, 2026
72bf4cd
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 4, 2026
4a141b9
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 4, 2026
a5a1f15
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 4, 2026
655fe05
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 4, 2026
7c994c4
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 4, 2026
6592b73
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 5, 2026
0829bd3
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 5, 2026
cf33815
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 5, 2026
99fc14e
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 5, 2026
468c5f7
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 5, 2026
3aea1f8
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 5, 2026
fcd6eb9
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 5, 2026
46c6690
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 5, 2026
ef5a2c0
Merge branch 'master' into feature/CMR3M79O1-add-performance-trace-in…
tomsmith8 Jul 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
-- CreateTable
CREATE TABLE "performance_trace_groups" (
"id" TEXT NOT NULL,
"workspace_id" TEXT NOT NULL,
"repository_id" TEXT,
"repo_key" TEXT NOT NULL,
"transaction_name" TEXT NOT NULL,
"signature" TEXT NOT NULL,
"sample_count" INTEGER NOT NULL DEFAULT 1,
"p50_ms" DOUBLE PRECISION NOT NULL,
"p95_ms" DOUBLE PRECISION NOT NULL,
"p99_ms" DOUBLE PRECISION NOT NULL,
"throughput" DOUBLE PRECISION NOT NULL,
"db_time_ms" DOUBLE PRECISION NOT NULL,
"sketch_state" JSONB NOT NULL,
"first_seen_at" TIMESTAMP(3) NOT NULL,
"last_seen_at" TIMESTAMP(3) NOT NULL,

CONSTRAINT "performance_trace_groups_pkey" PRIMARY KEY ("id")
);

-- CreateTable
CREATE TABLE "performance_trace_events" (
"id" TEXT NOT NULL,
"group_id" TEXT NOT NULL,
"workspace_id" TEXT NOT NULL,
"repository_id" TEXT,
"repo_key" TEXT NOT NULL,
"blob_url" TEXT NOT NULL,
"transaction_name" TEXT NOT NULL,
"total_duration_ms" DOUBLE PRECISION NOT NULL,
"spans" JSONB NOT NULL,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,

CONSTRAINT "performance_trace_events_pkey" PRIMARY KEY ("id")
);

-- CreateIndex
CREATE INDEX "performance_trace_groups_workspace_id_idx" ON "performance_trace_groups"("workspace_id");

-- CreateIndex
CREATE INDEX "performance_trace_groups_repository_id_idx" ON "performance_trace_groups"("repository_id");

-- CreateIndex
CREATE INDEX "performance_trace_groups_last_seen_at_idx" ON "performance_trace_groups"("last_seen_at");

-- CreateIndex
CREATE UNIQUE INDEX "performance_trace_groups_workspace_id_repo_key_signature_key" ON "performance_trace_groups"("workspace_id", "repo_key", "signature");

-- CreateIndex
CREATE INDEX "performance_trace_events_group_id_idx" ON "performance_trace_events"("group_id");

-- CreateIndex
CREATE INDEX "performance_trace_events_workspace_id_idx" ON "performance_trace_events"("workspace_id");

-- CreateIndex
CREATE INDEX "performance_trace_events_repository_id_idx" ON "performance_trace_events"("repository_id");

-- CreateIndex
CREATE INDEX "performance_trace_events_created_at_idx" ON "performance_trace_events"("created_at");

-- AddForeignKey
ALTER TABLE "performance_trace_groups" ADD CONSTRAINT "performance_trace_groups_workspace_id_fkey" FOREIGN KEY ("workspace_id") REFERENCES "workspaces"("id") ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "performance_trace_groups" ADD CONSTRAINT "performance_trace_groups_repository_id_fkey" FOREIGN KEY ("repository_id") REFERENCES "repositories"("id") ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "performance_trace_events" ADD CONSTRAINT "performance_trace_events_group_id_fkey" FOREIGN KEY ("group_id") REFERENCES "performance_trace_groups"("id") ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "performance_trace_events" ADD CONSTRAINT "performance_trace_events_workspace_id_fkey" FOREIGN KEY ("workspace_id") REFERENCES "workspaces"("id") ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "performance_trace_events" ADD CONSTRAINT "performance_trace_events_repository_id_fkey" FOREIGN KEY ("repository_id") REFERENCES "repositories"("id") ON DELETE SET NULL ON UPDATE CASCADE;
63 changes: 60 additions & 3 deletions prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,8 @@ model Workspace {
agentLogs AgentLog[]
errorIssues ErrorIssue[]
errorEvents ErrorEvent[]
performanceTraceGroups PerformanceTraceGroup[]
performanceTraceEvents PerformanceTraceEvent[]
diagrams DiagramWorkspace[]
discordChannels DiscordChannel[]
features Feature[]
Expand Down Expand Up @@ -515,9 +517,11 @@ model Repository {
deployments Deployment[]
recommendations JanitorRecommendation[]
janitorRuns JanitorRun[]
errorIssues ErrorIssue[]
errorEvents ErrorEvent[]
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
errorIssues ErrorIssue[]
errorEvents ErrorEvent[]
performanceTraceGroups PerformanceTraceGroup[]
performanceTraceEvents PerformanceTraceEvent[]
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
tasks Task[]

@@unique([repositoryUrl, workspaceId], name: "repositoryUrl_workspaceId")
Expand Down Expand Up @@ -2198,6 +2202,59 @@ model ErrorEvent {
@@map("error_events")
}

/// Deduplicated performance trace group — one row per unique (workspace, repoKey, signature).
/// repoKey is non-null: resolved repositoryId when matched, normalised raw identifier, or "unknown".
/// sketchState stores the serialized latency sketch for streaming p50/p95/p99 updates.
model PerformanceTraceGroup {
id String @id @default(cuid())
workspaceId String @map("workspace_id")
repositoryId String? @map("repository_id")
repoKey String @map("repo_key")
transactionName String @map("transaction_name")
signature String
sampleCount Int @default(1) @map("sample_count")
p50Ms Float @map("p50_ms")
p95Ms Float @map("p95_ms")
p99Ms Float @map("p99_ms")
throughput Float
dbTimeMs Float @map("db_time_ms")
sketchState Json @map("sketch_state")
firstSeenAt DateTime @map("first_seen_at")
lastSeenAt DateTime @map("last_seen_at")
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
repository Repository? @relation(fields: [repositoryId], references: [id], onDelete: SetNull)
events PerformanceTraceEvent[]

@@unique([workspaceId, repoKey, signature])
@@index([workspaceId])
@@index([repositoryId])
@@index([lastSeenAt])
@@map("performance_trace_groups")
}

/// Individual performance trace sample linked to its deduplicated group.
model PerformanceTraceEvent {
id String @id @default(cuid())
groupId String @map("group_id")
workspaceId String @map("workspace_id")
repositoryId String? @map("repository_id")
repoKey String @map("repo_key")
blobUrl String @map("blob_url")
transactionName String @map("transaction_name")
totalDurationMs Float @map("total_duration_ms")
spans Json
createdAt DateTime @default(now()) @map("created_at")
group PerformanceTraceGroup @relation(fields: [groupId], references: [id], onDelete: Cascade)
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
repository Repository? @relation(fields: [repositoryId], references: [id], onDelete: SetNull)

@@index([groupId])
@@index([workspaceId])
@@index([repositoryId])
@@index([createdAt])
@@map("performance_trace_events")
}

/// Cross-realm typed edge between two URN-addressed nodes.
/// Persists relationships between Postgres entities, Canvas authored nodes,
/// and KG concepts that cannot be expressed via FK columns alone.
Expand Down
2 changes: 2 additions & 0 deletions scripts/helpers/seed-database.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { config as dotenvConfig } from "dotenv";
import { seedDeploymentTracking } from "./seed-deployment-tracking";
import { seedAgentLogs } from "./seed-agent-logs";
import { seedErrorEvents } from "./seed-error-events";
import { seedPerformanceTraces } from "./seed-performance-traces";

dotenvConfig({ path: ".env.local" });

Expand Down Expand Up @@ -1903,6 +1904,7 @@ async function main() {
await seedDeploymentTracking();
await seedAgentLogs();
await seedErrorEvents();
await seedPerformanceTraces();
await seedDashboardConversations(users);
await seedPlatformConfig();
await seedInitiativesAndMilestones(users);
Expand Down
Loading
Loading