{"record":{"id":"03aeae98aff46289","repo":"rohitg00/ai-engineering-from-scratch","slug":"generatesyntheticspans-cfg-models-must-not-be-emp","errorCode":null,"errorMessage":"generateSyntheticSpans: cfg.models must not be empty","messagePattern":"generateSyntheticSpans: cfg\\.models must not be empty","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"phases/19-capstone-projects/11-llm-observability-dashboard/code/ts/src/index.ts","lineNumber":29,"sourceCode":" * Schema: OpenTelemetry GenAI semantic conventions\n *   https://opentelemetry.io/docs/specs/semconv/gen-ai/\n */\n\nimport { serve } from \"@hono/node-server\";\nimport { rollUpByModel } from \"./rollup.js\";\nimport { buildApp } from \"./server.js\";\nimport { ObservabilityStore } from \"./spans.js\";\nimport type { GenAISpan, ModelRollup } from \"./types.js\";\n\ntype SyntheticConfig = {\n  spans: number;\n  errorRate: number;\n  models: string[];\n};\n\nexport function generateSyntheticSpans(cfg: SyntheticConfig): GenAISpan[] {\n  if (cfg.models.length === 0) {\n    throw new Error(\"generateSyntheticSpans: cfg.models must not be empty\");\n  }\n  const now = Date.now() * 1e6;\n  const out: GenAISpan[] = [];\n  for (let i = 0; i < cfg.spans; i++) {\n    const model = cfg.models[i % cfg.models.length]!;\n    if (!model) continue;\n    const baseLatencyMs = 400 + ((i * 31) % 1800);\n    const inputTokens = 200 + ((i * 17) % 4000);\n    const outputTokens = 120 + ((i * 23) % 800);\n    const isError =\n      i % Math.max(1, Math.round(1 / cfg.errorRate)) === 0 && i > 0;\n    out.push({\n      trace_id: `trace-${i.toString(16).padStart(8, \"0\")}`,\n      span_id: `span-${i.toString(16).padStart(8, \"0\")}`,\n      name: \"chat.completion\",\n      start_time_unix_nano: now + i * 1_000_000,\n      end_time_unix_nano: now + i * 1_000_000 + baseLatencyMs * 1e6,\n      status: isError ? \"ERROR\" : \"OK\",","sourceCodeStart":11,"sourceCodeEnd":47,"githubUrl":"https://github.com/rohitg00/ai-engineering-from-scratch/blob/39ea8a1c6d0b61f071226eff7ede4d4105fed820/phases/19-capstone-projects/11-llm-observability-dashboard/code/ts/src/index.ts#L11-L47","documentation":"Error \"generateSyntheticSpans: cfg.models must not be empty\" thrown in rohitg00/ai-engineering-from-scratch.","triggerScenarios":"Thrown at phases/19-capstone-projects/11-llm-observability-dashboard/code/ts/src/index.ts:29 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"39ea8a1c6d0b61f071226eff7ede4d4105fed820","analyzedAt":"2026-08-26T03:13:46.626Z","schemaVersion":2},"datasetVersion":"2026-08-26T07:17:17.940Z"}