When AI troubleshooting fails, people blame the Prompt, then the model. More often the problem is upstream: the telemetry you feed the AI is not good enough — APIs, SQL, entrypoints, and hops don’t line up, so even a strong model can only tell you to “go dig the traces yourself.” Same rule as RAG and AI support: bad data, fancy layers don’t help.
How do you know you “pass”? This article does three things:
- Set a four-question bar
- Score DataBuff, SkyWalking, Jaeger, Pinpoint, SigNoz, and OpenObserve with the same ruler
- Show how DataBuff uses 12 fixed
metric_service_*tables to meet that bar
1. A scenario you’ve probably hit
Checkout is slow in production. You plug AI into your APM and ask:
“Why is checkout slow? Which SQL is the bottleneck?”
Fail
“Please open the trace detail, find the root span manually, then correlate the DB span…”
AI becomes a fancy search box — barely better than no AI.
Pass
“Slow on
SELECT … FROM orders, triggered by/checkout; the payment hop has the highest latency.”No raw-trace digging — a direct answer.
In the AI era, data quality wins. Everyone can copy Prompts; a curated metric schema can’t be copied overnight. Bad datasets just make stronger models tell you to dig yourself.
Analogy: raw telemetry is unlabeled video footage; a high-quality dataset is a fixed-column spreadsheet — which API, which SQL, who triggered it — AI can answer from that.
2. The bar: four questions AI must answer
Forget field names. Ask your APM these four (with or without AI) — can it answer directly? That’s the bar.
Which API is broken?
HTTP, DB, and MQ must not share one Span-name pile. Redis GET and checkout POST need separate stats.Which SQL / which database is slow?
“MySQL avg 50ms” is not enough — you need the exact statement.Which page triggered the slow SQL?
The critical question. Many stacks can’t answer — you’re sent back to hunt the entry by hand.Which hop on the call path is dragging?
order → payment → MySQL: traffic and errors per hop — not just a topology thumbnail.
Pass = all four answered directly. If one answer is “go dig the traces yourself,” the dataset fails.
3. App-performance matrix: where the six diverge
Same-environment application performance matrix. Basics (topology / service list / Trace) are common; the highlighted capability rows open the gap: call analysis, service flow, middleware pages.
Legend: ✅ verified · △ entry exists / limited depth · ❌ no equivalent
Versions tested: DataBuff v0.1.4 · SkyWalking 10.4.0 · Jaeger 1.76 · Pinpoint 3.1.0 · SigNoz 0.133 · OpenObserve 0.91-rc1.
| Capability | DataBuff | SkyWalking | Jaeger | Pinpoint | SigNoz | OpenObserve |
|---|---|---|---|---|---|---|
| 1. Global topology | ✅ | ✅ | △ | ✅ | ✅ | ❌ |
| 2. Service list / golden metrics | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ |
| 3. Service-level topology | ✅ | ✅ | △ | ✅ | △ | ❌ |
| 4. Service call analysis | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| 5. Instance golden metrics | ✅ | ✅ | ❌ | △ | ❌ | ❌ |
| 6. Instance topology | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| 7. Instance call analysis | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| 8. API-level topology | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| 9. API call analysis | ✅ | ❌ | ❌ | △ | ❌ | ❌ |
| 10. Service flow | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| 11. Middleware pages (DB / cache / MQ) | ✅ | ❌ | ❌ | △ | ❌ | ❌ |
| 12. Error analysis | ✅ | ❌ | ❌ | △ | ❌ | △ |
| 13. Trace list / search | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 14. Trace detail | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 15. Span ↔ logs | ✅ | ✅ | △ | ❌ | ✅ | ✅ |
| 16. Log list / search | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ |
| 17. Log detail | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ |
| 18. Logs ↔ Trace | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ |
How to read it
- All six can search traces; the gap is call analysis, service flow, middleware pages.
- For humans staring at UI, SkyWalking / Pinpoint often suffice; for AI to answer the four questions, you need that depth.
- Those green cells aren’t extra menus — they’re the backbone of the causality chain: which API, which SQL, who triggered it, which hop dragged.
4. How do you prepare a passing dataset?
Those capabilities aren’t pages bolted on later — incoming spans are written into fixed tables by type. DataBuff ships this as 12 metric_service_* tables.
Spans arrive
↓ Split by type: HTTP / DB / Redis / MQ / RPC… one table each
↓ Freeze key columns: entry API, SQL digest, path hops with the metrics
↓ Query joins the chain; UI grows middleware pages / service flow / call analysis
| # | Table | Stores | Answers |
|---|---|---|---|
| 1 | metric_service |
Service-entry RED | Is this service healthy? |
| 2 | metric_service_trace |
Trace root | End-to-end success and duration |
| 3 | metric_service_http |
HTTP API typing | Which URL / method / status is bad? |
| 4 | metric_service_db |
DB calls | Which SQL is slow, who triggered (entry on same row) |
| 5 | metric_service_flow |
Entry path tree | From entry, which hop drags? |
| 6 | metric_service_rpc |
RPC calls | gRPC / Dubbo method and status |
| 7 | metric_service_redis |
Cache calls | Who issues GET/SET, is it slow? |
| 8 | metric_service_mq |
Messaging | Topic produce/consume, lag |
| 9 | metric_service_remote |
External deps | External API QPS / latency |
| 10 | metric_service_exception |
Entry exceptions | Exception name / code |
| 11 | metric_service_config |
Config reads | Are Nacos / ZK reads slow? |
| 12 | metric_service_instance |
Instance metadata | Pod / host / Java version (JOIN) |
For the four questions, lead with tables 1 / 3 / 4 / 5.
Three words before you query:
-
tag — filter columns (
url,sqlContent,rootResource) -
field — numeric columns (
cnt,sumDuration) -
virtual service — e.g.
[mysql]demo_apmas a topology node
HTTP / DB / MQ / cache typed into topology — from component tables, not one Span-name dump
5. Four questions → which table
| Question | Primary table | Key tags |
|---|---|---|
| Is the service healthy? (warmup) | metric_service |
service, errorType
|
| 1. Which API is broken? | metric_service_http |
url, httpMethod, httpCode
|
| 2. Which SQL is slow? | metric_service_db |
sqlContent, isSlow
|
| 3. Who triggered the slow SQL? | metric_service_db |
rootResource (same row as sqlContent) |
| 4. Which hop drags? | metric_service_flow |
entryInterfacePathId, pathId, parentService
|
① metric_service — warmup
Answers: “service-a QPS, error rate, avg latency today?”
Only entry requests write a row — filter out DB / Redis / MQ spans.
Service list — product face of metric_service
② metric_service_http — Q1
Answers: “Slowest URL? GET or POST? 4xx or 5xx?”
URLs like /demo/checkout as their own rows
③ metric_service_db — Q2 and Q3
Answers: “Which SQL is slow? Which entry triggered it?” — same table, same row.
sqlContent + rootResource on one row is the most important design for the bar: no Trace hunt for the trigger.
[mysql]demo_apm / ES as virtual services
④ metric_service_flow — Q4
Answers: “From service-a entry, how much response each hop contributes?”
The path tree is computed once a Trace is complete — not one hop per arriving Span.
Entry service-a expands downstream with response share
6. End-to-end: slow checkout
-
Entry health —
metric_service: did service-a error rate / avg latency spike? -
Pin the slow API —
metric_service_http: confirmurlis/demo/checkout -
Slow SQL + trigger —
metric_service_db:rootResource='/demo/checkout' AND isSlow=1 -
Which hop drags —
metric_service_flow: expand from service-a, compare response share -
(Optional) which machine — JOIN
metric_service_instance
That’s data quality: filter and aggregate on fixed columns — not guessing Span names, not sending humans back into raw traces.
7. Three-step self-check
- Run the four questions — if one answer is “dig the traces yourself,” you fail. Chat ≠ troubleshooting.
- Check the highlighted matrix rows — call analysis / service flow / middleware pages — especially “slow SQL → entry.”
- If you fail — add fixed columns (entry API, SQL digest) at write time, or switch to a more complete dataset.
Close: In the AI era, ask is your data quality good enough — before Prompts and models. Four questions set the bar; the matrix shows the product surface; the 12 tables are why.
Try DataBuff
Open source · OpenTelemetry · datasets designed for AI querying
- Live Demo: https://demo.databuff.ai
- GitHub: https://github.com/databufflabs/databuff
- Full post: https://databuff.ai/blog/en/trace-metrics-data-quality/
If this helped, leave a ❤️ or a Star on GitHub — and tell us which of the four questions your stack still can’t answer.





Top comments (0)