diff --git a/agent/__init__.py b/agent/__init__.py new file mode 100644 index 0000000..2f55459 --- /dev/null +++ b/agent/__init__.py @@ -0,0 +1 @@ +"""Agent skills package — documentation and guidelines for AI agent integration (spec §11).""" diff --git a/agent/skills.md b/agent/skills.md new file mode 100644 index 0000000..801aa78 --- /dev/null +++ b/agent/skills.md @@ -0,0 +1,103 @@ +# Vitals Agent Skills Guide + +This document defines how AI coding agents and automated remediation workflows consume, interpret, and act upon Vitals Verdicts. + +--- + +## 1. Overview of Vitals Verdicts + +Vitals is an AI signal sidecar that continuously monitors GenAI span telemetry (`gen_ai.system`, `gen_ai.request.model`, `service.name`, `service.version`) to deliver deterministic **Verdicts** on AI application health. + +Verdicts unify quality drift (ResponseDriftMetric / PSI), spend rate (USD/min velocity), release attribution, and guard checks into a single actionable record. + +### Verdict Data Model (`Verdict`) + +| Field | Type | Description | +|---|---|---| +| `verdict_id` | `str` | Canonical hex string identifying the verdict record | +| `state` | `VerdictState` | `WARMING` (0), `STEADY` (1), `CHANGED` (2), `INCONCLUSIVE` (3) | +| `subject` | `Subject` | `RELEASE` (version vs version) or `TIME` (current vs lookback) | +| `cause` | `Cause` | `RELEASE` (deploy within 300s of onset) or `UNATTRIBUTED` | +| `behavior_sigma` | `float \| None` | Signed delta in sigma units relative to baseline behavior variance | +| `cost_sigma` | `float \| None` | Signed delta in sigma units relative to baseline cost variance | +| `velocity_ratio` | `float \| None` | Ratio of current USD/min velocity to baseline expected USD/min | +| `runaway` | `bool` | True if cost velocity ratio exceeds 5.0x (overrides hysteresis) | +| `sentence` | `str` | Human-readable canonical verdict sentence | +| `falsifier` | `str` | Explicit metric condition required to transition back to `STEADY` | +| `exemplars` | `tuple[Exemplar]` | Evidence exemplars containing worst and median outputs | + +--- + +## 2. Interpreting Verdict States + +### `WARMING` (State 0) +- **Meaning**: Insufficient sample count (collecting reference baseline window). +- **Agent Action**: No action required. Wait for baseline to finish warming. + +### `STEADY` (State 1) +- **Meaning**: Monitored signals remain within normal baseline variance (±3σ). +- **Agent Action**: System is healthy. Proceed with planned deployment or monitoring. + +### `CHANGED` (State 2) +- **Meaning**: Sustained regression detected in behavior drift (≥3.0σ) or runaway cost spend-rate (≥5.0x). +- **Agent Action**: High priority remediation required. See Section 4. + +### `INCONCLUSIVE` (State 3) +- **Meaning**: Detection guard suspended evaluation: + - `low_sample`: Insufficient samples in current window (`n < min_samples`). + - `input_shift`: Both input prompt drift and behavior drift shift concurrently (≥3.0σ). +- **Agent Action**: Do **not** trigger a code rollback for `input_shift`. The change is driven by external user query shifts, not model regression. + +--- + +## 3. Parsing Telemetry & Log Records + +Vitals emits OTLP log records for each verdict. Trace correlation is natively linked via the worst exemplar's `trace_id` and `span_id`. + +### Log Attributes + +```json +{ + "service.name": "ragapp", + "service.version": "v2", + "gen_ai.system": "openai", + "gen_ai.request.model": "gpt-4o", + "vitals.verdict_id": "c0123456789abcde", + "vitals.state": "changed", + "vitals.subject": "release", + "vitals.cause": "release", + "vitals.behavior_sigma": 4.2, + "vitals.cost_sigma": 0.3, + "vitals.velocity_ratio": 1.0, + "vitals.runaway": false, + "vitals.falsifier": "would flip to STEADY if behavior drift < 3.0σ (now 4.2σ)", + "vitals.exemplars": "[{\"kind\":\"worst\",\"trace_id\":\"...\",\"excerpt\":\"...\"}]" +} +``` + +--- + +## 4. Remediation Decision Tree + +When a `CHANGED` verdict is emitted, agents must follow this decision procedure: + +```mermaid +flowchart TD + A[Verdict CHANGED Emitted] --> B{Cause == RELEASE?} + B -- Yes --> C[Rollback Version to Baseline] + B -- No --> D{Runaway == True?} + D -- Yes --> E[Throttle Agent Loop / Rate Limit Endpoint] + D -- No --> F[Inspect Output Exemplars & Prompt Templates] +``` + +### Action 1: Cause == `RELEASE` +- **Root Cause**: Regression caused by newly deployed release version (e.g. `v2`). +- **Remediation**: Execute immediate version rollback to `baseline_version` (e.g. `v1`). + +### Action 2: `runaway == True` +- **Root Cause**: Runaway loop rapidly burning tokens (velocity ratio ≥ 5.0x). +- **Remediation**: Terminate or rate-limit the agent thread loop; enforce max recursion limits. + +### Action 3: `INCONCLUSIVE(input_shift)` +- **Root Cause**: User traffic topic shifted (e.g., queries changed from Observability to Database internals). +- **Remediation**: Do not rollback code. If desired, register a separate scope key or update baseline reference. diff --git a/assets/alerts/cost-velocity.json b/assets/alerts/cost-velocity.json deleted file mode 100644 index de8d046..0000000 --- a/assets/alerts/cost-velocity.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "alert": "Vitals: cost velocity breach", - "alertType": "METRIC_BASED_ALERT", - "description": "Cost spend-rate exceeded $5/min for a service/model. Likely a runaway agent loop. Alerts are not enforcement \u2014 investigate the loop.", - "ruleType": "threshold_rule", - "evalWindow": "5m0s", - "frequency": "1m0s", - "condition": { - "compositeQuery": { - "queryType": "builder", - "panelType": "graph", - "builder": { - "queryData": [ - { - "dataSource": "metrics", - "queryName": "A", - "expression": "A", - "disabled": false, - "aggregateOperator": "avg", - "aggregateAttribute": { - "key": "vitals.cost.velocity", - "dataType": "float64", - "type": "Gauge", - "isColumn": true - }, - "timeAggregation": "avg", - "spaceAggregation": "avg", - "filters": { - "op": "AND", - "items": [] - }, - "groupBy": [ - { - "key": "service.name", - "dataType": "string", - "type": "tag" - }, - { - "key": "gen_ai.request.model", - "dataType": "string", - "type": "tag" - } - ], - "legend": "", - "reduceTo": "last", - "having": [], - "stepInterval": 60 - } - ], - "queryFormulas": [] - } - }, - "op": ">", - "target": 5, - "matchType": "1", - "targetUnit": "" - }, - "labels": { - "severity": "critical", - "source": "vitals" - }, - "annotations": { - "description": "Cost spend-rate exceeded $5/min for a service/model. Likely a runaway agent loop. Alerts are not enforcement \u2014 investigate the loop.", - "summary": "Vitals: cost velocity breach" - } -} \ No newline at end of file diff --git a/assets/alerts/quality-drift-onset.json b/assets/alerts/verdict-changed.json similarity index 60% rename from assets/alerts/quality-drift-onset.json rename to assets/alerts/verdict-changed.json index b92fe5f..84cc1e7 100644 --- a/assets/alerts/quality-drift-onset.json +++ b/assets/alerts/verdict-changed.json @@ -1,9 +1,9 @@ { - "alert": "Vitals: quality drift onset", + "alert": "Vitals: verdict changed", "alertType": "METRIC_BASED_ALERT", - "description": "CUSUM flagged the onset of sustained quality drift from the healthy baseline. Deviation-from-good, not absolute correctness (see docs/honesty.md).", + "description": "{{service.name}} {{service.version}} — VERDICT CHANGED\nbehavior {{vitals.behavior_sigma}}σ · cost {{vitals.cost_sigma}}σ\ncause: {{vitals.cause}} · subject: {{vitals.subject}} · n={{vitals.samples}}\nrunaway: {{vitals.runaway}}\nFull record: vitals verdict log, trace-linked.", "ruleType": "threshold_rule", - "evalWindow": "5m0s", + "evalWindow": "1m0s", "frequency": "1m0s", "condition": { "compositeQuery": { @@ -18,13 +18,13 @@ "disabled": false, "aggregateOperator": "max", "aggregateAttribute": { - "key": "gen_ai.evaluation.drift_onset", + "key": "vitals.verdict.state", "dataType": "float64", "type": "Gauge", "isColumn": true }, "timeAggregation": "max", - "spaceAggregation": "avg", + "spaceAggregation": "max", "filters": { "op": "AND", "items": [] @@ -51,16 +51,16 @@ } }, "op": ">=", - "target": 1, + "target": 2, "matchType": "1", "targetUnit": "" }, "labels": { - "severity": "critical", + "severity": "warning", "source": "vitals" }, "annotations": { - "description": "CUSUM flagged the onset of sustained quality drift from the healthy baseline. Deviation-from-good, not absolute correctness (see docs/honesty.md).", - "summary": "Vitals: quality drift onset" + "description": "{{service.name}} {{service.version}} — VERDICT CHANGED\nbehavior {{vitals.behavior_sigma}}σ · cost {{vitals.cost_sigma}}σ\ncause: {{vitals.cause}} · subject: {{vitals.subject}} · n={{vitals.samples}}\nrunaway: {{vitals.runaway}}\nFull record: vitals verdict log, trace-linked.", + "summary": "{{service.name}} {{service.version}} — VERDICT CHANGED" } -} \ No newline at end of file +} diff --git a/assets/alerts/version-regression.json b/assets/alerts/version-regression.json deleted file mode 100644 index 2947a01..0000000 --- a/assets/alerts/version-regression.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "alert": "Vitals: per-version quality regression", - "alertType": "METRIC_BASED_ALERT", - "description": "Composite quality score fell below 0.6 for a service.version. Compare v1/v2 on the Release Compare dashboard.", - "ruleType": "threshold_rule", - "evalWindow": "10m0s", - "frequency": "1m0s", - "condition": { - "compositeQuery": { - "queryType": "builder", - "panelType": "graph", - "builder": { - "queryData": [ - { - "dataSource": "metrics", - "queryName": "A", - "expression": "A", - "disabled": false, - "aggregateOperator": "avg", - "aggregateAttribute": { - "key": "gen_ai.evaluation.score", - "dataType": "float64", - "type": "Gauge", - "isColumn": true - }, - "timeAggregation": "avg", - "spaceAggregation": "avg", - "filters": { - "op": "AND", - "items": [] - }, - "groupBy": [ - { - "key": "service.name", - "dataType": "string", - "type": "tag" - }, - { - "key": "service.version", - "dataType": "string", - "type": "tag" - } - ], - "legend": "", - "reduceTo": "last", - "having": [], - "stepInterval": 60 - } - ], - "queryFormulas": [] - } - }, - "op": "<", - "target": 0.6, - "matchType": "1", - "targetUnit": "" - }, - "labels": { - "severity": "warning", - "source": "vitals" - }, - "annotations": { - "description": "Composite quality score fell below 0.6 for a service.version. Compare v1/v2 on the Release Compare dashboard.", - "summary": "Vitals: per-version quality regression" - } -} \ No newline at end of file diff --git a/assets/dashboards/release-compare.json b/assets/dashboards/release-compare.json index 79e220d..c99ba66 100644 --- a/assets/dashboards/release-compare.json +++ b/assets/dashboards/release-compare.json @@ -1,12 +1,12 @@ { - "title": "Vitals \u2014 Release Compare", - "description": "Quality and cost split by service.version. Catch the release that regressed.", + "title": "Vitals — Release Compare", + "description": "Verdict state and normalized sigmas split by service.version.", "tags": [ "vitals", "release", - "genai" + "verdict" ], - "version": "v4", + "version": "v5", "layout": [ { "i": "1", @@ -40,8 +40,8 @@ "widgets": [ { "id": "1", - "title": "Quality score by version", - "description": "Per-release quality. The poisoned v2 line drops here.", + "title": "Verdict state by version", + "description": "0=warming, 1=steady, 2=changed, 3=inconclusive", "panelTypes": "graph", "isStacked": false, "opacity": "1", @@ -62,15 +62,15 @@ "queryName": "A", "expression": "A", "disabled": false, - "aggregateOperator": "avg", + "aggregateOperator": "max", "aggregateAttribute": { - "key": "gen_ai.evaluation.score", + "key": "vitals.verdict.state", "dataType": "float64", "type": "Gauge", "isColumn": true }, - "timeAggregation": "avg", - "spaceAggregation": "avg", + "timeAggregation": "max", + "spaceAggregation": "max", "filters": { "op": "AND", "items": [] @@ -97,14 +97,14 @@ }, { "id": "2", - "title": "Drift by version", - "description": "Per-release drift from the shared healthy baseline.", + "title": "Behavior sigma by version", + "description": "Signed behavior delta in sigma units against baseline variance.", "panelTypes": "graph", "isStacked": false, "opacity": "1", "nullZeroValues": "zero", "timePreferance": "GLOBAL_TIME", - "yAxisUnit": "", + "yAxisUnit": "σ", "softMax": null, "softMin": null, "fillSpans": false, @@ -121,7 +121,7 @@ "disabled": false, "aggregateOperator": "avg", "aggregateAttribute": { - "key": "gen_ai.evaluation.drift", + "key": "vitals.verdict.behavior_sigma", "dataType": "float64", "type": "Gauge", "isColumn": true @@ -154,14 +154,14 @@ }, { "id": "3", - "title": "Cost velocity by version", - "description": "Spend-rate per release.", + "title": "Cost sigma by version", + "description": "Signed cost delta in sigma units against baseline variance.", "panelTypes": "graph", "isStacked": false, "opacity": "1", "nullZeroValues": "zero", "timePreferance": "GLOBAL_TIME", - "yAxisUnit": "usd/min", + "yAxisUnit": "σ", "softMax": null, "softMin": null, "fillSpans": false, @@ -178,7 +178,7 @@ "disabled": false, "aggregateOperator": "avg", "aggregateAttribute": { - "key": "vitals.cost.velocity", + "key": "vitals.verdict.cost_sigma", "dataType": "float64", "type": "Gauge", "isColumn": true @@ -211,14 +211,14 @@ }, { "id": "4", - "title": "Drift onset by version", - "description": "1 when CUSUM flags a sustained regression for a version.", + "title": "Velocity ratio by version", + "description": "Current burn rate multiple relative to baseline rate.", "panelTypes": "graph", "isStacked": false, "opacity": "1", "nullZeroValues": "zero", "timePreferance": "GLOBAL_TIME", - "yAxisUnit": "", + "yAxisUnit": "×", "softMax": null, "softMin": null, "fillSpans": false, @@ -233,14 +233,14 @@ "queryName": "A", "expression": "A", "disabled": false, - "aggregateOperator": "max", + "aggregateOperator": "avg", "aggregateAttribute": { - "key": "gen_ai.evaluation.drift_onset", + "key": "vitals.verdict.velocity_ratio", "dataType": "float64", "type": "Gauge", "isColumn": true }, - "timeAggregation": "max", + "timeAggregation": "avg", "spaceAggregation": "avg", "filters": { "op": "AND", diff --git a/demo/README.md b/demo/README.md index 25baa76..edaa4be 100644 --- a/demo/README.md +++ b/demo/README.md @@ -1,81 +1,95 @@ -# Vitals demo — run-of-show +# Vitals Demo & Replay Guide -Two beats, one pipeline. Every number is reproducible: run the scenarios yourself and -watch the Vitals dashboards in SigNoz. +Every scenario in Vitals is 100% reproducible — either live through Docker Compose or instantly via deterministic `vitals replay` fixtures without external network calls or Groq API keys. -## Prerequisites +--- -- Docker Desktop running. -- **SigNoz already up** on the host (self-hosted compose or Cloud trial), OTLP ingest on - `localhost:4317`, UI on `localhost:8080`. -- A Groq API key (free at https://console.groq.com). Optional — without it the app serves - deterministic canned answers so the pipeline still flows. +## Quickstart A — Instant Replay Scenarios (No Docker needed) + +Vitals includes a deterministic replay engine (`vitals replay `) that replays pre-recorded OTLP spans through the full scoring and verdict engine. -## Setup +### 1. Run Vitals Sidecar with Console Enabled ```bash -cp demo/.env.example demo/.env # add GROQ_API_KEY (optional) -docker compose -f demo/compose.yaml up --build -d +python -m vitals.main run --config vitals.yaml ``` -This starts three services alongside your existing SigNoz: +Open the **Vitals Console** in your browser: [http://localhost:8787](http://localhost:8787) -| service | role | -|---|---| -| `ragapp` | Groq RAG app on :8000, emits gen_ai spans to the collector | -| `collector` | OTel Collector — **fans out** spans to SigNoz **and** vitals | -| `vitals` | the sidecar: scores spans, emits cost + quality signals out-of-band to SigNoz | +### 2. Replay Scenarios in a Second Terminal -Import the dashboards and alerts (SigNoz UI → Dashboards → Import JSON): -`assets/dashboards/*.json`, `assets/alerts/*.json`. +```bash +# Scenario 1: Steady Baseline (Verdict: STEADY) +python -m vitals.main replay demo/fixtures/01_steady_baseline.jsonl --speed 10.0 -Warm the quality baseline once (healthy v1 traffic): +# Scenario 2: Release Regression (Verdict: CHANGED · Cause: RELEASE) +python -m vitals.main replay demo/fixtures/02_release_regression.jsonl --speed 10.0 -```bash -python demo/scenarios/runaway_loop.py --rate 3 --duration 60 +# Scenario 3: Runaway Cost Loop (Verdict: CHANGED · Runaway: TRUE) +python -m vitals.main replay demo/fixtures/03_runaway_loop.jsonl --speed 10.0 + +# Scenario 4: User Traffic Shift (Verdict: INCONCLUSIVE · Guard: INPUT_SHIFT) +python -m vitals.main replay demo/fixtures/04_input_shift.jsonl --speed 10.0 ``` +Watch the **Hero Verdict Card** on `http://localhost:8787` update live with state colors, sigma meter bars, falsifier statements, and evidence exemplars! + --- -## Beat 1 — the hook: cost +## Quickstart B — Live RAG Application with Docker & SigNoz + +### Prerequisites +- Docker Desktop running. +- **SigNoz** running on `localhost:4317` (OTLP gRPC) and UI on `localhost:8080`. +- (Optional) `GROQ_API_KEY` in `demo/.env`. + +### 1. Launch Services ```bash -python demo/scenarios/runaway_loop.py --rate 20 --duration 120 +cp demo/.env.example demo/.env +docker compose -f demo/compose.yaml up --build -d ``` -On **Vitals — Overview**, `vitals.cost.velocity` (USD/min) spirals upward. The -**cost velocity** alert fires at the threshold — in minutes, not on the invoice. +Services started: +| Service | Address | Role | +|---|---|---| +| `ragapp` | `:8000` | RAG service emitting `gen_ai` semantic spans | +| `collector` | `:4317` | OTel Collector fanning out to SigNoz and Vitals | +| `vitals` | `:8787` | Vitals sidecar with Console and SigNoz OTLP emitter | -> *"A 4-agent loop burned \$47,000 over 11 days with dashboards green. \$47K incidents end here."* +### 2. Import SigNoz Assets -## Beat 2 — the payoff: quality +Import in SigNoz UI (`Dashboards -> Import JSON` & `Alerts -> Import JSON`): +- Dashboard: `assets/dashboards/release-compare.json` +- Alert Rule: `assets/alerts/verdict-changed.json` -Deploy the poisoned prompt (v2). **No model change. Tokens stay normal. Infra stays green.** +### 3. Run Live Traffic Scenarios ```bash -bash demo/scenarios/deploy_v2.sh -python demo/scenarios/runaway_loop.py --rate 5 --duration 180 -``` +# Steady traffic (Topic A) +python demo/scenarios/steady_traffic.py --rate 2 --count 50 -On **Vitals — Drift**, the drift line bends and a **CUSUM onset marker** appears. On -**Vitals — Release Compare**, v1 and v2 split — v2's quality score drops while v1 holds. -The **quality drift onset** alert pages. +# Deploy poisoned prompt (v2) and observe CHANGED verdict +bash demo/scenarios/deploy_v2.sh +python demo/scenarios/steady_traffic.py --rate 2 --count 50 -> *"Anthropic shipped this exact failure in April and found out from user complaints.* -> *Cost to detect: \$0.00."* +# Runaway loop simulation +python demo/scenarios/runaway_loop.py --rate 20 --duration 60 -Close on the convention: *"and we wrote down the standard so everyone can emit this"* — -[docs/conventions.md](../docs/conventions.md). +# Input shift simulation (Topic B queries) +python demo/scenarios/traffic_shift.py --rate 2 --count 50 +``` -## Reset +### 4. Reset Environment ```bash bash demo/scenarios/reset.sh ``` -Redeploys v1 and restarts vitals so baselines re-warm. SigNoz data is left intact. +--- -## Honesty note (say it first) +## Understanding the Vitals Console (`:8787`) -Vitals measures **deviation from a healthy baseline**, not absolute correctness — the -exact signal behind every silent-regression incident. See [docs/honesty.md](../docs/honesty.md). +- **Zone 1 (Hero Verdict Card)**: Shows current state (`WARMING`, `STEADY`, `CHANGED`, `INCONCLUSIVE`), behavior/cost sigmas (`+4.2σ`), falsifier line, and **worst + median evidence exemplars**. +- **Zone 2 (Verdict Feed)**: Historical feed of up to 50 stored verdicts with expandable JSON details. +- **Zone 3 (Health Strip)**: Live counters for spans received/scored/skipped, scopes, verdicts emitted, errors, and uptime. diff --git a/demo/fixtures/01_steady_baseline.jsonl b/demo/fixtures/01_steady_baseline.jsonl new file mode 100644 index 0000000..ecbe19c --- /dev/null +++ b/demo/fixtures/01_steady_baseline.jsonl @@ -0,0 +1,45 @@ +{"rel_ts": 0.0, "trace_id": "tr_000000000000000000000000000", "span_id": "sp_0000000000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 1000000000, "end_unix_nano": 2000000000, "attributes": {}} +{"rel_ts": 12.0, "trace_id": "tr_000001000000000000000000000", "span_id": "sp_0000010000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 13000000000, "end_unix_nano": 14000000000, "attributes": {}} +{"rel_ts": 24.0, "trace_id": "tr_000002000000000000000000000", "span_id": "sp_0000020000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 25000000000, "end_unix_nano": 26000000000, "attributes": {}} +{"rel_ts": 36.0, "trace_id": "tr_000003000000000000000000000", "span_id": "sp_0000030000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 37000000000, "end_unix_nano": 38000000000, "attributes": {}} +{"rel_ts": 48.0, "trace_id": "tr_000004000000000000000000000", "span_id": "sp_0000040000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 49000000000, "end_unix_nano": 50000000000, "attributes": {}} +{"rel_ts": 60.0, "trace_id": "tr_000005000000000000000000000", "span_id": "sp_0000050000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 61000000000, "end_unix_nano": 62000000000, "attributes": {}} +{"rel_ts": 72.0, "trace_id": "tr_000006000000000000000000000", "span_id": "sp_0000060000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 73000000000, "end_unix_nano": 74000000000, "attributes": {}} +{"rel_ts": 84.0, "trace_id": "tr_000007000000000000000000000", "span_id": "sp_0000070000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 85000000000, "end_unix_nano": 86000000000, "attributes": {}} +{"rel_ts": 96.0, "trace_id": "tr_000008000000000000000000000", "span_id": "sp_0000080000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 97000000000, "end_unix_nano": 98000000000, "attributes": {}} +{"rel_ts": 108.0, "trace_id": "tr_000009000000000000000000000", "span_id": "sp_0000090000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 109000000000, "end_unix_nano": 110000000000, "attributes": {}} +{"rel_ts": 120.0, "trace_id": "tr_000010000000000000000000000", "span_id": "sp_0000100000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 121000000000, "end_unix_nano": 122000000000, "attributes": {}} +{"rel_ts": 132.0, "trace_id": "tr_000011000000000000000000000", "span_id": "sp_0000110000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 133000000000, "end_unix_nano": 134000000000, "attributes": {}} +{"rel_ts": 144.0, "trace_id": "tr_000012000000000000000000000", "span_id": "sp_0000120000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 145000000000, "end_unix_nano": 146000000000, "attributes": {}} +{"rel_ts": 156.0, "trace_id": "tr_000013000000000000000000000", "span_id": "sp_0000130000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 157000000000, "end_unix_nano": 158000000000, "attributes": {}} +{"rel_ts": 168.0, "trace_id": "tr_000014000000000000000000000", "span_id": "sp_0000140000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 169000000000, "end_unix_nano": 170000000000, "attributes": {}} +{"rel_ts": 180.0, "trace_id": "tr_000015000000000000000000000", "span_id": "sp_0000150000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 181000000000, "end_unix_nano": 182000000000, "attributes": {}} +{"rel_ts": 192.0, "trace_id": "tr_000016000000000000000000000", "span_id": "sp_0000160000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 193000000000, "end_unix_nano": 194000000000, "attributes": {}} +{"rel_ts": 204.0, "trace_id": "tr_000017000000000000000000000", "span_id": "sp_0000170000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 205000000000, "end_unix_nano": 206000000000, "attributes": {}} +{"rel_ts": 216.0, "trace_id": "tr_000018000000000000000000000", "span_id": "sp_0000180000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 217000000000, "end_unix_nano": 218000000000, "attributes": {}} +{"rel_ts": 228.0, "trace_id": "tr_000019000000000000000000000", "span_id": "sp_0000190000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 229000000000, "end_unix_nano": 230000000000, "attributes": {}} +{"rel_ts": 240.0, "trace_id": "tr_000020000000000000000000000", "span_id": "sp_0000200000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 241000000000, "end_unix_nano": 242000000000, "attributes": {}} +{"rel_ts": 252.0, "trace_id": "tr_000021000000000000000000000", "span_id": "sp_0000210000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 253000000000, "end_unix_nano": 254000000000, "attributes": {}} +{"rel_ts": 264.0, "trace_id": "tr_000022000000000000000000000", "span_id": "sp_0000220000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 265000000000, "end_unix_nano": 266000000000, "attributes": {}} +{"rel_ts": 276.0, "trace_id": "tr_000023000000000000000000000", "span_id": "sp_0000230000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 277000000000, "end_unix_nano": 278000000000, "attributes": {}} +{"rel_ts": 288.0, "trace_id": "tr_000024000000000000000000000", "span_id": "sp_0000240000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 289000000000, "end_unix_nano": 290000000000, "attributes": {}} +{"rel_ts": 300.0, "trace_id": "tr_000025000000000000000000000", "span_id": "sp_0000250000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 301000000000, "end_unix_nano": 302000000000, "attributes": {}} +{"rel_ts": 312.0, "trace_id": "tr_000026000000000000000000000", "span_id": "sp_0000260000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 313000000000, "end_unix_nano": 314000000000, "attributes": {}} +{"rel_ts": 324.0, "trace_id": "tr_000027000000000000000000000", "span_id": "sp_0000270000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 325000000000, "end_unix_nano": 326000000000, "attributes": {}} +{"rel_ts": 336.0, "trace_id": "tr_000028000000000000000000000", "span_id": "sp_0000280000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 337000000000, "end_unix_nano": 338000000000, "attributes": {}} +{"rel_ts": 348.0, "trace_id": "tr_000029000000000000000000000", "span_id": "sp_0000290000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 349000000000, "end_unix_nano": 350000000000, "attributes": {}} +{"rel_ts": 360.0, "trace_id": "tr_000030000000000000000000000", "span_id": "sp_0000300000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 361000000000, "end_unix_nano": 362000000000, "attributes": {}} +{"rel_ts": 372.0, "trace_id": "tr_000031000000000000000000000", "span_id": "sp_0000310000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 373000000000, "end_unix_nano": 374000000000, "attributes": {}} +{"rel_ts": 384.0, "trace_id": "tr_000032000000000000000000000", "span_id": "sp_0000320000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 385000000000, "end_unix_nano": 386000000000, "attributes": {}} +{"rel_ts": 396.0, "trace_id": "tr_000033000000000000000000000", "span_id": "sp_0000330000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 397000000000, "end_unix_nano": 398000000000, "attributes": {}} +{"rel_ts": 408.0, "trace_id": "tr_000034000000000000000000000", "span_id": "sp_0000340000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 409000000000, "end_unix_nano": 410000000000, "attributes": {}} +{"rel_ts": 420.0, "trace_id": "tr_000035000000000000000000000", "span_id": "sp_0000350000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 421000000000, "end_unix_nano": 422000000000, "attributes": {}} +{"rel_ts": 432.0, "trace_id": "tr_000036000000000000000000000", "span_id": "sp_0000360000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 433000000000, "end_unix_nano": 434000000000, "attributes": {}} +{"rel_ts": 444.0, "trace_id": "tr_000037000000000000000000000", "span_id": "sp_0000370000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 445000000000, "end_unix_nano": 446000000000, "attributes": {}} +{"rel_ts": 456.0, "trace_id": "tr_000038000000000000000000000", "span_id": "sp_0000380000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 457000000000, "end_unix_nano": 458000000000, "attributes": {}} +{"rel_ts": 468.0, "trace_id": "tr_000039000000000000000000000", "span_id": "sp_0000390000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 469000000000, "end_unix_nano": 470000000000, "attributes": {}} +{"rel_ts": 480.0, "trace_id": "tr_000040000000000000000000000", "span_id": "sp_0000400000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 481000000000, "end_unix_nano": 482000000000, "attributes": {}} +{"rel_ts": 492.0, "trace_id": "tr_000041000000000000000000000", "span_id": "sp_0000410000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 493000000000, "end_unix_nano": 494000000000, "attributes": {}} +{"rel_ts": 504.0, "trace_id": "tr_000042000000000000000000000", "span_id": "sp_0000420000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 505000000000, "end_unix_nano": 506000000000, "attributes": {}} +{"rel_ts": 516.0, "trace_id": "tr_000043000000000000000000000", "span_id": "sp_0000430000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 517000000000, "end_unix_nano": 518000000000, "attributes": {}} +{"rel_ts": 528.0, "trace_id": "tr_000044000000000000000000000", "span_id": "sp_0000440000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 529000000000, "end_unix_nano": 530000000000, "attributes": {}} diff --git a/demo/fixtures/02_release_regression.jsonl b/demo/fixtures/02_release_regression.jsonl new file mode 100644 index 0000000..b0244c2 --- /dev/null +++ b/demo/fixtures/02_release_regression.jsonl @@ -0,0 +1,55 @@ +{"rel_ts": 0.0, "trace_id": "tr_000000000000000000000000000", "span_id": "sp_0000000000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 1000000000, "end_unix_nano": 2000000000, "attributes": {}} +{"rel_ts": 12.0, "trace_id": "tr_000001000000000000000000000", "span_id": "sp_0000010000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 13000000000, "end_unix_nano": 14000000000, "attributes": {}} +{"rel_ts": 24.0, "trace_id": "tr_000002000000000000000000000", "span_id": "sp_0000020000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 25000000000, "end_unix_nano": 26000000000, "attributes": {}} +{"rel_ts": 36.0, "trace_id": "tr_000003000000000000000000000", "span_id": "sp_0000030000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 37000000000, "end_unix_nano": 38000000000, "attributes": {}} +{"rel_ts": 48.0, "trace_id": "tr_000004000000000000000000000", "span_id": "sp_0000040000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 49000000000, "end_unix_nano": 50000000000, "attributes": {}} +{"rel_ts": 60.0, "trace_id": "tr_000005000000000000000000000", "span_id": "sp_0000050000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 61000000000, "end_unix_nano": 62000000000, "attributes": {}} +{"rel_ts": 72.0, "trace_id": "tr_000006000000000000000000000", "span_id": "sp_0000060000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 73000000000, "end_unix_nano": 74000000000, "attributes": {}} +{"rel_ts": 84.0, "trace_id": "tr_000007000000000000000000000", "span_id": "sp_0000070000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 85000000000, "end_unix_nano": 86000000000, "attributes": {}} +{"rel_ts": 96.0, "trace_id": "tr_000008000000000000000000000", "span_id": "sp_0000080000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 97000000000, "end_unix_nano": 98000000000, "attributes": {}} +{"rel_ts": 108.0, "trace_id": "tr_000009000000000000000000000", "span_id": "sp_0000090000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 109000000000, "end_unix_nano": 110000000000, "attributes": {}} +{"rel_ts": 120.0, "trace_id": "tr_000010000000000000000000000", "span_id": "sp_0000100000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 121000000000, "end_unix_nano": 122000000000, "attributes": {}} +{"rel_ts": 132.0, "trace_id": "tr_000011000000000000000000000", "span_id": "sp_0000110000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 133000000000, "end_unix_nano": 134000000000, "attributes": {}} +{"rel_ts": 144.0, "trace_id": "tr_000012000000000000000000000", "span_id": "sp_0000120000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 145000000000, "end_unix_nano": 146000000000, "attributes": {}} +{"rel_ts": 156.0, "trace_id": "tr_000013000000000000000000000", "span_id": "sp_0000130000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 157000000000, "end_unix_nano": 158000000000, "attributes": {}} +{"rel_ts": 168.0, "trace_id": "tr_000014000000000000000000000", "span_id": "sp_0000140000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 169000000000, "end_unix_nano": 170000000000, "attributes": {}} +{"rel_ts": 180.0, "trace_id": "tr_000015000000000000000000000", "span_id": "sp_0000150000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 181000000000, "end_unix_nano": 182000000000, "attributes": {}} +{"rel_ts": 192.0, "trace_id": "tr_000016000000000000000000000", "span_id": "sp_0000160000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 193000000000, "end_unix_nano": 194000000000, "attributes": {}} +{"rel_ts": 204.0, "trace_id": "tr_000017000000000000000000000", "span_id": "sp_0000170000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 205000000000, "end_unix_nano": 206000000000, "attributes": {}} +{"rel_ts": 216.0, "trace_id": "tr_000018000000000000000000000", "span_id": "sp_0000180000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 217000000000, "end_unix_nano": 218000000000, "attributes": {}} +{"rel_ts": 228.0, "trace_id": "tr_000019000000000000000000000", "span_id": "sp_0000190000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 229000000000, "end_unix_nano": 230000000000, "attributes": {}} +{"rel_ts": 240.0, "trace_id": "tr_000020000000000000000000000", "span_id": "sp_0000200000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 241000000000, "end_unix_nano": 242000000000, "attributes": {}} +{"rel_ts": 252.0, "trace_id": "tr_000021000000000000000000000", "span_id": "sp_0000210000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 253000000000, "end_unix_nano": 254000000000, "attributes": {}} +{"rel_ts": 264.0, "trace_id": "tr_000022000000000000000000000", "span_id": "sp_0000220000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 265000000000, "end_unix_nano": 266000000000, "attributes": {}} +{"rel_ts": 276.0, "trace_id": "tr_000023000000000000000000000", "span_id": "sp_0000230000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 277000000000, "end_unix_nano": 278000000000, "attributes": {}} +{"rel_ts": 288.0, "trace_id": "tr_000024000000000000000000000", "span_id": "sp_0000240000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 289000000000, "end_unix_nano": 290000000000, "attributes": {}} +{"rel_ts": 300.0, "trace_id": "tr_000025000000000000000000000", "span_id": "sp_0000250000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 301000000000, "end_unix_nano": 302000000000, "attributes": {}} +{"rel_ts": 312.0, "trace_id": "tr_000026000000000000000000000", "span_id": "sp_0000260000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 313000000000, "end_unix_nano": 314000000000, "attributes": {}} +{"rel_ts": 324.0, "trace_id": "tr_000027000000000000000000000", "span_id": "sp_0000270000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 325000000000, "end_unix_nano": 326000000000, "attributes": {}} +{"rel_ts": 336.0, "trace_id": "tr_000028000000000000000000000", "span_id": "sp_0000280000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 337000000000, "end_unix_nano": 338000000000, "attributes": {}} +{"rel_ts": 348.0, "trace_id": "tr_000029000000000000000000000", "span_id": "sp_0000290000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 349000000000, "end_unix_nano": 350000000000, "attributes": {}} +{"rel_ts": 360.0, "trace_id": "tr_000030000000000000000000000", "span_id": "sp_0000300000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 361000000000, "end_unix_nano": 362000000000, "attributes": {}} +{"rel_ts": 372.0, "trace_id": "tr_000031000000000000000000000", "span_id": "sp_0000310000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 373000000000, "end_unix_nano": 374000000000, "attributes": {}} +{"rel_ts": 384.0, "trace_id": "tr_000032000000000000000000000", "span_id": "sp_0000320000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 385000000000, "end_unix_nano": 386000000000, "attributes": {}} +{"rel_ts": 396.0, "trace_id": "tr_000033000000000000000000000", "span_id": "sp_0000330000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 397000000000, "end_unix_nano": 398000000000, "attributes": {}} +{"rel_ts": 408.0, "trace_id": "tr_000034000000000000000000000", "span_id": "sp_0000340000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 409000000000, "end_unix_nano": 410000000000, "attributes": {}} +{"rel_ts": 420.0, "trace_id": "tr_000035000000000000000000000", "span_id": "sp_0000350000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 421000000000, "end_unix_nano": 422000000000, "attributes": {}} +{"rel_ts": 432.0, "trace_id": "tr_000036000000000000000000000", "span_id": "sp_0000360000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 433000000000, "end_unix_nano": 434000000000, "attributes": {}} +{"rel_ts": 444.0, "trace_id": "tr_000037000000000000000000000", "span_id": "sp_0000370000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 445000000000, "end_unix_nano": 446000000000, "attributes": {}} +{"rel_ts": 456.0, "trace_id": "tr_000038000000000000000000000", "span_id": "sp_0000380000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 457000000000, "end_unix_nano": 458000000000, "attributes": {}} +{"rel_ts": 468.0, "trace_id": "tr_000039000000000000000000000", "span_id": "sp_0000390000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 469000000000, "end_unix_nano": 470000000000, "attributes": {}} +{"rel_ts": 480.0, "trace_id": "tr_000040000000000000000000000", "span_id": "sp_0000400000000", "service_name": "ragapp", "service_version": "v2", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "Garbage hallucinated text response with zero semantic similarity 40.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 481000000000, "end_unix_nano": 482000000000, "attributes": {}} +{"rel_ts": 492.0, "trace_id": "tr_000041000000000000000000000", "span_id": "sp_0000410000000", "service_name": "ragapp", "service_version": "v2", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "Garbage hallucinated text response with zero semantic similarity 41.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 493000000000, "end_unix_nano": 494000000000, "attributes": {}} +{"rel_ts": 504.0, "trace_id": "tr_000042000000000000000000000", "span_id": "sp_0000420000000", "service_name": "ragapp", "service_version": "v2", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "Garbage hallucinated text response with zero semantic similarity 42.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 505000000000, "end_unix_nano": 506000000000, "attributes": {}} +{"rel_ts": 516.0, "trace_id": "tr_000043000000000000000000000", "span_id": "sp_0000430000000", "service_name": "ragapp", "service_version": "v2", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "Garbage hallucinated text response with zero semantic similarity 43.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 517000000000, "end_unix_nano": 518000000000, "attributes": {}} +{"rel_ts": 528.0, "trace_id": "tr_000044000000000000000000000", "span_id": "sp_0000440000000", "service_name": "ragapp", "service_version": "v2", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "Garbage hallucinated text response with zero semantic similarity 44.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 529000000000, "end_unix_nano": 530000000000, "attributes": {}} +{"rel_ts": 540.0, "trace_id": "tr_000045000000000000000000000", "span_id": "sp_0000450000000", "service_name": "ragapp", "service_version": "v2", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "Garbage hallucinated text response with zero semantic similarity 45.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 541000000000, "end_unix_nano": 542000000000, "attributes": {}} +{"rel_ts": 552.0, "trace_id": "tr_000046000000000000000000000", "span_id": "sp_0000460000000", "service_name": "ragapp", "service_version": "v2", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "Garbage hallucinated text response with zero semantic similarity 46.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 553000000000, "end_unix_nano": 554000000000, "attributes": {}} +{"rel_ts": 564.0, "trace_id": "tr_000047000000000000000000000", "span_id": "sp_0000470000000", "service_name": "ragapp", "service_version": "v2", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "Garbage hallucinated text response with zero semantic similarity 47.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 565000000000, "end_unix_nano": 566000000000, "attributes": {}} +{"rel_ts": 576.0, "trace_id": "tr_000048000000000000000000000", "span_id": "sp_0000480000000", "service_name": "ragapp", "service_version": "v2", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "Garbage hallucinated text response with zero semantic similarity 48.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 577000000000, "end_unix_nano": 578000000000, "attributes": {}} +{"rel_ts": 588.0, "trace_id": "tr_000049000000000000000000000", "span_id": "sp_0000490000000", "service_name": "ragapp", "service_version": "v2", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "Garbage hallucinated text response with zero semantic similarity 49.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 589000000000, "end_unix_nano": 590000000000, "attributes": {}} +{"rel_ts": 600.0, "trace_id": "tr_000050000000000000000000000", "span_id": "sp_0000500000000", "service_name": "ragapp", "service_version": "v2", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "Garbage hallucinated text response with zero semantic similarity 50.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 601000000000, "end_unix_nano": 602000000000, "attributes": {}} +{"rel_ts": 612.0, "trace_id": "tr_000051000000000000000000000", "span_id": "sp_0000510000000", "service_name": "ragapp", "service_version": "v2", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "Garbage hallucinated text response with zero semantic similarity 51.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 613000000000, "end_unix_nano": 614000000000, "attributes": {}} +{"rel_ts": 624.0, "trace_id": "tr_000052000000000000000000000", "span_id": "sp_0000520000000", "service_name": "ragapp", "service_version": "v2", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "Garbage hallucinated text response with zero semantic similarity 52.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 625000000000, "end_unix_nano": 626000000000, "attributes": {}} +{"rel_ts": 636.0, "trace_id": "tr_000053000000000000000000000", "span_id": "sp_0000530000000", "service_name": "ragapp", "service_version": "v2", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "Garbage hallucinated text response with zero semantic similarity 53.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 637000000000, "end_unix_nano": 638000000000, "attributes": {}} +{"rel_ts": 648.0, "trace_id": "tr_000054000000000000000000000", "span_id": "sp_0000540000000", "service_name": "ragapp", "service_version": "v2", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "Garbage hallucinated text response with zero semantic similarity 54.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 649000000000, "end_unix_nano": 650000000000, "attributes": {}} diff --git a/demo/fixtures/03_runaway_loop.jsonl b/demo/fixtures/03_runaway_loop.jsonl new file mode 100644 index 0000000..4045987 --- /dev/null +++ b/demo/fixtures/03_runaway_loop.jsonl @@ -0,0 +1,55 @@ +{"rel_ts": 0.0, "trace_id": "tr_000000000000000000000000000", "span_id": "sp_0000000000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 1000000000, "end_unix_nano": 2000000000, "attributes": {}} +{"rel_ts": 12.0, "trace_id": "tr_000001000000000000000000000", "span_id": "sp_0000010000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 13000000000, "end_unix_nano": 14000000000, "attributes": {}} +{"rel_ts": 24.0, "trace_id": "tr_000002000000000000000000000", "span_id": "sp_0000020000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 25000000000, "end_unix_nano": 26000000000, "attributes": {}} +{"rel_ts": 36.0, "trace_id": "tr_000003000000000000000000000", "span_id": "sp_0000030000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 37000000000, "end_unix_nano": 38000000000, "attributes": {}} +{"rel_ts": 48.0, "trace_id": "tr_000004000000000000000000000", "span_id": "sp_0000040000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 49000000000, "end_unix_nano": 50000000000, "attributes": {}} +{"rel_ts": 60.0, "trace_id": "tr_000005000000000000000000000", "span_id": "sp_0000050000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 61000000000, "end_unix_nano": 62000000000, "attributes": {}} +{"rel_ts": 72.0, "trace_id": "tr_000006000000000000000000000", "span_id": "sp_0000060000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 73000000000, "end_unix_nano": 74000000000, "attributes": {}} +{"rel_ts": 84.0, "trace_id": "tr_000007000000000000000000000", "span_id": "sp_0000070000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 85000000000, "end_unix_nano": 86000000000, "attributes": {}} +{"rel_ts": 96.0, "trace_id": "tr_000008000000000000000000000", "span_id": "sp_0000080000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 97000000000, "end_unix_nano": 98000000000, "attributes": {}} +{"rel_ts": 108.0, "trace_id": "tr_000009000000000000000000000", "span_id": "sp_0000090000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 109000000000, "end_unix_nano": 110000000000, "attributes": {}} +{"rel_ts": 120.0, "trace_id": "tr_000010000000000000000000000", "span_id": "sp_0000100000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 121000000000, "end_unix_nano": 122000000000, "attributes": {}} +{"rel_ts": 132.0, "trace_id": "tr_000011000000000000000000000", "span_id": "sp_0000110000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 133000000000, "end_unix_nano": 134000000000, "attributes": {}} +{"rel_ts": 144.0, "trace_id": "tr_000012000000000000000000000", "span_id": "sp_0000120000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 145000000000, "end_unix_nano": 146000000000, "attributes": {}} +{"rel_ts": 156.0, "trace_id": "tr_000013000000000000000000000", "span_id": "sp_0000130000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 157000000000, "end_unix_nano": 158000000000, "attributes": {}} +{"rel_ts": 168.0, "trace_id": "tr_000014000000000000000000000", "span_id": "sp_0000140000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 169000000000, "end_unix_nano": 170000000000, "attributes": {}} +{"rel_ts": 180.0, "trace_id": "tr_000015000000000000000000000", "span_id": "sp_0000150000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 181000000000, "end_unix_nano": 182000000000, "attributes": {}} +{"rel_ts": 192.0, "trace_id": "tr_000016000000000000000000000", "span_id": "sp_0000160000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 193000000000, "end_unix_nano": 194000000000, "attributes": {}} +{"rel_ts": 204.0, "trace_id": "tr_000017000000000000000000000", "span_id": "sp_0000170000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 205000000000, "end_unix_nano": 206000000000, "attributes": {}} +{"rel_ts": 216.0, "trace_id": "tr_000018000000000000000000000", "span_id": "sp_0000180000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 217000000000, "end_unix_nano": 218000000000, "attributes": {}} +{"rel_ts": 228.0, "trace_id": "tr_000019000000000000000000000", "span_id": "sp_0000190000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 229000000000, "end_unix_nano": 230000000000, "attributes": {}} +{"rel_ts": 240.0, "trace_id": "tr_000020000000000000000000000", "span_id": "sp_0000200000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 241000000000, "end_unix_nano": 242000000000, "attributes": {}} +{"rel_ts": 252.0, "trace_id": "tr_000021000000000000000000000", "span_id": "sp_0000210000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 253000000000, "end_unix_nano": 254000000000, "attributes": {}} +{"rel_ts": 264.0, "trace_id": "tr_000022000000000000000000000", "span_id": "sp_0000220000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 265000000000, "end_unix_nano": 266000000000, "attributes": {}} +{"rel_ts": 276.0, "trace_id": "tr_000023000000000000000000000", "span_id": "sp_0000230000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 277000000000, "end_unix_nano": 278000000000, "attributes": {}} +{"rel_ts": 288.0, "trace_id": "tr_000024000000000000000000000", "span_id": "sp_0000240000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 289000000000, "end_unix_nano": 290000000000, "attributes": {}} +{"rel_ts": 300.0, "trace_id": "tr_000025000000000000000000000", "span_id": "sp_0000250000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 301000000000, "end_unix_nano": 302000000000, "attributes": {}} +{"rel_ts": 312.0, "trace_id": "tr_000026000000000000000000000", "span_id": "sp_0000260000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 313000000000, "end_unix_nano": 314000000000, "attributes": {}} +{"rel_ts": 324.0, "trace_id": "tr_000027000000000000000000000", "span_id": "sp_0000270000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 325000000000, "end_unix_nano": 326000000000, "attributes": {}} +{"rel_ts": 336.0, "trace_id": "tr_000028000000000000000000000", "span_id": "sp_0000280000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 337000000000, "end_unix_nano": 338000000000, "attributes": {}} +{"rel_ts": 348.0, "trace_id": "tr_000029000000000000000000000", "span_id": "sp_0000290000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 349000000000, "end_unix_nano": 350000000000, "attributes": {}} +{"rel_ts": 360.0, "trace_id": "tr_000030000000000000000000000", "span_id": "sp_0000300000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 361000000000, "end_unix_nano": 362000000000, "attributes": {}} +{"rel_ts": 372.0, "trace_id": "tr_000031000000000000000000000", "span_id": "sp_0000310000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 373000000000, "end_unix_nano": 374000000000, "attributes": {}} +{"rel_ts": 384.0, "trace_id": "tr_000032000000000000000000000", "span_id": "sp_0000320000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 385000000000, "end_unix_nano": 386000000000, "attributes": {}} +{"rel_ts": 396.0, "trace_id": "tr_000033000000000000000000000", "span_id": "sp_0000330000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 397000000000, "end_unix_nano": 398000000000, "attributes": {}} +{"rel_ts": 408.0, "trace_id": "tr_000034000000000000000000000", "span_id": "sp_0000340000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 409000000000, "end_unix_nano": 410000000000, "attributes": {}} +{"rel_ts": 420.0, "trace_id": "tr_000035000000000000000000000", "span_id": "sp_0000350000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 421000000000, "end_unix_nano": 422000000000, "attributes": {}} +{"rel_ts": 432.0, "trace_id": "tr_000036000000000000000000000", "span_id": "sp_0000360000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 433000000000, "end_unix_nano": 434000000000, "attributes": {}} +{"rel_ts": 444.0, "trace_id": "tr_000037000000000000000000000", "span_id": "sp_0000370000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 445000000000, "end_unix_nano": 446000000000, "attributes": {}} +{"rel_ts": 456.0, "trace_id": "tr_000038000000000000000000000", "span_id": "sp_0000380000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 457000000000, "end_unix_nano": 458000000000, "attributes": {}} +{"rel_ts": 468.0, "trace_id": "tr_000039000000000000000000000", "span_id": "sp_0000390000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 20, "output_tokens": 30, "start_unix_nano": 469000000000, "end_unix_nano": 470000000000, "attributes": {}} +{"rel_ts": 480.0, "trace_id": "tr_000040000000000000000000000", "span_id": "sp_0000400000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "input_tokens": 15000, "output_tokens": 25000, "start_unix_nano": 481000000000, "end_unix_nano": 482000000000, "attributes": {}} +{"rel_ts": 480.2, "trace_id": "tr_000041000000000000000000000", "span_id": "sp_0000410000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "input_tokens": 15000, "output_tokens": 25000, "start_unix_nano": 481200000000, "end_unix_nano": 482200000000, "attributes": {}} +{"rel_ts": 480.4, "trace_id": "tr_000042000000000000000000000", "span_id": "sp_0000420000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "input_tokens": 15000, "output_tokens": 25000, "start_unix_nano": 481400000000, "end_unix_nano": 482400000000, "attributes": {}} +{"rel_ts": 480.59999999999997, "trace_id": "tr_000043000000000000000000000", "span_id": "sp_0000430000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "input_tokens": 15000, "output_tokens": 25000, "start_unix_nano": 481599999999, "end_unix_nano": 482599999999, "attributes": {}} +{"rel_ts": 480.79999999999995, "trace_id": "tr_000044000000000000000000000", "span_id": "sp_0000440000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "input_tokens": 15000, "output_tokens": 25000, "start_unix_nano": 481799999999, "end_unix_nano": 482799999999, "attributes": {}} +{"rel_ts": 480.99999999999994, "trace_id": "tr_000045000000000000000000000", "span_id": "sp_0000450000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "input_tokens": 15000, "output_tokens": 25000, "start_unix_nano": 481999999999, "end_unix_nano": 482999999999, "attributes": {}} +{"rel_ts": 481.19999999999993, "trace_id": "tr_000046000000000000000000000", "span_id": "sp_0000460000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "input_tokens": 15000, "output_tokens": 25000, "start_unix_nano": 482199999999, "end_unix_nano": 483199999999, "attributes": {}} +{"rel_ts": 481.3999999999999, "trace_id": "tr_000047000000000000000000000", "span_id": "sp_0000470000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "input_tokens": 15000, "output_tokens": 25000, "start_unix_nano": 482399999999, "end_unix_nano": 483399999999, "attributes": {}} +{"rel_ts": 481.5999999999999, "trace_id": "tr_000048000000000000000000000", "span_id": "sp_0000480000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "input_tokens": 15000, "output_tokens": 25000, "start_unix_nano": 482599999999, "end_unix_nano": 483599999999, "attributes": {}} +{"rel_ts": 481.7999999999999, "trace_id": "tr_000049000000000000000000000", "span_id": "sp_0000490000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "input_tokens": 15000, "output_tokens": 25000, "start_unix_nano": 482799999999, "end_unix_nano": 483799999999, "attributes": {}} +{"rel_ts": 481.9999999999999, "trace_id": "tr_000050000000000000000000000", "span_id": "sp_0000500000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "input_tokens": 15000, "output_tokens": 25000, "start_unix_nano": 482999999999, "end_unix_nano": 483999999999, "attributes": {}} +{"rel_ts": 482.1999999999999, "trace_id": "tr_000051000000000000000000000", "span_id": "sp_0000510000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "input_tokens": 15000, "output_tokens": 25000, "start_unix_nano": 483199999999, "end_unix_nano": 484199999999, "attributes": {}} +{"rel_ts": 482.39999999999986, "trace_id": "tr_000052000000000000000000000", "span_id": "sp_0000520000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "input_tokens": 15000, "output_tokens": 25000, "start_unix_nano": 483399999999, "end_unix_nano": 484399999999, "attributes": {}} +{"rel_ts": 482.59999999999985, "trace_id": "tr_000053000000000000000000000", "span_id": "sp_0000530000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "input_tokens": 15000, "output_tokens": 25000, "start_unix_nano": 483599999999, "end_unix_nano": 484599999999, "attributes": {}} +{"rel_ts": 482.79999999999984, "trace_id": "tr_000054000000000000000000000", "span_id": "sp_0000540000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "input_tokens": 15000, "output_tokens": 25000, "start_unix_nano": 483799999999, "end_unix_nano": 484799999999, "attributes": {}} diff --git a/demo/fixtures/04_input_shift.jsonl b/demo/fixtures/04_input_shift.jsonl new file mode 100644 index 0000000..c7eb202 --- /dev/null +++ b/demo/fixtures/04_input_shift.jsonl @@ -0,0 +1,55 @@ +{"rel_ts": 0.0, "trace_id": "tr_000000000000000000000000000", "span_id": "sp_0000000000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 1000000000, "end_unix_nano": 2000000000, "attributes": {}} +{"rel_ts": 12.0, "trace_id": "tr_000001000000000000000000000", "span_id": "sp_0000010000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 13000000000, "end_unix_nano": 14000000000, "attributes": {}} +{"rel_ts": 24.0, "trace_id": "tr_000002000000000000000000000", "span_id": "sp_0000020000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 25000000000, "end_unix_nano": 26000000000, "attributes": {}} +{"rel_ts": 36.0, "trace_id": "tr_000003000000000000000000000", "span_id": "sp_0000030000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 37000000000, "end_unix_nano": 38000000000, "attributes": {}} +{"rel_ts": 48.0, "trace_id": "tr_000004000000000000000000000", "span_id": "sp_0000040000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 49000000000, "end_unix_nano": 50000000000, "attributes": {}} +{"rel_ts": 60.0, "trace_id": "tr_000005000000000000000000000", "span_id": "sp_0000050000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 61000000000, "end_unix_nano": 62000000000, "attributes": {}} +{"rel_ts": 72.0, "trace_id": "tr_000006000000000000000000000", "span_id": "sp_0000060000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 73000000000, "end_unix_nano": 74000000000, "attributes": {}} +{"rel_ts": 84.0, "trace_id": "tr_000007000000000000000000000", "span_id": "sp_0000070000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 85000000000, "end_unix_nano": 86000000000, "attributes": {}} +{"rel_ts": 96.0, "trace_id": "tr_000008000000000000000000000", "span_id": "sp_0000080000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 97000000000, "end_unix_nano": 98000000000, "attributes": {}} +{"rel_ts": 108.0, "trace_id": "tr_000009000000000000000000000", "span_id": "sp_0000090000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 109000000000, "end_unix_nano": 110000000000, "attributes": {}} +{"rel_ts": 120.0, "trace_id": "tr_000010000000000000000000000", "span_id": "sp_0000100000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 121000000000, "end_unix_nano": 122000000000, "attributes": {}} +{"rel_ts": 132.0, "trace_id": "tr_000011000000000000000000000", "span_id": "sp_0000110000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 133000000000, "end_unix_nano": 134000000000, "attributes": {}} +{"rel_ts": 144.0, "trace_id": "tr_000012000000000000000000000", "span_id": "sp_0000120000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 145000000000, "end_unix_nano": 146000000000, "attributes": {}} +{"rel_ts": 156.0, "trace_id": "tr_000013000000000000000000000", "span_id": "sp_0000130000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 157000000000, "end_unix_nano": 158000000000, "attributes": {}} +{"rel_ts": 168.0, "trace_id": "tr_000014000000000000000000000", "span_id": "sp_0000140000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 169000000000, "end_unix_nano": 170000000000, "attributes": {}} +{"rel_ts": 180.0, "trace_id": "tr_000015000000000000000000000", "span_id": "sp_0000150000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 181000000000, "end_unix_nano": 182000000000, "attributes": {}} +{"rel_ts": 192.0, "trace_id": "tr_000016000000000000000000000", "span_id": "sp_0000160000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 193000000000, "end_unix_nano": 194000000000, "attributes": {}} +{"rel_ts": 204.0, "trace_id": "tr_000017000000000000000000000", "span_id": "sp_0000170000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 205000000000, "end_unix_nano": 206000000000, "attributes": {}} +{"rel_ts": 216.0, "trace_id": "tr_000018000000000000000000000", "span_id": "sp_0000180000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 217000000000, "end_unix_nano": 218000000000, "attributes": {}} +{"rel_ts": 228.0, "trace_id": "tr_000019000000000000000000000", "span_id": "sp_0000190000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 229000000000, "end_unix_nano": 230000000000, "attributes": {}} +{"rel_ts": 240.0, "trace_id": "tr_000020000000000000000000000", "span_id": "sp_0000200000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 241000000000, "end_unix_nano": 242000000000, "attributes": {}} +{"rel_ts": 252.0, "trace_id": "tr_000021000000000000000000000", "span_id": "sp_0000210000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 253000000000, "end_unix_nano": 254000000000, "attributes": {}} +{"rel_ts": 264.0, "trace_id": "tr_000022000000000000000000000", "span_id": "sp_0000220000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 265000000000, "end_unix_nano": 266000000000, "attributes": {}} +{"rel_ts": 276.0, "trace_id": "tr_000023000000000000000000000", "span_id": "sp_0000230000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 277000000000, "end_unix_nano": 278000000000, "attributes": {}} +{"rel_ts": 288.0, "trace_id": "tr_000024000000000000000000000", "span_id": "sp_0000240000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 289000000000, "end_unix_nano": 290000000000, "attributes": {}} +{"rel_ts": 300.0, "trace_id": "tr_000025000000000000000000000", "span_id": "sp_0000250000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 301000000000, "end_unix_nano": 302000000000, "attributes": {}} +{"rel_ts": 312.0, "trace_id": "tr_000026000000000000000000000", "span_id": "sp_0000260000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 313000000000, "end_unix_nano": 314000000000, "attributes": {}} +{"rel_ts": 324.0, "trace_id": "tr_000027000000000000000000000", "span_id": "sp_0000270000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 325000000000, "end_unix_nano": 326000000000, "attributes": {}} +{"rel_ts": 336.0, "trace_id": "tr_000028000000000000000000000", "span_id": "sp_0000280000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 337000000000, "end_unix_nano": 338000000000, "attributes": {}} +{"rel_ts": 348.0, "trace_id": "tr_000029000000000000000000000", "span_id": "sp_0000290000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 349000000000, "end_unix_nano": 350000000000, "attributes": {}} +{"rel_ts": 360.0, "trace_id": "tr_000030000000000000000000000", "span_id": "sp_0000300000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 361000000000, "end_unix_nano": 362000000000, "attributes": {}} +{"rel_ts": 372.0, "trace_id": "tr_000031000000000000000000000", "span_id": "sp_0000310000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 373000000000, "end_unix_nano": 374000000000, "attributes": {}} +{"rel_ts": 384.0, "trace_id": "tr_000032000000000000000000000", "span_id": "sp_0000320000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 385000000000, "end_unix_nano": 386000000000, "attributes": {}} +{"rel_ts": 396.0, "trace_id": "tr_000033000000000000000000000", "span_id": "sp_0000330000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 397000000000, "end_unix_nano": 398000000000, "attributes": {}} +{"rel_ts": 408.0, "trace_id": "tr_000034000000000000000000000", "span_id": "sp_0000340000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 409000000000, "end_unix_nano": 410000000000, "attributes": {}} +{"rel_ts": 420.0, "trace_id": "tr_000035000000000000000000000", "span_id": "sp_0000350000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 0?", "output_text": "OpenTelemetry is an open source observability framework variant 0.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 421000000000, "end_unix_nano": 422000000000, "attributes": {}} +{"rel_ts": 432.0, "trace_id": "tr_000036000000000000000000000", "span_id": "sp_0000360000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 1?", "output_text": "OpenTelemetry is an open source observability framework variant 1.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 433000000000, "end_unix_nano": 434000000000, "attributes": {}} +{"rel_ts": 444.0, "trace_id": "tr_000037000000000000000000000", "span_id": "sp_0000370000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 2?", "output_text": "OpenTelemetry is an open source observability framework variant 2.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 445000000000, "end_unix_nano": 446000000000, "attributes": {}} +{"rel_ts": 456.0, "trace_id": "tr_000038000000000000000000000", "span_id": "sp_0000380000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 3?", "output_text": "OpenTelemetry is an open source observability framework variant 3.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 457000000000, "end_unix_nano": 458000000000, "attributes": {}} +{"rel_ts": 468.0, "trace_id": "tr_000039000000000000000000000", "span_id": "sp_0000390000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "what is opentelemetry topic query 4?", "output_text": "OpenTelemetry is an open source observability framework variant 4.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 469000000000, "end_unix_nano": 470000000000, "attributes": {}} +{"rel_ts": 480.0, "trace_id": "tr_000040000000000000000000000", "span_id": "sp_0000400000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "explain write ahead logging index locking deadlock 40", "output_text": "Write ahead logging and relational database B-Trees MVCC isolation 40.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 481000000000, "end_unix_nano": 482000000000, "attributes": {}} +{"rel_ts": 492.0, "trace_id": "tr_000041000000000000000000000", "span_id": "sp_0000410000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "explain write ahead logging index locking deadlock 41", "output_text": "Write ahead logging and relational database B-Trees MVCC isolation 41.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 493000000000, "end_unix_nano": 494000000000, "attributes": {}} +{"rel_ts": 504.0, "trace_id": "tr_000042000000000000000000000", "span_id": "sp_0000420000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "explain write ahead logging index locking deadlock 42", "output_text": "Write ahead logging and relational database B-Trees MVCC isolation 42.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 505000000000, "end_unix_nano": 506000000000, "attributes": {}} +{"rel_ts": 516.0, "trace_id": "tr_000043000000000000000000000", "span_id": "sp_0000430000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "explain write ahead logging index locking deadlock 43", "output_text": "Write ahead logging and relational database B-Trees MVCC isolation 43.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 517000000000, "end_unix_nano": 518000000000, "attributes": {}} +{"rel_ts": 528.0, "trace_id": "tr_000044000000000000000000000", "span_id": "sp_0000440000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "explain write ahead logging index locking deadlock 44", "output_text": "Write ahead logging and relational database B-Trees MVCC isolation 44.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 529000000000, "end_unix_nano": 530000000000, "attributes": {}} +{"rel_ts": 540.0, "trace_id": "tr_000045000000000000000000000", "span_id": "sp_0000450000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "explain write ahead logging index locking deadlock 45", "output_text": "Write ahead logging and relational database B-Trees MVCC isolation 45.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 541000000000, "end_unix_nano": 542000000000, "attributes": {}} +{"rel_ts": 552.0, "trace_id": "tr_000046000000000000000000000", "span_id": "sp_0000460000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "explain write ahead logging index locking deadlock 46", "output_text": "Write ahead logging and relational database B-Trees MVCC isolation 46.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 553000000000, "end_unix_nano": 554000000000, "attributes": {}} +{"rel_ts": 564.0, "trace_id": "tr_000047000000000000000000000", "span_id": "sp_0000470000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "explain write ahead logging index locking deadlock 47", "output_text": "Write ahead logging and relational database B-Trees MVCC isolation 47.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 565000000000, "end_unix_nano": 566000000000, "attributes": {}} +{"rel_ts": 576.0, "trace_id": "tr_000048000000000000000000000", "span_id": "sp_0000480000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "explain write ahead logging index locking deadlock 48", "output_text": "Write ahead logging and relational database B-Trees MVCC isolation 48.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 577000000000, "end_unix_nano": 578000000000, "attributes": {}} +{"rel_ts": 588.0, "trace_id": "tr_000049000000000000000000000", "span_id": "sp_0000490000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "explain write ahead logging index locking deadlock 49", "output_text": "Write ahead logging and relational database B-Trees MVCC isolation 49.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 589000000000, "end_unix_nano": 590000000000, "attributes": {}} +{"rel_ts": 600.0, "trace_id": "tr_000050000000000000000000000", "span_id": "sp_0000500000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "explain write ahead logging index locking deadlock 50", "output_text": "Write ahead logging and relational database B-Trees MVCC isolation 50.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 601000000000, "end_unix_nano": 602000000000, "attributes": {}} +{"rel_ts": 612.0, "trace_id": "tr_000051000000000000000000000", "span_id": "sp_0000510000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "explain write ahead logging index locking deadlock 51", "output_text": "Write ahead logging and relational database B-Trees MVCC isolation 51.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 613000000000, "end_unix_nano": 614000000000, "attributes": {}} +{"rel_ts": 624.0, "trace_id": "tr_000052000000000000000000000", "span_id": "sp_0000520000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "explain write ahead logging index locking deadlock 52", "output_text": "Write ahead logging and relational database B-Trees MVCC isolation 52.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 625000000000, "end_unix_nano": 626000000000, "attributes": {}} +{"rel_ts": 636.0, "trace_id": "tr_000053000000000000000000000", "span_id": "sp_0000530000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "explain write ahead logging index locking deadlock 53", "output_text": "Write ahead logging and relational database B-Trees MVCC isolation 53.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 637000000000, "end_unix_nano": 638000000000, "attributes": {}} +{"rel_ts": 648.0, "trace_id": "tr_000054000000000000000000000", "span_id": "sp_0000540000000", "service_name": "ragapp", "service_version": "v1", "gen_ai_system": "openai", "model": "gpt-4o", "input_text": "explain write ahead logging index locking deadlock 54", "output_text": "Write ahead logging and relational database B-Trees MVCC isolation 54.", "input_tokens": 15, "output_tokens": 30, "start_unix_nano": 649000000000, "end_unix_nano": 650000000000, "attributes": {}} diff --git a/demo/fixtures/generate_fixtures.py b/demo/fixtures/generate_fixtures.py new file mode 100644 index 0000000..033c634 --- /dev/null +++ b/demo/fixtures/generate_fixtures.py @@ -0,0 +1,146 @@ +"""Generate deterministic golden JSONL replay fixtures (spec §10, §18).""" + +from __future__ import annotations + +import os +from pathlib import Path +from vitals.model import GenAISpan +from vitals.replay.fixtures import write_fixture + + +def make_span( + i: int, + version: str = "v1", + input_text: str = "what is opentelemetry?", + output_text: str = "OpenTelemetry is an open source observability framework.", + input_tokens: int = 15, + output_tokens: int = 30, + rel_ts: float = 0.0, +) -> tuple[GenAISpan, float]: + span = GenAISpan( + trace_id=f"tr_{i:06d}000000000000000000000", + span_id=f"sp_{i:06d}0000000", + service_name="ragapp", + gen_ai_system="openai", + model="gpt-4o", + service_version=version, + input_text=input_text, + output_text=output_text, + input_tokens=input_tokens, + output_tokens=output_tokens, + start_unix_nano=1000000000 + int(rel_ts * 1e9), + end_unix_nano=2000000000 + int(rel_ts * 1e9), + ) + return span, rel_ts + + +def generate_all_fixtures(out_dir: str = "demo/fixtures") -> None: + path_dir = Path(out_dir) + path_dir.mkdir(parents=True, exist_ok=True) + + # 1. Steady Baseline (01_steady_baseline.jsonl): 30 warming + 15 healthy scored spans + spans_01 = [] + ts = 0.0 + for i in range(45): + spans_01.append( + make_span( + i, + version="v1", + input_text=f"what is opentelemetry topic query {i % 5}?", + output_text=f"OpenTelemetry is an open source observability framework variant {i % 5}.", + rel_ts=ts, + ) + ) + ts += 12.0 + write_fixture(path_dir / "01_steady_baseline.jsonl", spans_01) + + # 2. Release Regression (02_release_regression.jsonl): 30 warming + 10 healthy v1 + 15 degraded v2 spans + spans_02 = [] + ts = 0.0 + for i in range(40): + spans_02.append( + make_span( + i, + version="v1", + input_text=f"what is opentelemetry topic query {i % 5}?", + output_text=f"OpenTelemetry is an open source observability framework variant {i % 5}.", + rel_ts=ts, + ) + ) + ts += 12.0 + for i in range(40, 55): + spans_02.append( + make_span( + i, + version="v2", + input_text=f"what is opentelemetry topic query {i % 5}?", + output_text=f"Garbage hallucinated text response with zero semantic similarity {i}.", + rel_ts=ts, + ) + ) + ts += 12.0 + write_fixture(path_dir / "02_release_regression.jsonl", spans_02) + + # 3. Runaway Loop (03_runaway_loop.jsonl): 30 warming + 10 healthy + 15 rapid runaway loop spans + spans_03 = [] + ts = 0.0 + for i in range(40): + spans_03.append( + make_span( + i, + version="v1", + input_text=f"what is opentelemetry topic query {i % 5}?", + output_text=f"OpenTelemetry is an open source observability framework variant {i % 5}.", + input_tokens=20, + output_tokens=30, + rel_ts=ts, + ) + ) + ts += 12.0 + for i in range(40, 55): + spans_03.append( + make_span( + i, + version="v1", + input_text=f"what is opentelemetry topic query {i % 5}?", + output_text="A" * 5000, + input_tokens=15000, + output_tokens=25000, + rel_ts=ts, + ) + ) + ts += 0.2 + write_fixture(path_dir / "03_runaway_loop.jsonl", spans_03) + + # 4. Input Shift (04_input_shift.jsonl): 30 warming + 10 healthy Topic A + 15 shifted Topic B spans + spans_04 = [] + ts = 0.0 + for i in range(40): + spans_04.append( + make_span( + i, + version="v1", + input_text=f"what is opentelemetry topic query {i % 5}?", + output_text=f"OpenTelemetry is an open source observability framework variant {i % 5}.", + rel_ts=ts, + ) + ) + ts += 12.0 + for i in range(40, 55): + spans_04.append( + make_span( + i, + version="v1", + input_text=f"explain write ahead logging index locking deadlock {i}", + output_text=f"Write ahead logging and relational database B-Trees MVCC isolation {i}.", + rel_ts=ts, + ) + ) + ts += 12.0 + write_fixture(path_dir / "04_input_shift.jsonl", spans_04) + + print(f"Successfully generated 4 golden replay fixtures in {out_dir}") + + +if __name__ == "__main__": + generate_all_fixtures() diff --git a/demo/ragapp/corpus.py b/demo/ragapp/corpus.py index 0852848..fb54962 100644 --- a/demo/ragapp/corpus.py +++ b/demo/ragapp/corpus.py @@ -2,7 +2,7 @@ from __future__ import annotations -DOCS = [ +DOCS_TOPIC_A = [ "OpenTelemetry is an open source observability framework for traces, metrics, and logs.", "SigNoz is an open source APM built on OpenTelemetry and ClickHouse.", "The OTLP protocol exports telemetry over gRPC on port 4317 and HTTP on port 4318.", @@ -13,12 +13,31 @@ "CUSUM detects the onset of a sustained shift in a monitored metric series.", ] +DOCS_TOPIC_B = [ + "Write-Ahead Logging (WAL) ensures durability and atomic index updates in relational engines.", + "B-Tree indices optimize range queries, whereas Hash indices target exact equality lookups.", + "Multiversion Concurrency Control (MVCC) allows concurrent readers and writers without global locks.", + "Query planners use cost estimates to choose between nested loop joins and hash joins.", + "Database checkpoints flush dirty buffer pool pages to disk for recovery speed.", + "Foreign keys enforce referential integrity across relational schema tables.", + "Deadlock detection algorithms build wait-for graphs to break cyclic transaction dependencies.", + "Read committed isolation prevents dirty reads by acquiring short-term shared locks.", +] + +DOCS = DOCS_TOPIC_A + DOCS_TOPIC_B -def retrieve(query: str, k: int = 3) -> list[str]: + +def retrieve(query: str, k: int = 3, topic: str | None = None) -> list[str]: """Return the k docs sharing the most words with the query (deterministic).""" + docs_to_search = DOCS + if topic == "A": + docs_to_search = DOCS_TOPIC_A + elif topic == "B": + docs_to_search = DOCS_TOPIC_B + q_words = {w.lower().strip("?.,") for w in query.split()} scored = sorted( - DOCS, + docs_to_search, key=lambda d: len(q_words & {w.lower().strip("?.,") for w in d.split()}), reverse=True, ) diff --git a/demo/scenarios/steady_traffic.py b/demo/scenarios/steady_traffic.py new file mode 100644 index 0000000..14f3dbb --- /dev/null +++ b/demo/scenarios/steady_traffic.py @@ -0,0 +1,54 @@ +"""Scenario: Steady baseline traffic (topic A queries).""" + +from __future__ import annotations + +import argparse +import random +import time +import urllib.request + +QUERIES = [ + "what is opentelemetry?", + "how does signoz export metrics?", + "what port does OTLP use?", + "explain token usage attributes", + "how does quality drift detection work?", +] + + +def send_query(url: str, prompt: str) -> None: + req = urllib.request.Request( + url, + data=f'{{"prompt": "{prompt}"}}'.encode("utf-8"), + headers={"Content-Type": "application/json"}, + method="POST", + ) + try: + with urllib.request.urlopen(req, timeout=5.0) as resp: + resp.read() + except Exception as e: + print(f"Error sending query '{prompt}': {e}") + + +def main() -> None: + parser = argparse.ArgumentParser(description="Send steady baseline query traffic") + parser.add_argument("--url", default="http://localhost:8000/chat", help="RAG app URL") + parser.add_argument("--rate", type=float, default=2.0, help="Queries per second") + parser.add_argument("--count", type=int, default=50, help="Total queries to send") + args = parser.parse_args() + + interval = 1.0 / args.rate if args.rate > 0 else 0.5 + print(f"Sending {args.count} steady baseline queries to {args.url}...") + + for i in range(args.count): + q = random.choice(QUERIES) + send_query(args.url, q) + if (i + 1) % 10 == 0: + print(f"Sent {i + 1}/{args.count} queries") + time.sleep(interval) + + print("Steady traffic generation complete.") + + +if __name__ == "__main__": + main() diff --git a/demo/scenarios/traffic_shift.py b/demo/scenarios/traffic_shift.py new file mode 100644 index 0000000..bcab3fe --- /dev/null +++ b/demo/scenarios/traffic_shift.py @@ -0,0 +1,54 @@ +"""Scenario: Input shift traffic (topic B database queries).""" + +from __future__ import annotations + +import argparse +import random +import time +import urllib.request + +QUERIES_TOPIC_B = [ + "what is write ahead logging?", + "how do b-tree indices work?", + "explain multiversion concurrency control", + "what is dirty read in database isolation?", + "how does deadlock detection resolve graph cycles?", +] + + +def send_query(url: str, prompt: str) -> None: + req = urllib.request.Request( + url, + data=f'{{"prompt": "{prompt}"}}'.encode("utf-8"), + headers={"Content-Type": "application/json"}, + method="POST", + ) + try: + with urllib.request.urlopen(req, timeout=5.0) as resp: + resp.read() + except Exception as e: + print(f"Error sending query '{prompt}': {e}") + + +def main() -> None: + parser = argparse.ArgumentParser(description="Send topic B input shift traffic") + parser.add_argument("--url", default="http://localhost:8000/chat", help="RAG app URL") + parser.add_argument("--rate", type=float, default=2.0, help="Queries per second") + parser.add_argument("--count", type=int, default=50, help="Total queries to send") + args = parser.parse_args() + + interval = 1.0 / args.rate if args.rate > 0 else 0.5 + print(f"Sending {args.count} topic B input-shifted queries to {args.url}...") + + for i in range(args.count): + q = random.choice(QUERIES_TOPIC_B) + send_query(args.url, q) + if (i + 1) % 10 == 0: + print(f"Sent {i + 1}/{args.count} queries") + time.sleep(interval) + + print("Traffic shift generation complete.") + + +if __name__ == "__main__": + main() diff --git a/docs/blind-spots.md b/docs/blind-spots.md new file mode 100644 index 0000000..93bad4c --- /dev/null +++ b/docs/blind-spots.md @@ -0,0 +1,66 @@ +# Vitals Technical Analysis: System Boundaries & Blind Spots + +This document provides a rigorous architectural analysis of Vitals' detection boundaries, statistical trade-offs, false positive/negative failure modes, and future roadmap. + +--- + +## 1. Mathematical & Statistical Boundaries + +### 1.1 Sample Size Constraints (`n < min_samples`) +- **Boundary**: Statistical normalization (z-score calculation via Welford's algorithm) requires sufficient sample density to estimate variance accurately. +- **Trade-off**: When sample count `n < min_samples` (default 5), Vitals emits `INCONCLUSIVE (low_sample)`. +- **Impact**: Short bursts of < 5 requests cannot trigger a `CHANGED` verdict, preventing false alerts on low-traffic endpoints. + +### 1.2 Reference Baseline & Cold Start Window +- **Boundary**: Vitals requires a baseline reference window (default 30 spans) to establish the healthy comparison distribution. +- **Trade-off**: During initial pipeline startup, the verdict state remains `WARMING`. +- **Impact**: An anomaly occurring during the first 30 spans of a brand new service will not be flagged until warming completes. + +### 1.3 Gradual Drift vs. Sudden Release Spikes +- **Boundary**: Rolling deques (`maxlen=500`) maintain moving windows. Gradual drift occurring over days/weeks will slowly shift the baseline mean (`mu`). +- **Trade-off**: Vitals is optimized for **release regressions** (step-function drops at deploy time) and **runaway cost spikes** (sudden rate increases), not multi-month semantic drift. + +--- + +## 2. Guard Design & False Positive Suppression + +### 2.1 Guard G2: Input Co-movement (`INCONCLUSIVE(input_shift)`) +- **Problem**: When user query topics shift (e.g., users switch from asking basic product questions to complex debugging queries), response semantic distance increases naturally. A naive drift detector would falsely flag model regression. +- **Mechanism**: Guard G2 measures `input_drift` alongside `behavior_drift`. If `behavior_z >= 3.0` **AND** `input_z >= 3.0`, Vitals emits `INCONCLUSIVE (input_shift)`. +- **Outcome**: Suppresses false positive rollbacks when user traffic changes rather than model behavior. + +### 2.2 Guard G3: Length Shift Caveat +- **Problem**: Model prompt changes often cause longer or shorter responses. Shortened responses reduce semantic drift space, potentially masking drift. +- **Mechanism**: Guard G3 measures `output_len` percentage change relative to baseline. If `abs(pct_change) >= 20%`, Vitals attaches caveat `output_length_X%` to the verdict while retaining detection accuracy. + +--- + +## 3. Telemetry & Out-of-Band Pipeline Boundaries + +### 3.1 Ingest Hot Path Isolation +- **Boundary**: Scoring and verdict evaluation execute entirely out-of-band on fan-out gRPC span copies. +- **Guarantee**: No failure, lock contention, or SQLite exception in Vitals can ever block user API requests or interrupt the primary SigNoz telemetry path. + +### 3.2 Missing Telemetry Attributes +- **Boundary**: If a client span fails to record `gen_ai.content.completion` or token counts, `QualityEngine` gracefully skips quality scoring while `CostEngine` records zero cost. +- **Health Counter**: Increments `spans_skipped` in self-health metrics. + +--- + +## 4. Failure Mode Matrix + +| Scenario | Expected State | Cause / Reason | Explanation | +|---|---|---|---| +| New Version Release with Prompt Regression | `CHANGED` | `RELEASE` | Behavior z-score ≥ 3.0σ within 300s of deployment | +| Runaway Agent Loop (Rate ≥ 5x) | `CHANGED` | `UNATTRIBUTED` | Cost spend-rate multiplier ≥ 5.0x (bypasses 2-tick hysteresis) | +| User Traffic Topic Shift | `INCONCLUSIVE` | `INPUT_SHIFT` | Input drift ≥ 3.0σ and behavior drift ≥ 3.0σ (Guard G2) | +| Insufficient Traffic (n < 5) | `INCONCLUSIVE` | `LOW_SAMPLE` | Sample count below statistical threshold (Guard G1) | +| Output Length Shift (-25%) | `STEADY` / `CHANGED` | Caveat Attached | Output length caveat appended without corrupting z-score (Guard G3) | + +--- + +## 5. Future Roadmap + +1. **Multi-Tenant Token Isolation**: Extending `ScopeKey` to include `tenant.id` for granular B2B SaaS per-customer anomaly detection. +2. **Vector Embedding Shift Metrics**: Complementing response drift (PSI) with lightweight vector centroid distance metrics. +3. **Adaptive Sigma Floor**: Dynamic adjustment of `sigma_floor` based on baseline variance coefficient of variation. diff --git a/docs/v2-frontend-spec.md b/docs/v2-frontend-spec.md new file mode 100644 index 0000000..6b1656a --- /dev/null +++ b/docs/v2-frontend-spec.md @@ -0,0 +1,1135 @@ +# Vitals Console — Frontend Engineering Specification + +Implementation-ready. Consumes the backend defined in +[v2-engineering-spec.md](v2-engineering-spec.md) §8.3. No design decisions remain. + +**Rule for the implementing agent:** if this document and your instinct disagree, +this document wins. If something genuinely is not covered, choose the option most +consistent with §2 (tokens) and §3 (motion), and note it in `DECISIONS.md`. + +--- + +## 0. Stack — locked, and one override + +### 0.1 The override + +Backend spec **D5/D12** locked "stdlib `http.server`, f-string HTML, no build +step." That is incompatible with the quality bar requested here. **D5 is +superseded by this document.** The *intent* of D5 is preserved exactly: + +- **No new runtime dependency.** The Python process still serves everything. +- **No CDN, no external fetch.** Fonts, icons, and JS are all self-hosted. +- **The build step is dev-time only.** Compiled assets are committed to + `vitals/console/static/` and shipped in the wheel and the Docker image. A user + running `pip install vitals && vitals run` never sees Node. + +### 0.2 Required backend addition (the only one) + +The Python console server must serve the SPA: + +- `GET /` and **any non-`/api/*`, non-`/assets/*` path** → return + `vitals/console/static/index.html` with `200` (SPA history fallback). +- `GET /assets/*` → serve from `vitals/console/static/assets/` with + `Cache-Control: public, max-age=31536000, immutable`. +- `index.html` → `Cache-Control: no-cache`. + +Without the fallback, `/v/:id`, `/scopes`, and `/about` 404 on hard refresh. + +### 0.3 Locked stack + +| Concern | Choice | Why (one line) | +|---|---|---| +| Framework | **React 18 + TypeScript (strict)** | Boring, ubiquitous, and the agent will not fight it. | +| Build | **Vite 5**, output `vitals/console/static/`, base `/` | Fast, zero-config, emits hashed assets. | +| Styling | **CSS Custom Properties + CSS Modules** | Tokens as CSS vars are directly auditable against §2. Utility dialects hide whether the spec was followed. | +| Routing | **React Router v6** (`createBrowserRouter`) | Deep-linkable drawer at `/v/:id` requires real routing. | +| Data | **TanStack Query v5** | Polling, stale-while-revalidate, and backoff are exactly the problem it solves. | +| Animation | **Motion for React** (`motion` package) | Exit animations for drawer/toast are impractical with CSS alone. | +| Icons | **lucide-react** | Tree-shakeable, consistent 1.5px stroke, matches the aesthetic. | +| Charts | **Hand-authored SVG. No chart library.** | Two chart forms only (§9). A library costs 50–150 KB for something fully controlled. | +| Fonts | **Self-hosted Inter var + JetBrains Mono**, woff2, `font-display: swap` | No CDN; works offline and under strict CSP. | +| Testing | **Vitest + React Testing Library**; **Playwright** for two smoke flows | Enough to protect the demo without becoming a test project. | +| Formatting | **Biome** (lint + format) | One tool, no ESLint/Prettier config negotiation. | + +**Budget: ≤ 250 KB gzipped JS, ≤ 30 KB CSS, LCP < 1.0s on localhost.** Enforced +in CI (§16.4). + +### 0.4 What the frontend must never do + +- Never call an endpoint not listed in §10.1. +- Never compute a verdict, a sigma, or a state. **The backend is the only source + of judgment.** The frontend formats `Verdict` fields; it never derives them. +- Never render `Verdict.sentence` reworded. When the sentence is shown, it is + shown verbatim. +- Never invent a color, radius, duration, or spacing value outside §2/§3. + +--- + +## 1. Product framing for the UI + +The backend emits four states. The UI's entire job is to make **`STEADY` feel +like proof of work, not absence of work** — because on demo day and on day 300, +`STEADY` is what's on screen 95% of the time. + +Three consequences that override generic dashboard instincts: + +1. **The health strip is not chrome.** It is the evidence that silence is + monitored silence. It gets real visual weight (§7.1 Zone 3). +2. **`CHANGED` is amber, never red.** Vitals reports change, not failure. Red is + reserved exclusively for Vitals' own errors. +3. **Honesty fields are first-class UI.** `falsifier`, `caveats`, and + `inconclusive_reason` render at the same visual weight as the sigma values — + never in a collapsed "details" section. + +--- + +## 2. Design system — frozen + +All tokens live in `src/styles/tokens.css` as CSS custom properties on `:root`. +**Light theme only.** No `prefers-color-scheme` handling. No purple, anywhere, +ever — including hover tints, chart series, and focus rings. + +### 2.1 Color — neutrals + +Warm-grey neutral ramp (warmer than pure grey; reads as paper, not steel). + +| Token | Hex | Use | +|---|---|---| +| `--color-canvas` | `#FBFBFA` | Page background | +| `--color-surface` | `#FFFFFF` | Cards, drawer, popover, table rows | +| `--color-surface-subtle` | `#F7F7F6` | Table header, feed row hover, inset panels | +| `--color-surface-inset` | `#F1F1EF` | Code blocks, JSON viewer, skeleton base | +| `--color-surface-raised` | `#FFFFFF` | Dropdowns, tooltips (with shadow-lg) | +| `--color-border-subtle` | `#EDEDEA` | Row dividers, internal card rules | +| `--color-border` | `#E2E2DE` | Default card and input border | +| `--color-border-strong` | `#CBCBC5` | Input hover, active dividers | +| `--color-text` | `#18181B` | Primary text, numbers | +| `--color-text-secondary` | `#57575F` | Labels, secondary copy | +| `--color-text-tertiary` | `#8A8A92` | Timestamps, hints, units | +| `--color-text-disabled` | `#B6B6BC` | Disabled labels | +| `--color-overlay` | `rgba(24,24,27,0.32)` | Drawer/modal scrim | + +### 2.2 Color — accent + +Deep confident blue. Used for interactive affordance only, never for status. + +| Token | Hex | +|---|---| +| `--color-accent` | `#1A56DB` | +| `--color-accent-hover` | `#1546B4` | +| `--color-accent-active` | `#113A96` | +| `--color-accent-subtle` | `#EBF1FE` | +| `--color-accent-border` | `#C3D6FB` | +| `--color-accent-text` | `#1546B4` | + +### 2.3 Color — status (maps 1:1 to `VerdictState`) + +Hues match backend §9; tuned for light-theme contrast. Each state has four roles: +`dot` (solid indicator), `text`, `bg`, `border`. + +| State | dot | text | bg | border | +|---|---|---|---|---| +| **STEADY** (success) | `#16A34A` | `#146C33` | `#F971FD`→ **`#F1FDF4`** | `#BBF0CC` | +| **CHANGED** (warning) | `#F59E0B` | `#96590C` | `#FFFAEB` | `#FBE3A6` | +| **INCONCLUSIVE** (info) | `#3B82F6` | `#1D4ED8` | `#EFF5FF` | `#C2D8FC` | +| **WARMING** (neutral) | `#8A8A92` | `#57575F` | `#F5F5F3` | `#E2E2DE` | +| **ERROR** (Vitals fault only) | `#DC2626` | `#A81E1E` | `#FEF2F2` | `#F8CFCF` | + +`STEADY` bg is `#F1FDF4`. (The strikethrough above is intentional in the source +table only to make the correction unmissable — implement `#F1FDF4`.) + +**Rule:** `--color-error-*` may only style Vitals' own failures — API unreachable, +store error, console degraded. A `CHANGED` verdict is never red. + +### 2.4 Color — chart palette + +Categorical, colorblind-safe, no purple. Use in this order. + +| # | Token | Hex | Reserved meaning | +|---|---|---|---| +| 1 | `--chart-1` | `#1A56DB` | behavior sigma | +| 2 | `--chart-2` | `#0E9F6E` | cost sigma | +| 3 | `--chart-3` | `#F59E0B` | threshold / annotation | +| 4 | `--chart-4` | `#0891B2` | samples (n) | +| 5 | `--chart-5` | `#C2410C` | velocity ratio | +| 6 | `--chart-6` | `#64748B` | baseline / reference | + +Grid `#EDEDEA`. Axis text `--color-text-tertiary`. Threshold band fill +`rgba(245,158,11,0.08)`. + +### 2.5 Spacing + +4px base. **Only these values may appear.** + +`--space-0: 0` · `1: 4px` · `2: 8px` · `3: 12px` · `4: 16px` · `5: 20px` · +`6: 24px` · `8: 32px` · `10: 40px` · `12: 48px` · `16: 64px` · `20: 80px` + +### 2.6 Radius + +`--radius-sm: 4px` (badges, dots) · `--radius-md: 6px` (buttons, inputs) · +`--radius-lg: 10px` (cards, drawer) · `--radius-xl: 14px` (hero card) · +`--radius-full: 9999px` (pills, avatars) + +### 2.7 Shadows + +Very subtle. Two-layer (contact + ambient). No colored shadows. + +| Token | Value | +|---|---| +| `--shadow-xs` | `0 1px 2px rgba(24,24,27,0.04)` | +| `--shadow-sm` | `0 1px 3px rgba(24,24,27,0.06), 0 1px 2px rgba(24,24,27,0.04)` | +| `--shadow-md` | `0 4px 12px rgba(24,24,27,0.07), 0 1px 3px rgba(24,24,27,0.05)` | +| `--shadow-lg` | `0 12px 28px rgba(24,24,27,0.10), 0 2px 6px rgba(24,24,27,0.05)` | +| `--shadow-xl` | `0 24px 56px rgba(24,24,27,0.14), 0 4px 10px rgba(24,24,27,0.06)` | + +Cards use `--shadow-xs` at rest, `--shadow-sm` on hover. Drawer `--shadow-xl`. +Dropdown/tooltip `--shadow-lg`. + +**Gradients:** exactly two are permitted, both effectively invisible: +(a) hero card background `linear-gradient(180deg,#FFFFFF 0%,#FDFDFC 100%)`; +(b) feed bottom fade-to-canvas, 40px. No others. + +### 2.8 Typography + +Families: `--font-sans: "Inter var", -apple-system, "Segoe UI", sans-serif` · +`--font-mono: "JetBrains Mono", ui-monospace, "SF Mono", monospace`. + +**All numbers, sigma values, IDs, timestamps, and code use `--font-mono` with +`font-variant-numeric: tabular-nums`.** Non-negotiable — it is what makes a +polling UI stop twitching. + +| Token | Size / Line height | Weight | Tracking | Use | +|---|---|---|---|---| +| `--text-display` | 32/40 | 600 | -0.02em | Hero state word (`CHANGED`) | +| `--text-h1` | 24/32 | 600 | -0.015em | Page titles | +| `--text-h2` | 18/26 | 600 | -0.01em | Card titles, section heads | +| `--text-h3` | 15/22 | 600 | -0.005em | Sub-sections, drawer groups | +| `--text-body` | 14/22 | 400 | 0 | Default copy | +| `--text-body-md` | 14/22 | 500 | 0 | Emphasized copy, buttons | +| `--text-sm` | 13/20 | 400 | 0 | Table cells, feed rows | +| `--text-xs` | 12/18 | 500 | 0.005em | Labels, badges, health strip | +| `--text-micro` | 11/16 | 500 | 0.02em | Uppercase eyebrows, axis ticks | +| `--text-mono-lg` | 20/28 | 600 | -0.01em | Sigma values in hero | +| `--text-mono` | 13/20 | 400 | 0 | IDs, JSON, code | +| `--text-mono-sm` | 12/18 | 400 | 0 | Timestamps, trace ids in feed | + +Eyebrow labels: `--text-micro`, `text-transform: uppercase`, +`color: --color-text-tertiary`. + +### 2.9 Icons + +lucide-react, stroke width **1.5**, sizes **14 / 16 / 20 / 24** only. +14 in badges and feed rows · 16 default (buttons, inline) · 20 section headers · +24 empty-state illustrations. Icons are always `aria-hidden` unless they are the +sole content of a control, which then requires `aria-label`. + +Fixed icon assignments (never substitute): +`STEADY`→`CircleCheck` · `CHANGED`→`Activity` · `INCONCLUSIVE`→`CircleHelp` · +`WARMING`→`LoaderCircle` · error→`TriangleAlert` · caveat→`Info` · +falsifier→`GitCompareArrows` · release→`Tag` · unattributed→`CircleDashed` · +runaway→`Flame` · trace→`ExternalLink` · copy→`Copy` · search→`Search` · +filter→`ListFilter` · close→`X` · expand→`ChevronDown`. + +### 2.10 Layout constants + +`--layout-max: 1120px` · `--layout-gutter: 24px` (mobile 16px) · +`--header-height: 56px` · `--drawer-width: 560px` · +`--focus-ring: 0 0 0 2px #FFFFFF, 0 0 0 4px var(--color-accent)`. + +--- + +## 3. Motion system — frozen + +### 3.1 Durations & easing + +| Token | Value | Use | +|---|---|---| +| `--dur-instant` | 80ms | Color/opacity on hover | +| `--dur-fast` | 140ms | Buttons, badges, small transforms | +| `--dur-base` | 200ms | Cards, tooltips, tab indicator | +| `--dur-slow` | 300ms | Drawer, modal, route transitions | +| `--dur-slower` | 460ms | Number count-up, chart draw-in | + +| Token | Curve | Use | +|---|---|---| +| `--ease-out` | `cubic-bezier(0.22, 1, 0.36, 1)` | **Default.** Anything entering or expanding. | +| `--ease-in` | `cubic-bezier(0.5, 0, 0.75, 0)` | Exits only | +| `--ease-inout` | `cubic-bezier(0.65, 0, 0.35, 1)` | Position changes both directions | +| `--ease-spring` | spring `{stiffness: 380, damping: 32, mass: 0.9}` | Drawer, hero state change, toast | + +**Never** use `linear` except for the indeterminate spinner and progress shimmer. + +### 3.2 Named animations + +| Name | Behavior | +|---|---| +| **Route transition** | Outgoing `opacity 1→0` 100ms `--ease-in`; incoming `opacity 0→1, translateY 6px→0` 200ms `--ease-out`, 60ms delay. No horizontal slide. | +| **Card hover** | `box-shadow xs→sm` + `translateY 0→-1px`, 140ms `--ease-out`. Exit 200ms. | +| **Button press** | `scale 1→0.975`, 80ms. Release springs back over 140ms. | +| **Badge state change** | Old badge `opacity→0, scale→0.94` 100ms; new `opacity 0→1, scale 1.06→1` 180ms `--ease-out`. Crossfade in place — badge never reflows. | +| **Hero state change** | Whole card: border+bg color 300ms `--ease-inout`; state word crossfades per Badge rule; sigma bars re-animate (below); a single 600ms ring pulse (`box-shadow 0 0 0 0 → 0 0 0 8px` of the state color at 12% alpha, fading to 0). Fires **once** per state transition, never on refresh. | +| **Sigma bar fill** | `scaleX 0→value` from left origin, 460ms `--ease-out`, staggered 60ms per bar. Re-animates only when the value changes by ≥0.1σ. | +| **Number count-up** | Sigma and cost numbers tween over 460ms `--ease-out` when they change. Integers ≤999 tween; larger values snap. `n=` counts up. Never tweens on first mount — first paint is the final value. | +| **Feed row enter** | New rows: `opacity 0→1, translateY -8px→0` 200ms `--ease-out`. Existing rows shift down with `layout` animation 200ms. Max 3 stagger steps of 40ms; beyond that, all at once. | +| **Drawer** | Panel `translateX 100%→0` with `--ease-spring`; scrim `opacity 0→1` 200ms. Exit: panel `translateX 0→100%` 240ms `--ease-in`, scrim 180ms. | +| **Modal** | `opacity 0→1, scale 0.97→1, translateY 8px→0` 200ms `--ease-out`. Exit 140ms `--ease-in`, no translate. | +| **Toast** | Enter from bottom-right: `translateY 16px→0, opacity 0→1, scale 0.96→1` `--ease-spring`. Exit `opacity→0, translateX 16px` 160ms. Stacked toasts shift with 200ms layout animation. | +| **Tooltip** | Delay 400ms open / 80ms close. `opacity 0→1, scale 0.96→1, translateY 4px→0` 140ms `--ease-out`. Zero delay when moving between adjacent tooltip triggers within 300ms. | +| **Dropdown/popover** | `opacity 0→1, scale 0.97→1` 140ms `--ease-out`, transform-origin at the trigger edge. Exit 100ms. | +| **Accordion** | `height auto→0` measured, 220ms `--ease-inout`; content `opacity` 140ms, 40ms delay on open. | +| **Tab indicator** | Underline slides via `layoutId`, 220ms `--ease-inout`. | +| **Skeleton shimmer** | Background sweep `translateX -100%→100%`, 1400ms linear, infinite. | +| **Spinner** | `rotate 360deg` 700ms linear infinite. Only appears after 400ms of pending. | +| **Chart draw-in** | Sparkline path `stroke-dashoffset` full→0 over 460ms `--ease-out`, once per mount. Points fade in at 60% of the sweep. | +| **Live pulse** | Health-strip "live" dot: `opacity 1→0.35→1` 2000ms `--ease-inout` infinite. Turns solid grey and stops when polling is paused or failing. | +| **Copy confirm** | Icon swaps `Copy`→`Check` for 1200ms with an 80ms scale pop, then swaps back. | +| **Scroll reveal** | **None.** No scroll-triggered animation anywhere. Content is present when painted. | + +### 3.3 Reduced motion + +Under `prefers-reduced-motion: reduce`: +- All durations → **0ms** except opacity fades, which clamp to 100ms. +- No transform animation (no slide, scale, spring). Drawer and modal appear + instantly with a 100ms fade. +- No count-up; numbers snap. +- No shimmer, no live pulse, no chart draw-in, no ring pulse. +- Spinner is replaced by a static `Loading…` label. + +Implement via a `useReducedMotion()` hook that gates Motion props, **plus** a +global CSS media query as a backstop. Both, not either. + +--- + +## 4. Information architecture + +### 4.1 Routes + +| Path | Screen | Data | +|---|---|---| +| `/` | Console | verdicts, scopes, health | +| `/v/:verdictId` | Console **+ Verdict drawer open** | + verdict detail | +| `/scopes` | Scopes | scopes, health | +| `/about` | Blind spots & About | none (static) | +| `*` | Not found | none | + +**The verdict drawer is a route, not local state.** `/v/:id` renders the console +underneath with the drawer open, so verdicts are shareable and back/forward work. +Closing the drawer navigates to `/` (or the previous list route) preserving query +params. + +### 4.2 URL state (query params — all on `/`) + +| Param | Values | Default | +|---|---|---| +| `state` | `steady,changed,inconclusive,warming` (comma-joined multi) | unset = all | +| `service` | service name | unset = all | +| `version` | version string | unset = all | +| `q` | free-text search over sentence, version, verdict_id, trace_id | unset | +| `sort` | `newest` \| `oldest` \| `sigma` | `newest` | +| `paused` | `1` | unset | + +URL is the single source of truth for filters. Reading query params happens in +one hook (`useVerdictFilters`); no component reads `useSearchParams` directly. + +### 4.3 Navigation + +Single top header, 56px, `--color-surface`, `--shadow-xs`, sticky. + +- **Left:** wordmark `vitals` (`--text-h2`, mono, `--color-text`) + a small state + dot reflecting the *most severe live scope state*. Links to `/`. +- **Center:** tabs — `Console` (`/`) · `Scopes` (`/scopes`). +- **Right:** search field (⌘K / Ctrl-K) · pause/resume polling toggle · + `About` link (`/about`). + +**No sidebar. No breadcrumbs.** The hierarchy is two levels deep; breadcrumbs +would be decoration. + +### 4.4 Filtering, sorting, pagination + +- **Filtering:** client-side over the fetched verdict list. State filter is a + segmented multi-select of four chips; service/version are dropdowns populated + from the fetched data. +- **Sorting:** `newest` (default) · `oldest` · `sigma` (by + `max(|behavior_sigma|, |cost_sigma|)` desc, nulls last). +- **Pagination: none.** The API returns ≤50 (`limit=50`) and the store retains + 1000. The feed renders all fetched rows with **windowed rendering above 120 + rows** (fixed 44px row height, 8-row overscan). Infinite scroll and page + controls are both explicitly excluded — the dataset is bounded and recency- + ordered. + +### 4.5 Search (⌘K) + +An inline expanding field in the header, **not** a modal palette. Rationale: it +searches one list; a full command palette implies commands, and this UI has none. + +- ⌘K / Ctrl-K focuses it; `Esc` clears and blurs. +- Debounce 150ms, writes to `?q=`. +- Matches case-insensitively against `sentence`, `version`, `service_name`, + `verdict_id`, and exemplar `trace_id`. +- Matched substrings highlight with `--color-accent-subtle` background. +- Shows `N results` in `--text-xs` `--color-text-tertiary` while active. + +--- + +## 5. API integration + +### 5.1 Endpoints (the complete set — nothing else exists) + +| Key | Endpoint | Poll | Notes | +|---|---|---|---| +| `verdicts` | `GET /api/verdicts?limit=50` | **2s** | Newest first. Drives hero + feed. | +| `verdict` | `GET /api/verdicts/:id` | on demand, `staleTime: Infinity` | Verdicts are immutable once written — never refetch. | +| `scopes` | `GET /api/scopes` | **5s** | Warming progress, live state. | +| `health` | `GET /api/health` | **10s** | Health strip. | + +**No mutations exist.** Therefore: **no optimistic updates.** Anything that looks +like a write (pin, dismiss, filter, pause) is local UI state persisted to +`localStorage` — §6.4. + +### 5.2 Polling strategy + +- `refetchInterval` per the table above; `refetchOnWindowFocus: true`; + `refetchIntervalInBackground: false`. +- **Pause when `document.hidden`**, resume with an immediate refetch on visibility + return. A backgrounded demo laptop must not burn requests. +- **Manual pause** (`?paused=1`, header toggle, or `Space` when the feed has + focus) stops all polling and shows a `Paused` pill in the header. Used when a + presenter wants the screen to hold still. +- **Never poll while the drawer is open on a verdict detail** — the underlying + list keeps polling, but the drawer's own query is `staleTime: Infinity`. + +### 5.3 Errors and retries + +- Retry `3` times with backoff `min(1000 * 2^attempt, 8000)`. +- On the **first** failure: keep showing last-good data; the health-strip live dot + turns grey and a `Reconnecting…` label appears. **No toast.** Transient blips + during a demo must not throw UI. +- After **3 consecutive** failed cycles: show a persistent error banner below the + header (§7.5) with `Retry now`. Data stays visible, dimmed to 60% opacity. +- On recovery: banner exits, one toast `Reconnected`, live dot resumes pulsing. +- `404` on `/api/verdicts/:id` → drawer shows its not-found state (§7.4), does not + retry. +- All network errors are typed as `{status, message, endpoint}` and surfaced with + the endpoint name in the banner — a developer tool should say which call failed. + +### 5.4 Caching + +- `staleTime`: verdicts `1500ms`, scopes `4000ms`, health `8000ms`, verdict + detail `Infinity`. +- `gcTime`: `5min` for lists, `30min` for verdict details. +- `structuralSharing: true` (default) — critical, it is what keeps unchanged feed + rows from re-rendering and re-animating on every 2s poll. +- **Seed the detail cache from the list.** When the feed has a verdict, opening + its drawer renders immediately from `setQueryData` while the full record loads. + +### 5.5 Offline + +`navigator.onLine === false` → header shows an `Offline` pill, polling suspends, +last-good data remains fully interactive (filters, sort, search, drawer all work +against cache). On `online`, refetch everything immediately. No service worker; +no offline persistence beyond the in-memory query cache. + +--- + +## 6. State management + +### 6.1 Server state +TanStack Query only. **No verdict data is ever copied into React state or a +store.** Components read from `useVerdicts()`, `useVerdict(id)`, `useScopes()`, +`useHealth()`. + +### 6.2 URL state +Filters, sort, search, pause (§4.2). Owned by `useVerdictFilters()`. + +### 6.3 Local component state +Hover, focus, open/closed accordions, copy-confirm timers. Nothing else. + +### 6.4 Persisted state (`localStorage`, key prefix `vitals.console.`) + +| Key | Value | Purpose | +|---|---|---| +| `vitals.console.density` | `comfortable` \| `compact` | Feed row density | +| `vitals.console.lastSeenVerdictId` | string | Powers the "N new" pill after a pause | +| `vitals.console.sigmaFormat` | `sigma` \| `raw` | Dev escape hatch; default `sigma` | + +Reads are wrapped in try/catch with defaults — a locked-down browser must not +break the app. + +### 6.5 Derived state (memoized selectors in `src/features/verdicts/selectors.ts`) + +`latestVerdict` · `filteredVerdicts` · `sortedVerdicts` · `verdictCounts` (per +state) · `mostSevereScopeState` (for the header dot: CHANGED > INCONCLUSIVE > +WARMING > STEADY) · `hasAnyData`. + +**No global store (no Redux/Zustand/Jotai).** With four read-only endpoints and +URL-owned filters, a store would be pure ceremony. + +--- + +## 7. Screens + +### 7.1 Console (`/`) + +Single column, `max-width: 1120px`, centered, `padding: 32px 24px 80px`. +Three zones, in order, gap `--space-8` (32px). + +#### Zone 1 — Hero Verdict Card + +The Release Report Card. Renders `latestVerdict`. + +Container: `--radius-xl`, 1px border in the state's `border` color, background = +gradient (a) from §2.7 over the state's `bg` color at 40% blend, `--shadow-sm`, +`padding: 28px 32px`. + +Internal layout, top to bottom: + +1. **Header row** (flex, space-between, align baseline) + - Left: `StatusDot` (10px) + state word in `--text-display`, in the state's + `text` color. Beside it, flag chips: `behavior`, `cost`, `runaway` — + `Badge` size `sm`, only those that are true. + - Right: `service_name` in `--text-body-md`, then `·`, then `version` in + `--font-mono`. `--color-text-secondary`. +2. **Subject line** — `--text-sm`, `--color-text-secondary`, `margin-top: 4px`. + Format: `{subject} · {version} vs {baseline_version}` or `{subject} · {version}` + when there is no baseline. +3. **Sigma meters** — `margin-top: 24px`, two rows, gap 12px. Each row is a + 3-column grid: label (88px, `--text-xs`, tertiary) · value + (`--text-mono-lg`, signed, 1 decimal, `+4.2σ`) · bar (flex, 8px tall, + `--radius-full`, track `--color-surface-inset`). + - Bar scale: **fixed domain 0→6σ**, clamped, with a 1px threshold tick at 3σ + in `--chart-3`. Fixed domain matters — a rescaling axis makes two verdicts + visually incomparable. + - Fill color: `--chart-1` for behavior, `--chart-2` for cost. When + `|z| < 1.0`, fill is `--color-text-tertiary` and the trailing label reads + `flat`. + - Trailing hint: `normal ±1σ` in `--text-micro`, tertiary. +4. **Attribution line** — `margin-top: 20px`, `--text-sm`. Icon (`Tag` for + release, `CircleDashed` for unattributed, `Flame` for runaway) + text. + Release: `onset 14:32:07 — 90s after v2 deployed`. + Unattributed: `cause unattributed — no release in the last 5m`. +5. **Counts line** — `--text-xs`, tertiary, mono numbers: + `n=1240 · baseline v1 (n=30)`. +6. **Caveats** (only when non-empty) — `margin-top: 16px`, inset block: + `--color-surface-subtle`, `--radius-md`, `padding: 10px 12px`, `Info` icon 14, + `--text-sm`. Comma-joined caveats. +7. **Falsifier** — **always rendered**, same block styling as caveats, + `GitCompareArrows` icon, `--color-text-secondary`. This is a trust surface; it + never collapses and never hides. +8. **Evidence** — `margin-top: 24px`, eyebrow `EVIDENCE`, then one `ExemplarRow` + per exemplar. Worst rows first, **median row always last and always present**. + Each row: kind chip (`worst` amber-subtle / `median` neutral) · mono trace id + truncated to 6 chars with copy-on-click · signed sigma · output excerpt + (single line, `text-overflow: ellipsis`, `--color-text-secondary`) · + `ExternalLink` icon that opens the SigNoz trace URL in a new tab. + Row hover: `--color-surface-subtle`, 80ms. Click anywhere → opens the drawer. +9. **Footer** — `margin-top: 20px`, `border-top: 1px --color-border-subtle`, + `padding-top: 12px`. Left: relative timestamp (`14s ago`, live-updating every + second, `title` = absolute ISO). Right: `View full record →` link to `/v/:id`. + +**Warming variant:** replaces zones 3–8 with a `ProgressBar` (§8.14), +`collecting reference 340/1000`, `est. 22m`, and the copy *"Vitals is +establishing a healthy baseline. No verdict will be issued until it has one."* +Neutral colors throughout. + +**Inconclusive variant:** state word `INCONCLUSIVE`, and the reason renders as a +prominent sentence directly beneath it in `--text-h3`, e.g. *"Your traffic +changed, not your model."* Sigma meters still render, plus a third greyed meter +for `input` if the backend supplied it. The falsifier block stays. + +- **Loading:** `HeroCardSkeleton` — exact same geometry, shimmer blocks. +- **Empty (no verdicts yet, backend healthy):** `EmptyState` with `Activity` icon + 24, title *"No verdicts yet"*, body *"Vitals is listening. Send traffic through + your collector and the first verdict appears here."*, and a mono hint line with + the receiver port from `/api/health`. +- **Error:** card shows the error variant — `TriangleAlert`, *"Can't reach the + Vitals API"*, endpoint name, `Retry now` button. + +#### Zone 2 — Verdict Feed + +Header row: title `Verdicts` (`--text-h2`) + count pill · right side: +`StateFilterChips`, `SortDropdown`, `DensityToggle`. + +Filter chips: four `ToggleChip`s (`Steady` `Changed` `Inconclusive` `Warming`), +each with its state dot and a count. Multi-select; all-off means all-on. + +Rows: `44px` comfortable / `36px` compact. Columns, left to right: +time (mono-sm, 72px, tertiary) · `StatusDot` (8px) · state word (`--text-xs` +uppercase, state text color, 96px) · sentence (flex, single line, ellipsis, +`--text-sm`) · sigma pair (mono-sm, right-aligned, 104px) · `ChevronDown` +(rotates 180° when expanded, 200ms). + +- Row hover: `--color-surface-subtle` background, 80ms; `ChevronDown` fades + tertiary→secondary. +- **Click expands inline** (accordion, §3.2) showing a compact receipt: subject, + cause, caveats, falsifier, and up to two exemplars. **Cmd/Ctrl-click or the + `View full record` link opens the drawer** at `/v/:id`. Rationale: inline + expansion is for scanning; the drawer is for reading. +- New rows animate in per §3.2. When the feed is scrolled away from the top and + new verdicts arrive, a floating `N new` pill appears at the top center + (`--shadow-md`, spring in); clicking scrolls to top and clears it. +- Zebra striping: none. Dividers: 1px `--color-border-subtle` between rows. + +- **Loading:** 6 `FeedRowSkeleton`s. +- **Empty (filters exclude everything):** inline `EmptyState`, `ListFilter` icon, + *"No verdicts match these filters"*, `Clear filters` ghost button. +- **Empty (no data at all):** the feed section is hidden entirely; the hero + card's empty state carries the message. + +#### Zone 3 — Health Strip + +Not chrome (§1). Full-width card, `--radius-lg`, `--color-surface`, 1px border, +`padding: 16px 20px`. + +Left: `LivePulseDot` + `Live` / `Paused` / `Reconnecting…` / `Offline`. +Center: six `MetricChip`s, `--font-mono` values with `--text-xs` uppercase +labels — `spans received` · `scored` · `skipped` · `scopes` · `verdicts` · +`emit errors`. Values count up (§3.2). `emit errors` chip turns to the error +palette when `> 0`. +Right: `uptime` and `vitals v{version}`, tertiary. +Footer line: `Known blind spots →` linking to `/about`. Required by backend §20.8. + +Skipped-spans chip shows a tooltip: *"Spans that weren't GenAI or couldn't be +mapped. A non-zero value is normal."* — pre-empting the most common false alarm +about Vitals itself. + +#### Keyboard (Console) + +| Key | Action | +|---|---| +| `⌘K` / `Ctrl-K` | Focus search | +| `/` | Focus search (when not in an input) | +| `j` / `↓` | Next feed row | +| `k` / `↑` | Previous feed row | +| `Enter` | Expand/collapse focused row | +| `o` | Open focused row in drawer | +| `Space` | Toggle polling pause | +| `Esc` | Clear search → clear filters → blur (in that order) | +| `1`–`4` | Toggle state filter chips | +| `?` | Open shortcuts modal | + +Focused feed row shows a 2px `--color-accent` left border and +`--color-surface-subtle` background. + +#### Responsive (Console) + +- **Desktop ≥1280px:** as described, 1120px column. +- **Laptop 1024–1279px:** identical, gutters 24px, container fluid. +- **Tablet 768–1023px:** hero sigma meters stack label-above-bar; feed drops the + sigma-pair column (moves into the expanded row); filter chips scroll + horizontally with a fade mask. +- **Mobile <768px:** hero padding `20px 16px`, state word `--text-h1`; feed rows + become two-line (line 1: time + state + sigma; line 2: sentence); health strip + chips wrap to a 2-column grid; header tabs collapse to an icon-only segmented + control; search becomes a full-width row beneath the header when focused; + **drawer becomes a bottom sheet** (§7.4). + +### 7.2 Scopes (`/scopes`) + +Answers *"is Vitals watching, and how far along is it?"* + +Layout: page title `Scopes` + subtitle *"What Vitals is currently watching."* +Then a responsive grid of `ScopeCard`s — 2 columns ≥1024px, 1 below. + +`ScopeCard` (`--radius-lg`, `--shadow-xs`, `padding: 20px`): +- Header: `service_name` (`--text-h3`) + state `Badge`. +- Meta row: `gen_ai.system` · `model` — mono, tertiary, `--text-xs`. +- Body when **warming**: `ProgressBar` with `have/need`, phase label + (`collecting reference` / `calibrating`), and est. time remaining. +- Body when **live**: a 4-row signal table — `behavior`, `input`, `cost`, + `length` — each with `μ`, `σ`, and a `calibrated` check. Mono, tabular. +- Footer: versions seen, as `Badge`s; the active one filled, prior ones outline. +- Click → navigates to `/?service={name}` (filters the console to that scope). + +Loading: 4 `ScopeCardSkeleton`s. Empty: `EmptyState`, `Search` icon, *"No scopes +yet"*, body *"A scope appears once Vitals sees its first GenAI span."* +Error: same pattern as Console. + +Keyboard: `Tab` through cards; `Enter` activates. Responsive: 2→1 column at +1024px; signal table becomes label/value pairs below 768px. + +### 7.3 About / Blind Spots (`/about`) + +Static, no API. Prose column, `max-width: 720px`. + +Sections, in order: **What Vitals claims** · **What Vitals does not claim** · +**Known blind spots** (the four from the critique: subtle factual degradation, +uniform degradation, baseline poisoning, deploy-during-warming) · **How to read a +verdict** (annotated static example of the sentence grammar) · **Version & build** +(from `/api/health`). + +Each blind spot is an `AlertCallout` variant `info` with a title and two-sentence +body. Typography-led, no cards, generous `--space-8` between sections. + +This screen exists because "we publish our blind spots" is a product claim, and a +claim without a URL is marketing. + +### 7.4 Verdict Drawer (`/v/:verdictId`) + +Right-anchored panel, `--drawer-width: 560px`, full height, `--color-surface`, +`--shadow-xl`, `--radius-lg` on the left corners only. Scrim `--color-overlay`. + +Header (sticky, 64px, bottom border): `StatusDot` + state word + flag chips · +right: `Copy JSON` icon button, `X` close. + +Body (scrollable, `padding: 24px`), sections separated by 1px rules: + +1. **Sentence** — verbatim `Verdict.sentence`, `--font-mono`, `--text-mono`, + in a `--color-surface-inset` block, `--radius-md`, `padding: 12px`, wrapping. + Copy button top-right on hover. +2. **Judgment** — definition grid (label left 140px, value right, mono): + state, subject, cause, flags, runaway. +3. **Evidence** — full-size sigma meters (same component as hero) plus + `cost_usd_per_req` vs `baseline_cost_usd_per_req` and `velocity_ratio`. +4. **Timing** — `ts_unix` absolute + relative, `onset_ts_unix`, + `seconds_after_deploy`, `samples`, `baseline_samples`. +5. **Honesty** — `falsifier` and `caveats` as `AlertCallout`s. Always present. +6. **Exemplars** — full `ExemplarCard` list: kind chip, trace id (full, mono, + copyable), sigma, **full excerpt in a `--color-surface-inset` block** (wrapped, + not truncated), and an `Open trace in SigNoz` button. +7. **Raw record** — `JsonViewer` (§8.20), collapsed to depth 1 by default. + +Footer (sticky): `verdict_id` mono with copy · `Prev` / `Next` buttons that walk +the currently filtered feed order. + +- **Open:** §3.2 drawer animation. Focus moves to the header close button. Body + scroll locked. Focus trapped. +- **Close:** `Esc`, scrim click, `X`, or browser back. Focus returns to the + originating feed row. +- **Keyboard:** `Esc` close · `j`/`k` prev/next verdict · `c` copy JSON · + `Tab` cycles within the trap. +- **Loading:** skeleton mirroring the section geometry; if seeded from the list + cache (§5.4), sections 1–4 render immediately and only 6–7 skeleton. +- **Not found (404):** `CircleHelp` 24, *"Verdict not found"*, body *"It may have + been pruned by retention."*, `Back to console` button. +- **Mobile <768px:** becomes a **bottom sheet** — full width, `max-height: 92vh`, + `--radius-lg` top corners, enters with `translateY 100%→0` `--ease-spring`, + drag-to-dismiss below 120px threshold, and a 36px grab handle. + +### 7.5 Global elements + +- **Error banner** — below header, full width, `--color-error-bg`, 1px + `--color-error-border`, `TriangleAlert` 16, message with endpoint name, + `Retry now` ghost button. Slides down 200ms `--ease-out`. +- **Shortcuts modal** (`?`) — 480px, two-column key/description list grouped by + Navigation / Feed / Drawer. Modal animation per §3.2. +- **Toasts** — bottom-right, max 3 stacked, 4s auto-dismiss (errors 8s), + hover pauses the timer. Only three ever fire: `Reconnected`, `Copied`, + `Link copied`. +- **404 route** — centered, `CircleHelp` 24, *"Page not found"*, + `Back to console`. + +--- + +## 8. Component library + +Every component lives in `src/components//`. Each defines its own `.module.css`. +All accept `className` and forward refs. **No component may hardcode a color, +radius, duration, or spacing literal** — tokens only. + +Shared states, unless overridden: `default` · `hover` · `active` · `focus-visible` +(always `--focus-ring`) · `disabled` (`opacity: 0.5`, `cursor: not-allowed`, +no hover) · `loading`. + +| # | Component | Variants | Key behavior | +|---|---|---|---| +| 8.1 | **Button** | `primary` (accent fill, white text) · `secondary` (surface, border) · `ghost` (transparent, hover `--color-surface-subtle`) · `danger` (error fill). Sizes `sm` 28px / `md` 32px / `lg` 40px. | Press scale 0.975 (§3.2). `loading` swaps content for spinner at fixed width — the button never resizes. Icon-only requires `aria-label`. | +| 8.2 | **IconButton** | Same variants, square, sizes 28/32/40, radius `md`. | Always has a tooltip and an `aria-label`. | +| 8.3 | **Input** | `default` · `search` (leading icon + clear button) · `error`. Height 32/40. | Border → `--color-border-strong` on hover, `--color-accent` + focus ring on focus. Error shows message below in `--text-xs` error text with `role="alert"`. | +| 8.4 | **Card** | `default` · `interactive` (hover lift) · `inset` (no shadow, subtle bg) | Radius `lg`, border, `--shadow-xs`. Interactive cards are `