←

Engineering Blog

5 min read

Grafana's LGTM Stack — Tempo and Loki Are Starting to Feel Dated

DataBuff is an AI-native APM. It ingests OpenTelemetry and SkyWalking, and ships seven AI capabilities.
GitHub: https://github.com/databufflabs/databuff

Same slow checkout: Grafana needs three systems. DataBuff finishes the path in one.

What you checkGrafana: 3 systems / 3 separate pagesDataBuff: 1 system / 3 linked pages
Metric: who is slowGrafana: Service MapService list
Trace: which hopTempo: trace list, waterfallTracing: drill down from the service page
Log: what happened thenLoki: query by traceIdLogs: open Trace and jump back

On-call, whether those three sit on one path matters more than whether you have all three pillars.

1 · This LGTM: Metric / Trace / Log on three lines

The scene is service-a GET /demo/checkout getting slow. Find who is slow in Metric, then the request and span in Trace, then context in Log. In this stack the three entries are different datasources, with different filters.

Metric · ① Who is slow: metrics-generator → metrics store → Service Map

Tempo stores spans. To draw a service map, metrics-generator aggregates spans into time series, writes them to a separate metrics store, then Grafana can paint the Service Map.

Grafana Service Map
Metric · Service Map (from metrics-generator, not Tempo itself)

Trace · ② Find the request: Explore → Tempo, search the list

Leave Service Map, switch Explore to the Tempo datasource, filter by service / operation for the slow checkout, and copy the traceId.

Grafana Tempo trace search
Trace · Explore → Tempo: different query box, different syntax

Trace · ③ Waterfall: where the time went

Open the trace. See which hop of service-a → service-b → service-c is slow. Still in Tempo. Logs not touched yet.

Grafana Tempo waterfall
Trace · Tempo waterfall: find the slow span

Log · ④ Logs: Explore → Loki, paste the traceId

Log is another line: Explore → Loki, put the traceId into LogQL. If tracesToLogs is not wired, this hop is manual.

Grafana Loki query by traceId
Log · Explore → Loki: LogQL, paste the traceId yourself
Grafana independent datasources
In this stack, Metric, Trace, and Log are separate datasources

This run: four hops, and logs still needed a hand-copied traceId.

2 · DataBuff: same incident, drill down from the service list

Same slow checkout. After OTLP lands in DataBuff, Metric / Trace / Log are already joined. Stay in one product. You do not paste a traceId into a new query language to open logs.

Metric · ① App performance → service list

The service list shows service-a latency, errors, and traffic. Click the name. Metrics and traces share one store — no extra extract from spans.

DataBuff service list
Metric · service health: latency / errors / traffic

Trace · ② Tracing: open the slow waterfall

From the service page, open the 240ms checkout. Middleware spans sit on the same picture. No system switch.

DataBuff trace waterfall
Trace · waterfall + call chain

Log · ③ Logs: Trace on the row, one click back

Each log row has a Trace button. That is the on-call step you skip: copy the id, change the query.

DataBuff logs linked to Trace
Log · logs → trace, same product
DataBuff topology
Topology, service health, and waterfall share one dataset — no extra metrics-generator layer

By here the gap is no longer “can you see the data.” DataBuff still has ask-the-AI and platform health. This LGTM stack did not expose those two entries.

3 · After that path: AI and self-monitoring

After services, traces, and logs, two more things sit on the same menu: ask the data in natural language, and see the platform's own health. Those were the biggest feel differences on this run.

AI · Q&A / inspect / docs — same data you just drilled

Open the AI platform. You do not pick Tempo or Loki first, and you do not write TraceQL / LogQL. The page already has ask-data, inspect, product Q&A, and an ops expert. Sample prompts are concrete: last-hour service list, service-b upstream/downstream, request and error trends.

You still bring your own model. This lab used DeepSeek. The difference is the experts and tools are already in the product, so you do not assemble three datasource contexts first.

DataBuff AI platform
AI platform · ask, inspect, Q&A, ops expert — same menu as Metric / Trace / Log

This Grafana 11.5 does not ship that as a chat entry. To ask the same way you add an LLM plugin, then wire Tempo, Loki, and the metrics store into the model context.

Self-monitoring · deploy status: treat the platform as a business system

Install → Deploy status. One page: ingest TPS, write failures, Doris disk, query failures; legend split by trace / metric / log. Inbound requests, bytes, latency, and outbound drops share one timeline.

DataBuff deploy status: ingest and Doris
Deploy status · ingest overview: 32.9/s in, Doris disk 49%; trace / metric / log on one page

At 2 a.m., “is the app slow, or is the platform stuck?”, this page knocks out a batch: are the three lines still rising, did writes fail, is Doris disk full. In this LGTM stack those checks still mean Tempo, Loki, the metrics store, and Grafana, each on its own page.

LGTM: stop when you can see the data. DataBuff: after that you can still ask, and still see the platform.

What you wantGrafana LGTMDataBuff
Ask “who is slow, what does the topology look like”Write the query yourself; or add an LLM plugin plus data contextAI chat: sample prompts are service list / topology / traffic
An inspect report you can forwardStitch dashboards and alert rulesInspect: the expert reads the same metrics and writes the report
Is the platform itself stuckOpen each component health pageOne deploy-status page: ingest + Doris
Component billTempo + metrics-generator + metrics store + Loki + Grafanaingest + one engine + Web (AI and deploy status included)
4 · How to try: OTLP dual-write, no rip-and-replace

The collector already speaks OTLP. Add a DataBuff exporter in Alloy / Collector, write to Tempo in parallel for a few days, confirm the same spans line up, then drop the Tempo path if you want. The whole thing rolls back.

Walk it once: service health → trace → logs → ask the AI for a service list or topology → deploy status, three ingest lines. LGTM can stay. Just see if this on-call path feels shorter.