DEV Community

Cover image for Is Your Data Quality Good Enough for the AI Era?
databufflabs
databufflabs

Posted on • Originally published at databuff.ai

Is Your Data Quality Good Enough for the AI Era?

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:

  1. Set a four-question bar
  2. Score DataBuff, SkyWalking, Jaeger, Pinpoint, SigNoz, and OpenObserve with the same ruler
  3. 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.

  1. Which API is broken?

    HTTP, DB, and MQ must not share one Span-name pile. Redis GET and checkout POST need separate stats.

  2. Which SQL / which database is slow?

    “MySQL avg 50ms” is not enough — you need the exact statement.

  3. Which page triggered the slow SQL?

    The critical question. Many stacks can’t answer — you’re sent back to hunt the entry by hand.

  4. 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

  1. All six can search traces; the gap is call analysis, service flow, middleware pages.
  2. For humans staring at UI, SkyWalking / Pinpoint often suffice; for AI to answer the four questions, you need that depth.
  3. 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
Enter fullscreen mode Exit fullscreen mode
# 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_apm as a topology node

DataBuff global topology

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 RED metrics

Service list — product face of metric_service

② metric_service_http — Q1

Answers: “Slowest URL? GET or POST? 4xx or 5xx?”

API analysis HTTP typing

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.

Database list

[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.

Service flow path tree

Entry service-a expands downstream with response share

6. End-to-end: slow checkout

  1. Entry healthmetric_service: did service-a error rate / avg latency spike?
  2. Pin the slow APImetric_service_http: confirm url is /demo/checkout
  3. Slow SQL + triggermetric_service_db: rootResource='/demo/checkout' AND isSlow=1
  4. Which hop dragsmetric_service_flow: expand from service-a, compare response share
  5. (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

  1. Run the four questions — if one answer is “dig the traces yourself,” you fail. Chat ≠ troubleshooting.
  2. Check the highlighted matrix rows — call analysis / service flow / middleware pages — especially “slow SQL → entry.”
  3. 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

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)