<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: databufflabs</title>
    <description>The latest articles on DEV Community by databufflabs (@databufflabs).</description>
    <link>https://dev.to/databufflabs</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3993960%2F8b10c56f-bbd4-4580-a8b1-a1e732e4be57.png</url>
      <title>DEV Community: databufflabs</title>
      <link>https://dev.to/databufflabs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/databufflabs"/>
    <language>en</language>
    <item>
      <title>LangGraph: Orchestrate a Swarm of AI Agents with One Graph</title>
      <dc:creator>databufflabs</dc:creator>
      <pubDate>Mon, 24 Aug 2026 02:18:12 +0000</pubDate>
      <link>https://dev.to/databufflabs/langgraph-orchestrate-a-swarm-of-ai-agents-with-one-graph-4b1f</link>
      <guid>https://dev.to/databufflabs/langgraph-orchestrate-a-swarm-of-ai-agents-with-one-graph-4b1f</guid>
      <description>&lt;p&gt;A single AI assistant is already standard in many teams: ask a question, get an answer, like chatting with a seasoned hand. But the moment you want several AIs to work together — &lt;strong&gt;one checks metrics, one digs through logs, one draws the conclusion&lt;/strong&gt; — it falls apart: who hands off to whom? Can they run in parallel? Should it stop and ask you midway? If it crashes halfway, is everything before it wasted?&lt;/p&gt;

&lt;p&gt;LangGraph exists to answer those questions. It's LangChain's open-source multi-agent orchestration framework (MIT). But the essence first: &lt;strong&gt;it is, before anything else, a general-purpose graph execution engine&lt;/strong&gt; — nodes, edges, conditional edges, parallelism, checkpointing, waiting on a human are all generic graph capabilities, with no inherent tie to AI; it just so happens that a node can hold an AI, and once it does, you're "orchestrating multiple AI agents." The core is simply: &lt;strong&gt;you draw the graph, it runs the graph.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This article uses a single case — &lt;strong&gt;a 2 a.m. alert: "order-service error rate spiking"&lt;/strong&gt; — to explain it end to end: the graph first, then the code, then the execution model and context passing, and finally a comparison with Dify and Claude Code's dynamic workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A case: 2 a.m., order-service error rate spikes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your on-call phone buzzes. The alert says order-service error rate just hit 12%, and your AI assistant has to walk the whole investigation flow itself. This graph is the entire logic it will execute:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn8r1oipgy6o96rdc2i1e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn8r1oipgy6o96rdc2i1e.png" alt="langgraph-case-diagram" width="800" height="1158"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fig 1 · A late-night investigation: one graph exercises nodes, edges, conditional edges, Send, interrupt, and checkpoint.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A single run goes roughly like this: the AI &lt;strong&gt;diagnoses&lt;/strong&gt; first, finds it's serious, and &lt;strong&gt;fans out 12 parallel subtasks&lt;/strong&gt; to check instances one by one; after checking, it &lt;strong&gt;summarizes&lt;/strong&gt; "these 3 are bad"; then it &lt;strong&gt;stops and asks whether to restart&lt;/strong&gt; — you approve, and only then does it &lt;strong&gt;execute the fix&lt;/strong&gt;, finally &lt;strong&gt;re-checking and reporting&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This graph uses almost every core capability LangGraph has: &lt;strong&gt;nodes&lt;/strong&gt; (each box), &lt;strong&gt;edges&lt;/strong&gt; (arrows), &lt;strong&gt;conditional edges&lt;/strong&gt; (serious?), &lt;strong&gt;Send&lt;/strong&gt; (batch checks), &lt;strong&gt;interrupt&lt;/strong&gt; (await your approval), &lt;strong&gt;checkpoint&lt;/strong&gt; (persist each step). Let's draw it in code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drawing this graph in code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Build a graph, register each box as a node, connect arrows as edges:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langgraph.graph&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StateGraph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;START&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;END&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;diagnose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;   &lt;span class="c1"&gt;# 1 diagnose: check error rate, pull Trace, return severity
&lt;/span&gt;    &lt;span class="n"&gt;error_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;query_error_rate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;service&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;abnormal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;error_rate&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fan_out&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;    &lt;span class="c1"&gt;# 3 batch check: Send dispatches 12 subtasks at once
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;check_host&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;host&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hosts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check_host&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="c1"&gt;# 4 check one instance (each Send is its own small task)
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;results&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;host&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: ok&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ask_human&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;  &lt;span class="c1"&gt;# 5 await your approval
&lt;/span&gt;    &lt;span class="n"&gt;decision&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;interrupt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3 bad instances found — auto-restart?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;decision&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;decision&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;        &lt;span class="c1"&gt;# 6 execute the fix
&lt;/span&gt;    &lt;span class="nf"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hosts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;     &lt;span class="c1"&gt;# 7 produce the report
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;report&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;handled&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StateGraph&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;diagnose&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;diagnose&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;          &lt;span class="c1"&gt;# register nodes
&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fan_out&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fan_out&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;check_host&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check_host&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ask_human&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ask_human&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fix&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fix&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;report&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;report&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;START&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;diagnose&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;             &lt;span class="c1"&gt;# start -&amp;gt; diagnose
&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_conditional_edges&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;diagnose&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;# 2 conditional edge: serious? -&amp;gt; fan_out or report
&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_conditional_edges&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fan_out&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fan_out&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 3 Send fan-out
&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;check_host&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ask_human&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="c1"&gt;# checked -&amp;gt; await approval
&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ask_human&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fix&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;            &lt;span class="c1"&gt;# approved -&amp;gt; fix
&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fix&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;report&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;               &lt;span class="c1"&gt;# fixed -&amp;gt; report
&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;report&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;END&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;graph&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;checkpointer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;InMemorySaver&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;   &lt;span class="c1"&gt;# compile + enable persistence
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few key points, one by one:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1 · A node is just a plain function.&lt;/strong&gt; &lt;code&gt;diagnose&lt;/code&gt;, &lt;code&gt;check_host&lt;/code&gt;, &lt;code&gt;fix&lt;/code&gt; are ordinary Python functions. Whether to call an LLM is entirely up to the function body — &lt;code&gt;diagnose&lt;/code&gt; can call a model, &lt;code&gt;check_host&lt;/code&gt; can be pure computation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2 · A conditional edge picks the path.&lt;/strong&gt; &lt;code&gt;route&lt;/code&gt; returns &lt;code&gt;"fan_out"&lt;/code&gt; or &lt;code&gt;"report"&lt;/code&gt;, and the graph walks to the matching node:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fan_out&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;abnormal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;report&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3 · Send = dispatch in bulk.&lt;/strong&gt; &lt;code&gt;fan_out&lt;/code&gt; returns 12 &lt;code&gt;Send("check_host", {...})&lt;/code&gt;, executed in parallel within the same superstep, results auto-merged:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fan_out&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;check_host&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;host&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hosts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb2miqh1x3xcqcxdsgk9m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb2miqh1x3xcqcxdsgk9m.png" alt="langgraph-send-fanout" width="799" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fig 2 · Send zoomed: dispatch N independent subtasks in one superstep, then merge.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4 · interrupt = stop and wait for a human.&lt;/strong&gt; Call &lt;code&gt;interrupt()&lt;/code&gt; inside a node and the graph halts, surfacing the question to you; after you approve and resume with an answer, the graph resumes from its checkpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;decision&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;interrupt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3 bad instances found — auto-restart?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# after you approve:
&lt;/span&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resume&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
             &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;configurable&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;thread_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;t1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5 · checkpoint = persist every step.&lt;/strong&gt; The graph stores progress after each step (the &lt;code&gt;thread_id&lt;/code&gt; acts as a ticket id). If it crashes midway, re-invoke with the same &lt;code&gt;thread_id&lt;/code&gt; and it resumes from the breakpoint — officially called durable execution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does LangGraph actually execute this graph?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Running the graph isn't a headlong dash from start to end; it moves forward &lt;strong&gt;round by round&lt;/strong&gt;. The official term is superstep, and each round does four things:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3ygrzfhng7vuohl2od7f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3ygrzfhng7vuohl2od7f.png" alt="langgraph-superstep" width="800" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fig 3 · One superstep: figure out who runs -&amp;gt; run in parallel -&amp;gt; refresh the board -&amp;gt; persist.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Nodes don't pass messages to each other. Everyone faces the same whiteboard: this round only reads what's already on the board, and writes are set aside — &lt;strong&gt;only after the whole round finishes does the board refresh&lt;/strong&gt;. The source comment is one line: what step N writes, step N+1 sees.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F920xq6121ou7vypq6y6s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F920xq6121ou7vypq6y6s.png" alt="langgraph-whiteboard" width="800" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fig 4 · How context passes: no talking between nodes, just read/write the same whiteboard.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Walk the Fig 1 on-call case through it, and the rhythm is:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxdna4mlovzwr7al6hxrt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxdna4mlovzwr7al6hxrt.png" alt="langgraph-case-supersteps" width="800" height="772"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fig 5 · The on-call case unrolled by superstep: writes land on the board next round.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Chat history works the same way: put messages on the board, and the next step sees them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compared to other options — where's the difference?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dify and Claude Code are both often called "multi-agent," but set beside LangGraph, one table each is enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dify: visual platform vs code library.&lt;/strong&gt; Dify is a web canvas where you drag nodes; LangGraph is a graph you draw in Python code.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Dify&lt;/th&gt;
&lt;th&gt;LangGraph&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Form&lt;/td&gt;
&lt;td&gt;Web canvas, drag nodes&lt;/td&gt;
&lt;td&gt;Draw the graph in Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Who it's for&lt;/td&gt;
&lt;td&gt;Non-developers / quick prototypes&lt;/td&gt;
&lt;td&gt;Developers / fine control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;License&lt;/td&gt;
&lt;td&gt;Apache 2.0 modified (commercial conditions apply)&lt;/td&gt;
&lt;td&gt;MIT (commercial use OK)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Claude Code dynamic workflow: the AI writes a LangGraph on the spot.&lt;/strong&gt; You just say what to do; in the background it auto-decomposes the task and spins up tens to hundreds of agents in parallel.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Claude Code dynamic workflow&lt;/th&gt;
&lt;th&gt;LangGraph&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Who orchestrates&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;The AI itself&lt;/strong&gt;: reads the request, decomposes dynamically&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;You&lt;/strong&gt;: draw a fixed graph in code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Orchestration artifact&lt;/td&gt;
&lt;td&gt;An agent tree in memory, gone after the run&lt;/td&gt;
&lt;td&gt;A compilable, replayable graph definition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Predictability&lt;/td&gt;
&lt;td&gt;Same input may produce different graphs&lt;/td&gt;
&lt;td&gt;Graph fixed, behavior predictable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One line to remember: &lt;strong&gt;Dify hands you a ready-made car, Claude Code has the AI write the orchestration on the spot, LangGraph hands you the engine and the blueprint&lt;/strong&gt; — the most freedom, and the most work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our open-source DataBuff — how do its agents collaborate?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Our open-source DataBuff (AI-native APM, GitHub: &lt;a href="https://github.com/databufflabs/databuff" rel="noopener noreferrer"&gt;https://github.com/databufflabs/databuff&lt;/a&gt;) also does multi-agent collaboration. You talk to a single entry point; an AI brain dispatches the work to experts — query, inspection, ops, Q&amp;amp;A — in parallel, then assembles their findings into a conclusion with an evidence chain:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3n2ay4rlmxwj3oypxjzd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3n2ay4rlmxwj3oypxjzd.png" alt="databuff-multi-agent" width="800" height="613"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fig 6 · You face one entry point; the complex collaboration happens behind it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The core purpose&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;LangGraph's core purpose isn't "to hand you a ready-made multi-agent solution," but &lt;strong&gt;to provide a controllable runtime for agent flows that need to run long, hold state, persist, and loop in a human&lt;/strong&gt; — it turns the low-level dirty work — parallelism, checkpointing, waiting, recovery — into primitives, so you only worry about the business flow itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; copy those 6 functions and the graph structure from the case and run them locally, and you'll understand what multi-agent orchestration is about.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;DataBuff&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open-source AI-native OpenTelemetry APM — metrics, traces, logs, and AI troubleshooting in one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/databufflabs/databuff" rel="noopener noreferrer"&gt;https://github.com/databufflabs/databuff&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://demo.databuff.ai" rel="noopener noreferrer"&gt;https://demo.databuff.ai&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>observability</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Grafana's LGTM Stack — Tempo and Loki Are Starting to Feel Dated</title>
      <dc:creator>databufflabs</dc:creator>
      <pubDate>Wed, 19 Aug 2026 02:45:11 +0000</pubDate>
      <link>https://dev.to/databufflabs/grafanas-lgtm-stack-tempo-and-loki-are-starting-to-feel-dated-5b94</link>
      <guid>https://dev.to/databufflabs/grafanas-lgtm-stack-tempo-and-loki-are-starting-to-feel-dated-5b94</guid>
      <description>&lt;p&gt;Same slow checkout: four hops from metrics to Tempo to Loki. DataBuff drills down from the service list, then you can ask the AI and check the platform itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DataBuff&lt;/strong&gt; is an AI-native APM. It ingests OpenTelemetry and SkyWalking, and ships seven AI capabilities. GitHub: &lt;a href="https://github.com/databufflabs/databuff" rel="noopener noreferrer"&gt;https://github.com/databufflabs/databuff&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Same slow checkout: Grafana needs three systems. DataBuff finishes the path in one.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you check&lt;/th&gt;
&lt;th&gt;Grafana: 3 systems / 3 separate pages&lt;/th&gt;
&lt;th&gt;DataBuff: 1 system / 3 linked pages&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Metric: who is slow&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Grafana&lt;/strong&gt;: Service Map&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Service list&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trace: which hop&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Tempo&lt;/strong&gt;: trace list, waterfall&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Tracing&lt;/strong&gt;: drill down from the service page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Log: what happened then&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Loki&lt;/strong&gt;: query by traceId&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Logs&lt;/strong&gt;: open Trace and jump back&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On-call, whether those three sit on one path matters more than whether you have all three pillars.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This LGTM: Metric / Trace / Log on three lines&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Metric · ① Who is slow: metrics-generator → metrics store → Service Map&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvh17o4eczl1g0yfeyro0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvh17o4eczl1g0yfeyro0.png" alt="gf-service-map" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Metric · Service Map (from metrics-generator, not Tempo itself)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trace · ② Find the request: Explore → Tempo, search the list&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Leave Service Map, switch Explore to the Tempo datasource, filter by service / operation for the slow checkout, and copy the &lt;strong&gt;traceId&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frpx50l10w2aotnnydmjm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frpx50l10w2aotnnydmjm.png" alt="lgtm-step2-tempo-search" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Trace · Explore → Tempo: different query box, different syntax&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trace · ③ Waterfall: where the time went&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open the trace. See which hop of service-a → service-b → service-c is slow. Still in Tempo. Logs not touched yet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxet2zfkj9buv28ftgduk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxet2zfkj9buv28ftgduk.png" alt="lgtm-step3-tempo-waterfall" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Trace · Tempo waterfall: find the slow span&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Log · ④ Logs: Explore → Loki, paste the traceId&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Log&lt;/strong&gt; is another line: Explore → Loki, put the traceId into LogQL. If tracesToLogs is not wired, this hop is manual.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fauucdenq4xuymiqb1ub8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fauucdenq4xuymiqb1ub8.png" alt="lgtm-step4-loki-traceid" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Log · Explore → Loki: LogQL, paste the traceId yourself&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fihlfcb4q5smac99o9yif.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fihlfcb4q5smac99o9yif.png" alt="gf-datasources" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;In this stack, Metric, Trace, and Log are separate datasources&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This run:&lt;/strong&gt; four hops, and logs still needed a hand-copied traceId.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DataBuff: same incident, drill down from the service list&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Metric · ① App performance → service list&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The service list shows &lt;code&gt;service-a&lt;/code&gt; latency, errors, and traffic. Click the name. Metrics and traces share one store — no extra extract from spans.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9xcgbgco3ealgta3ti3o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9xcgbgco3ealgta3ti3o.png" alt="db-step1-services" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Metric · service health: latency / errors / traffic&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trace · ② Tracing: open the slow waterfall&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;From the service page, open the 240ms checkout. Middleware spans sit on the same picture. No system switch.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3dvmr5ya8zwjljgyv9bc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3dvmr5ya8zwjljgyv9bc.png" alt="db-step2-trace" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Trace · waterfall + call chain&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Log · ③ Logs: Trace on the row, one click back&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each log row has a &lt;strong&gt;Trace&lt;/strong&gt; button. That is the on-call step you skip: copy the id, change the query.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmedc09qdx5jjokbx5beh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmedc09qdx5jjokbx5beh.png" alt="db-step3-logs" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Log · logs → trace, same product&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmy2pearfdhddvut0gjlo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmy2pearfdhddvut0gjlo.png" alt="db-topology" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Topology, service health, and waterfall share one dataset — no extra metrics-generator layer&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After that path: AI and self-monitoring&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;AI · Q&amp;amp;A / inspect / docs — same data you just drilled&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;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&amp;amp;A, and an ops expert. Sample prompts are concrete: last-hour service list, &lt;code&gt;service-b&lt;/code&gt; upstream/downstream, request and error trends.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F011iycn1577iechgc4fc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F011iycn1577iechgc4fc.png" alt="db-ai-chat" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;AI platform · ask, inspect, Q&amp;amp;A, ops expert — same menu as Metric / Trace / Log&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Self-monitoring · deploy status: treat the platform as a business system&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fabkrkzpnezn4drer6azw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fabkrkzpnezn4drer6azw.png" alt="db-selfmonitor" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Deploy status · ingest overview: 32.9/s in, Doris disk 49%; trace / metric / log on one page&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;LGTM: stop when you can see the data. DataBuff: after that you can still ask, and still see the platform.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you want&lt;/th&gt;
&lt;th&gt;Grafana LGTM&lt;/th&gt;
&lt;th&gt;DataBuff&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ask “who is slow, what does the topology look like”&lt;/td&gt;
&lt;td&gt;Write the query yourself; or add an LLM plugin plus data context&lt;/td&gt;
&lt;td&gt;AI chat: sample prompts are service list / topology / traffic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;An inspect report you can forward&lt;/td&gt;
&lt;td&gt;Stitch dashboards and alert rules&lt;/td&gt;
&lt;td&gt;Inspect: the expert reads the same metrics and writes the report&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Is the platform itself stuck&lt;/td&gt;
&lt;td&gt;Open each component health page&lt;/td&gt;
&lt;td&gt;One deploy-status page: ingest + Doris&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Component bill&lt;/td&gt;
&lt;td&gt;Tempo + metrics-generator + metrics store + Loki + Grafana&lt;/td&gt;
&lt;td&gt;ingest + one engine + Web (AI and deploy status included)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;How to try: OTLP dual-write, no rip-and-replace&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The collector already speaks OTLP. Add a &lt;strong&gt;DataBuff exporter&lt;/strong&gt; 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.&lt;/p&gt;

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




&lt;p&gt;&lt;strong&gt;DataBuff&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI-native APM. Ingests OpenTelemetry and SkyWalking. Seven AI capabilities on the same stack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/databufflabs/databuff" rel="noopener noreferrer"&gt;https://github.com/databufflabs/databuff&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://demo.databuff.ai" rel="noopener noreferrer"&gt;https://demo.databuff.ai&lt;/a&gt;&lt;/p&gt;

</description>
      <category>grafana</category>
      <category>observability</category>
      <category>devops</category>
      <category>opensource</category>
    </item>
    <item>
      <title>DeepSeek Harness Hit 126k Stars — What Self-Evolution Means for Software (and Observability)</title>
      <dc:creator>databufflabs</dc:creator>
      <pubDate>Mon, 17 Aug 2026 01:50:53 +0000</pubDate>
      <link>https://dev.to/databufflabs/deepseek-harness-hit-126k-stars-what-self-evolution-means-for-software-and-observability-506j</link>
      <guid>https://dev.to/databufflabs/deepseek-harness-hit-126k-stars-what-self-evolution-means-for-software-and-observability-506j</guid>
      <description>&lt;p&gt;A repo on GitHub has been exploding lately. DeepSeek open-sourced an agent framework called &lt;strong&gt;deepseek-harness&lt;/strong&gt; (often shortened to &lt;strong&gt;dsh&lt;/strong&gt;). It went public on August 13; when I took this screenshot, it was already at &lt;strong&gt;126k stars&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnf3agx47l95xhqw5qyg8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnf3agx47l95xhqw5qyg8.jpg" alt="dsh-github-stars" width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;GitHub repo page, captured 2026-08-16. Top-right shows 126k stars; About lists 125.9k.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/deepseek-ai/deepseek-harness" rel="noopener noreferrer"&gt;https://github.com/deepseek-ai/deepseek-harness&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Its one-line pitch: &lt;strong&gt;Everything is a Plugin&lt;/strong&gt;. You're not stuck with whatever shipped in the box. The AI can see what it already has, and when something is missing it can add it to itself. They call that &lt;strong&gt;self-evolution&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;With stars climbing that fast, I wanted to see what it actually does. So I opened the web UI and typed one request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I asked it to add a sidebar item&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Roughly: build a plugin, inject it into yourself. Change the left menu — add a &lt;strong&gt;Workflow&lt;/strong&gt; item above Workspace. Click it and show a complex flow chart; click a node and open a drawer on the right.&lt;/p&gt;

&lt;p&gt;It actually did it. Bottom-left showed Cordis Plugin: 1 running. The three screenshots below are from the live page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuz27m8ib0c23x7wjf2s8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuz27m8ib0c23x7wjf2s8.jpg" alt="shot-1-ask-inject-plugin" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Red box is the original prompt. It inspected its own sidebar first — didn't jump straight to editing files.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw1hnp96w8cvi0lgq78co.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw1hnp96w8cvi0lgq78co.jpg" alt="shot-2-workflow-canvas" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The left **Workflow&lt;/em&gt;* item is live. This ticket canvas wasn't built-in — the plugin it just wrote drew it.*&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fic6bpa80rwbjkyx6k8qr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fic6bpa80rwbjkyx6k8qr.jpg" alt="shot-3-node-drawer" width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Clicking the red **External API Query&lt;/em&gt;* node: timeout and retry 3/5 in the drawer.*&lt;/p&gt;

&lt;p&gt;That extra &lt;strong&gt;Workflow&lt;/strong&gt; entry wasn't in a release. It wrote a plugin on the spot and mounted it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That made me think about on-call pages&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The troubleshooting pages you open on shift are usually fixed at ship time. How topology switches, which metrics sit where, what the drawer shows first — often one team's playbook baked into the UI. Banks want ledger latency; e-commerce wants checkout funnels; one layout rarely fits both.&lt;/p&gt;

&lt;p&gt;Changing that in traditional software is hard: tweak a page, wait for the next release. Low-code is better — drag and drop — but you're still picking from the vendor's blocks; step outside and you're stuck.&lt;/p&gt;

&lt;p&gt;dsh is different. You say what you need; it adds a piece to itself right then. The block is fabricated on site, not chosen from a catalog.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F62xxg4ed95id9ls01cgf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F62xxg4ed95id9ls01cgf.png" alt="dia-1-compare" width="800" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fig 1 · Traditional software, low-code, and dsh in one glance&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Three capabilities — we've shipped two&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We've been thinking about this for a while. Software that takes care of itself, in my view, comes down to three things: &lt;strong&gt;self-ops&lt;/strong&gt;, &lt;strong&gt;self-Q&amp;amp;A&lt;/strong&gt;, and &lt;strong&gt;self-evolution&lt;/strong&gt;. DataBuff already has the first two in product.&lt;/p&gt;

&lt;p&gt;Project on GitHub: &lt;a href="https://github.com/databufflabs/databuff" rel="noopener noreferrer"&gt;https://github.com/databufflabs/databuff&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Self-ops isn't just flashing a red chart.&lt;/strong&gt; In our demo, logs were dropping — thousands to fifteen thousand per minute. A human said two things: let it investigate, then allow it on the box. It checked its own self-monitoring, found the write queue capped at 16 batches, bumped it to 32, restarted ingest. After that, write drops went to zero.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftyxly1fx0z9j1pb3bgzq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftyxly1fx0z9j1pb3bgzq.jpg" alt="db-selfops-ssh" width="800" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Self-ops · SSH to change params and restart ingest; write drops back to zero. It fixed itself.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Self-Q&amp;amp;A: installed but don't know where to click?&lt;/strong&gt; You used to hunt external docs. In DataBuff, switch to product support and ask: how do I wire OpenTelemetry, where do I set alert thresholds? It answers with menu paths and fields from in-product docs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpy0kf4xf7l5eo9yphohh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpy0kf4xf7l5eo9yphohh.png" alt="db-selfqa-howto" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Self-Q&amp;amp;A · Ask how to onboard OTel and configure alerts — get paths, not a link dump.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Both are visible the moment you open the product. Self-evolution we haven't built yet. dsh just demonstrated the third.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4n6romyu0x7h6erjqe6l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4n6romyu0x7h6erjqe6l.png" alt="dia-2-three" width="800" height="309"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fig 2 · Three capabilities — DataBuff has the first two&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Self-evolution in observability&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Observability isn't a chat window. Collection, storage, query — touch the wrong layer and your data is dirty. dsh can rewrite sidebars and canvases because almost everything lives in plugins. Observability can't copy that wholesale. The ingest/store/query pipeline must not be edited live.&lt;/p&gt;

&lt;p&gt;What &lt;em&gt;can&lt;/em&gt; grow on demand is the human-facing layer. "Show me UnionPay transactions first" — add a troubleshooting panel or drawer on the spot. The pipeline underneath stays the same.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwwmwociqfq6ffx7fnryg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwwmwociqfq6ffx7fnryg.png" alt="dia-3-obs-layers" width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fig 3 · Observability: lock the base, extend the pages&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvf146qylqlfkghm2yza3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvf146qylqlfkghm2yza3.png" alt="dia-4-house" width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fig 4 · dsh can change the whole building; observability only the room users see&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Same telemetry as before. Pages can be tailored per customer on the spot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beyond the hype — still those three&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most of dsh's star rush is probably about "AI adding features to itself."&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Self-ops&lt;/strong&gt; — when it breaks, it fixes itself. Not just a red dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-Q&amp;amp;A&lt;/strong&gt; — don't know how to use it? Ask; get menu paths.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-evolution&lt;/strong&gt; — not enough? Add a piece for your request on the spot.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We've shipped the first two in DataBuff. The third — for observability — we're not there yet.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;DataBuff&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open-source AI-native OpenTelemetry APM — metrics, traces, logs and AI troubleshooting in one platform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/databufflabs/databuff" rel="noopener noreferrer"&gt;https://github.com/databufflabs/databuff&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://demo.databuff.ai" rel="noopener noreferrer"&gt;https://demo.databuff.ai&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>observability</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Troubleshooting Stuck at Nginx? Instrument It with OpenTelemetry Too</title>
      <dc:creator>databufflabs</dc:creator>
      <pubDate>Wed, 12 Aug 2026 01:42:13 +0000</pubDate>
      <link>https://dev.to/databufflabs/troubleshooting-stuck-at-nginx-instrument-it-with-opentelemetry-too-164c</link>
      <guid>https://dev.to/databufflabs/troubleshooting-stuck-at-nginx-instrument-it-with-opentelemetry-too-164c</guid>
      <description>&lt;p&gt;The page is slow, APIs time out randomly, and you've already checked Java logs and slow SQL — still nothing. The gap is often the Nginx in front: it proxy-passes the request, but classic access logs won't tell you whether the hop succeeded, how long it took, or where it stalled.&lt;/p&gt;

&lt;p&gt;OpenTelemetry turns that into "load a module, write a few lines of config." This post walks a Demo we actually ran: instrument Nginx and Java with OpenTelemetry, then open one Trace in &lt;strong&gt;&lt;a href="https://github.com/databufflabs/databuff" rel="noopener noreferrer"&gt;DataBuff&lt;/a&gt;&lt;/strong&gt; that spans &lt;strong&gt;Nginx → Java → Redis&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What OpenTelemetry is doing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenTelemetry stitches each service hop into one call chain.&lt;/strong&gt; A full request is a Trace; each processing segment is a Span. Nginx uses the official module, Java uses the official agent — each records its hop, exports with the same TraceID, and the platform merges the fragments.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl / browser
   │   GET /hello
   ▼
[ Nginx  nginx:1.27-alpine-otel ]   ngx_otel_module   → OTLP gRPC 4317
   │   reverse proxy proxy_pass
   ▼
[ Java   JDK HttpServer + Jedis ]   opentelemetry-javaagent → OTLP HTTP 4318
   │   set + get
   ▼
[ Redis  192.168.50.120:16379 ]     Jedis auto-instrumented
   ▼
[ DataBuff ]  ← gRPC 4317 + HTTP 4318, merged under one TraceID
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Hop 1 · Nginx — two install paths&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The official OTel module needs a recent Nginx (1.21+). Our host still runs 1.20.1, so &lt;strong&gt;path A&lt;/strong&gt; uses the official image that already ships the module; &lt;strong&gt;path B&lt;/strong&gt; installs the module package on an existing Nginx and adds one &lt;code&gt;load_module&lt;/code&gt; line. OTel directives are the same either way.&lt;/p&gt;

&lt;p&gt;Path A — official image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; nginx-otel &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 8090:80 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--add-host&lt;/span&gt; host.docker.internal:host-gateway &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; /path/to/nginx.conf:/etc/nginx/nginx.conf:ro &lt;span class="se"&gt;\&lt;/span&gt;
  nginx:1.27-alpine-otel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Path B — Alpine example: &lt;code&gt;apk add --repository https://nginx.org/packages/mainline/alpine/v3.21/main nginx-module-otel&lt;/code&gt;, then &lt;code&gt;load_module /usr/lib/nginx/modules/ngx_otel_module.so;&lt;/code&gt; and &lt;code&gt;nginx -s reload&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Config points that matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Export over &lt;strong&gt;gRPC&lt;/strong&gt; &lt;code&gt;host.docker.internal:4317&lt;/code&gt; (HTTP 4318 fails with &lt;code&gt;OTel export failure ... Socket closed&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;otel_service_name nginx-otel-demo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;otel_trace on&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The line people miss: &lt;code&gt;otel_trace_context propagate;&lt;/code&gt;.&lt;/strong&gt; By default the module receives upstream context but does not inject it downstream. Without this line Nginx reports its own Span, but Java never sees the TraceID — you get two unrelated Traces. After adding &lt;code&gt;propagate&lt;/code&gt;, they joined immediately.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;otel_exporter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;endpoint&lt;/span&gt; &lt;span class="nf"&gt;host.docker.internal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4317&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;# gRPC&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;otel_service_name&lt;/span&gt; &lt;span class="s"&gt;nginx-otel-demo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;otel_trace_context&lt;/span&gt; &lt;span class="s"&gt;propagate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;             &lt;span class="c1"&gt;# required: inject traceparent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Hop 2 · Java agent, zero code changes&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;java &lt;span class="nt"&gt;-javaagent&lt;/span&gt;:opentelemetry-javaagent.jar &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-Dotel&lt;/span&gt;.service.name&lt;span class="o"&gt;=&lt;/span&gt;java-redis-demo &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-Dotel&lt;/span&gt;.exporter.otlp.endpoint&lt;span class="o"&gt;=&lt;/span&gt;http://127.0.0.1:4318 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-cp&lt;/span&gt; &lt;span class="s2"&gt;"libs/*:classes"&lt;/span&gt; OtelDemoServer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Java uses HTTP OTLP (4318), Nginx uses gRPC (4317)&lt;/strong&gt; — two protocols, one DataBuff, one Trace later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hop 3 · Two exporters, one Trace&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3e00x2i3ju2fktuj20u4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3e00x2i3ju2fktuj20u4.png" alt="service-list" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Both &lt;code&gt;nginx-otel-demo&lt;/code&gt; and &lt;code&gt;java-redis-demo&lt;/code&gt; show up with volume, error rate, and latency.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffiqsh8til4ykk0a8okyt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffiqsh8til4ykk0a8okyt.png" alt="topology" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Topology draws &lt;code&gt;nginx-otel-demo&lt;/code&gt; → &lt;code&gt;java-redis-demo&lt;/code&gt; → Redis.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/epov100r6v9hxqllxlv9.png" rel="noopener noreferrer"&gt;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/epov100r6v9hxqllxlv9.png&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Waterfall: &lt;code&gt;/hello&lt;/code&gt; (nginx) → &lt;code&gt;GET /hello&lt;/code&gt; (java) → &lt;code&gt;AUTH/SET/GET&lt;/code&gt; (redis), total &lt;strong&gt;975ms&lt;/strong&gt;, TraceID &lt;code&gt;7dff87e865b7fe975877a506db26a2ab&lt;/code&gt;. The Demo sleeps about one second in Java on purpose — nginx Span (975ms) and Java Span (974.75ms) rise together, so &lt;strong&gt;Nginx duration really covers the whole request&lt;/strong&gt;. Redis even records &lt;code&gt;AUTH&lt;/code&gt; as its own Span when the connection uses a password.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't trust the UI alone — check Doris&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;span_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parent_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;is_parent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;duration&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;trace_dc_span&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;trace_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'7dff87e865b7fe975877a506db26a2ab'&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;startTime&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nginx-otel-demo  /hello      (empty, root)  975000000
java-redis-demo  GET /hello  &amp;lt;nginx span&amp;gt;   974745285
[redis]…:16379   AUTH        &amp;lt;java span&amp;gt;     638593
[redis]…:16379   SET         &amp;lt;java span&amp;gt;     361212
[redis]…:16379   GET         &amp;lt;java span&amp;gt;     164941
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5bw939dn1ye9gq0tqpun.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5bw939dn1ye9gq0tqpun.png" alt="trace-list" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Filter the trace list by nginx / java when you're hunting edge issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it tonight — three steps&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;docker run&lt;/code&gt; &lt;code&gt;nginx:1.27-alpine-otel&lt;/code&gt; with &lt;code&gt;otel_trace_context propagate;&lt;/code&gt;, expose &lt;code&gt;http://&amp;lt;host&amp;gt;:8090/hello&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Start Java with &lt;code&gt;-javaagent:opentelemetry-javaagent.jar&lt;/code&gt; pointing at &lt;code&gt;http://127.0.0.1:4318&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;curl http://192.168.50.140:8090/hello&lt;/code&gt; a few times, wait ~30s for batch export, open DataBuff Traces, filter &lt;code&gt;nginx-otel-demo&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foyzeji4561744fknw8t5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foyzeji4561744fknw8t5.png" alt="login-page" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Self-check: nginx root Span present; Java under nginx (not a sibling Trace); Redis SET/GET under Java. If you see two Traces, you almost certainly forgot &lt;code&gt;propagate&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Fifteen minutes on the Nginx module and the Java agent turns the first hop from a blind spot into a span you can scroll.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;DataBuff&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open-source AI-native OpenTelemetry APM — metrics, traces, logs and AI troubleshooting in one platform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/databufflabs/databuff" rel="noopener noreferrer"&gt;https://github.com/databufflabs/databuff&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://demo.databuff.ai" rel="noopener noreferrer"&gt;https://demo.databuff.ai&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opentelemetry</category>
      <category>nginx</category>
      <category>devops</category>
      <category>observability</category>
    </item>
    <item>
      <title>What Does a Self-Caring Software Look Like? (DataBuff Self-Monitoring &amp; Self-Troubleshooting)</title>
      <dc:creator>databufflabs</dc:creator>
      <pubDate>Mon, 10 Aug 2026 01:22:18 +0000</pubDate>
      <link>https://dev.to/databufflabs/what-does-a-self-caring-software-look-like-databuff-self-monitoring-self-troubleshooting-4nie</link>
      <guid>https://dev.to/databufflabs/what-does-a-self-caring-software-look-like-databuff-self-monitoring-self-troubleshooting-4nie</guid>
      <description>&lt;p&gt;When you're on call, the worst thing isn't that your business went down — it's that &lt;strong&gt;your monitoring platform itself broke and you had no idea&lt;/strong&gt;. Log volume suddenly drops, a chunk of data silently disappears — and after hours of searching you realize it was never the business at fault: the collection pipeline choked on itself. To make it worse, traditional monitoring software is always watching "everything else," while being a black box itself: CPU spikes, memory full, queues blocked — it never says a single word.&lt;/p&gt;

&lt;p&gt;First, what is DataBuff: an open-source AI-native APM where the AI lives directly on top of your OpenTelemetry data — asking questions and troubleshooting are done by AI experts calling tools against real data. Project on GitHub (&lt;a href="https://github.com/databufflabs/databuff" rel="noopener noreferrer"&gt;github.com/databufflabs/databuff&lt;/a&gt;). Its approach is different: &lt;strong&gt;it treats itself as a business system being monitored&lt;/strong&gt;. Once installed, you can see whether it's healthy, why it's abnormal, which parameter to tune — you can even say one sentence and it will run an inspection on itself. This article walks through a real case.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. It watches itself: the platform's self-monitoring page&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;DataBuff's "Deployment Status" page exposes metrics for all three core components: &lt;strong&gt;ingest&lt;/strong&gt; (collects data), &lt;strong&gt;web&lt;/strong&gt; (queries data), and &lt;strong&gt;Doris&lt;/strong&gt; (stores data). The overview opens with four cards that state the conclusion up front: inbound events per second, any write failures, Doris disk remaining, any query errors.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fesr4a8g27yqvwc60qoyk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fesr4a8g27yqvwc60qoyk.png" alt="Deployment Status overview: inbound TPS, write failures, Doris disk usage, query failures" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Scrolling down gets more granular: every signal path in ingest — trace / metric / log — is tracked individually with "how many, how big, how slow, any dropped"; Doris disk and CPU are broken out too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. It understands itself: every metric ships with its own manual&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;More metrics isn't the point — &lt;strong&gt;every metric comes with an explanation and its tuning parameters&lt;/strong&gt;. Click the title of any chart and a drawer pops up: how this metric is computed, whether you should worry, &lt;strong&gt;which env var to tune when it goes wrong, and the default value&lt;/strong&gt;. All explained at once.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm18kde410xo1mo5ry6ct.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm18kde410xo1mo5ry6ct.png" alt="Clicking " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Take the "Write Drop" metric: the drawer tells you it only occurs in two situations — the queue is full and a whole batch is dropped, or writes fail consecutively and are discarded; it reminds you that "any sustained drop means data loss — check queue depth, write failures, and Doris liveness first"; and finally it lists the tunable parameters directly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. It does health checkups: one sentence, AI inspects the whole platform&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don't want to flip through page after page? Just tell the AI platform "&lt;strong&gt;inspect the DataBuff platform and produce an HTML inspection report&lt;/strong&gt;". The product support expert reads the metric catalog, queries the platform's own self-monitoring metrics, picks out the anomalies, and produces an HTML report you can forward directly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx5r0fi1ewf2laskgyw4l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx5r0fi1ewf2laskgyw4l.png" alt="Platform inspection report triggered by one sentence (live): overall healthy, zero inbound/write failures, Doris all green, two follow-ups auto-flagged" width="800" height="556"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We ran it live: within minutes it automatically checked ingest, writes, pipeline, query domain, Doris, and process resources. The conclusion matched manual troubleshooting — one query-domain failure was still ongoing, and it flagged it as-is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. It diagnoses: logs are dropping, and it finds the cause itself&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This data loss isn't made up — it actually happened and was actually fixed in our demo environment. The "Write Drop" metric on the Deployment Status page went red — only the &lt;strong&gt;log&lt;/strong&gt; signal was dropping continuously, thousands to fifteen thousand per minute:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkg5hgqq04q2ijxbj3i0c.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkg5hgqq04q2ijxbj3i0c.jpg" alt="Write Drop self-monitoring chart (live): the log line keeps dropping, thousands to 15k/min, Ready queue 16/16 full" width="800" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this point, no one needs to flip through pages. Just say the word in the AI platform and let the expert investigate. It first rules out two "non-issues": the business side is normal — not the app's fault; Doris storage is alive and writes are fast — not the storage's fault. The real cause lands in ingest. Logs are batched and pushed into a write queue — &lt;strong&gt;this environment's queue holds only 16 batches, normally 32&lt;/strong&gt;. Sudden bursts don't fit, and the overflow gets dropped as whole batches. The log shows &lt;code&gt;Doris ready queue full (16/16)&lt;/code&gt; every minute — confirmed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fekme2tj7g01hanhpaz7l.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fekme2tj7g01hanhpaz7l.jpg" alt="AI troubleshooting explains the drop chain (live): batching → 16-batch write queue → queue full, whole batch dropped → Doris storage, each step backed by a metric" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It packages "why it dropped, where it dropped, which param to tune, and to what value" into a conclusion with evidence, and hands over the fix suggestion:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqrcmjptbvyi5pky8l4wd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqrcmjptbvyi5pky8l4wd.jpg" alt="The fix suggestion from troubleshooting (live): which param to tune, the default, and the suggested value, all written in the conclusion" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. It fixes itself: changing params and restarting, all on its own&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The suggested fix is exactly this group of &lt;code&gt;INGEST_DORIS_*&lt;/code&gt; parameters — the core problem is a too-small queue, just make it bigger:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;th&gt;Effect&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;INGEST_DORIS_MAX_READY_BATCHES&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;Write queue too small for bursts; double it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;INGEST_DORIS_FLUSH_TIMEOUT_MS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;30s&lt;/td&gt;
&lt;td&gt;60s&lt;/td&gt;
&lt;td&gt;Restore default write timeout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;INGEST_DORIS_FLUSH_BATCH_BYTES&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;50 MiB&lt;/td&gt;
&lt;td&gt;50 MiB (unchanged)&lt;/td&gt;
&lt;td&gt;Not touched this time&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;And you don't change the params or restart by hand. The product support expert &lt;strong&gt;SSHs in, edits the config, and restarts ingest&lt;/strong&gt; per the suggestion, then re-checks to confirm:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fljstdb9fudjlz422qe3p.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fljstdb9fudjlz422qe3p.jpg" alt="Product support expert executes the operation (live): SSH → backup config → change params → restart ingest → verify" width="800" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm5wgcqsllxcunk2j9lqq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm5wgcqsllxcunk2j9lqq.jpg" alt="Post-fix recheck (live): query the platform's self-monitoring again, confirm drops back to zero" width="800" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After the restart takes effect, drops return to zero — before the fix, thousands dropped per minute; after the restart, several consecutive minutes at 0, the curve back to normal:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frhb2pe3k7ybw25toburi.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frhb2pe3k7ybw25toburi.jpg" alt="Self-monitoring chart after the fix (live): Write Drop back to zero, curve recovered" width="799" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All a human did: ask it to diagnose, then ask it to fix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Getting started — you can use it the same way&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;After install, check &lt;strong&gt;Deployment Config → Deployment Status&lt;/strong&gt;; scan the four overview cards for health at a glance&lt;/li&gt;
&lt;li&gt;To confirm whether data is being lost: ingest page → "Write Drop", click the title for the explanation&lt;/li&gt;
&lt;li&gt;Add "how to fix dropping data" to your on-call runbook: trigger troubleshooting in the AI platform for a fix suggestion, let the product support expert SSH in to change &lt;code&gt;INGEST_DORIS_*&lt;/code&gt; and restart ingest&lt;/li&gt;
&lt;li&gt;Periodically have the support expert run a platform inspection and forward the report to the team&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Closing — the self-discipline software should have&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Software used to be done the moment it shipped; problems were handled by people watching, investigating, and restarting. What DataBuff does isn't complicated: it builds the operational work into the software itself, using the same methods you already use to watch your business.&lt;/p&gt;

&lt;p&gt;This data loss — from discovery to on-box fix — nobody opened a runbook or guessed a direction even once.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;DataBuff&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open-source AI-native OpenTelemetry APM — metrics, traces, logs and AI troubleshooting in one platform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/databufflabs/databuff" rel="noopener noreferrer"&gt;https://github.com/databufflabs/databuff&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://demo.databuff.ai" rel="noopener noreferrer"&gt;https://demo.databuff.ai&lt;/a&gt;&lt;/p&gt;

</description>
      <category>apm</category>
      <category>opentelemetry</category>
      <category>devops</category>
      <category>observability</category>
    </item>
    <item>
      <title>The OpenTelemetry Ecosystem Is Strong — DataBuff Can Plug Into Its eBPF Trace Path</title>
      <dc:creator>databufflabs</dc:creator>
      <pubDate>Thu, 06 Aug 2026 01:24:44 +0000</pubDate>
      <link>https://dev.to/databufflabs/the-opentelemetry-ecosystem-is-strong-databuff-can-plug-into-its-ebpf-trace-path-1kb5</link>
      <guid>https://dev.to/databufflabs/the-opentelemetry-ecosystem-is-strong-databuff-can-plug-into-its-ebpf-trace-path-1kb5</guid>
      <description>&lt;p&gt;The OpenTelemetry community packaged eBPF trace collection as &lt;strong&gt;OBI&lt;/strong&gt; (OpenTelemetry eBPF Instrumentation). On Kubernetes you run a DaemonSet per node; eBPF watches HTTP calls between local services, assembles traces, and exports them — &lt;strong&gt;app Pods stay unchanged&lt;/strong&gt;. Image: &lt;code&gt;otel/ebpf-instrument&lt;/code&gt;. Project: &lt;a href="https://github.com/open-telemetry/opentelemetry-ebpf-instrumentation" rel="noopener noreferrer"&gt;opentelemetry-ebpf-instrumentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Where do traces land? &lt;strong&gt;&lt;a href="https://github.com/databufflabs/databuff" rel="noopener noreferrer"&gt;DataBuff&lt;/a&gt;&lt;/strong&gt; is an open-source APM platform for services, topology, and call chains. Point OBI at DataBuff and you're done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One DaemonSet, one collector Pod per node&lt;/strong&gt; — ns &lt;code&gt;obi&lt;/code&gt;, app Pods untouched, eBPF on local HTTP → export to DataBuff.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1 · Install DataBuff
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://databuff.ai/databuff/ai-apm-k8s-install.sh | bash
kubectl &lt;span class="nt"&gt;-n&lt;/span&gt; databuff get pods
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All Pods Running and the UI opens — you're good.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 · Check eBPF readiness on app nodes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; /sys/kernel/btf/vmlinux
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kernel &lt;strong&gt;5.8+&lt;/strong&gt; recommended; the second command must list a file. Without BTF, collector Pods won't capture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 · Image
&lt;/h2&gt;

&lt;p&gt;Use &lt;code&gt;otel/ebpf-instrument:latest&lt;/code&gt; (worked in our test; &lt;strong&gt;pin a version in production&lt;/strong&gt;). Skip if the cluster can pull; offline clusters need &lt;code&gt;docker load&lt;/code&gt; on nodes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4 · Apply the DaemonSet
&lt;/h2&gt;

&lt;p&gt;Replace &lt;code&gt;YOUR_APP_NAMESPACE&lt;/code&gt; and &lt;code&gt;YOUR_DATABUFF_HOST&lt;/code&gt; (&lt;code&gt;ai-apm-ingest.databuff.svc&lt;/code&gt;). &lt;code&gt;hostPID&lt;/code&gt; + &lt;code&gt;privileged&lt;/code&gt; are required.&lt;/p&gt;

&lt;p&gt;Key config:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;discovery.instrument.k8s_namespace&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ebpf.context_propagation: headers&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;otel_traces_export.endpoint: http://YOUR_DATABUFF_HOST:4318&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; obi.yaml
kubectl &lt;span class="nt"&gt;-n&lt;/span&gt; obi get ds,pods &lt;span class="nt"&gt;-o&lt;/span&gt; wide
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;DESIRED / READY should match node count.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2302r5nv29dzauyvtlxj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2302r5nv29dzauyvtlxj.png" alt="DaemonSet READY 5/5" width="800" height="172"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5 · Logs
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl &lt;span class="nt"&gt;-n&lt;/span&gt; obi logs &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;obi &lt;span class="nt"&gt;--tail&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;80 | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-iE&lt;/span&gt; &lt;span class="s2"&gt;"instrumenting|process|error"&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-30&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look for &lt;code&gt;instrumenting process&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6 · Traffic
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;seq &lt;/span&gt;1 80&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; 2 &lt;span class="s2"&gt;"http://your-app-url/"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true
  sleep &lt;/span&gt;0.2
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 7 · Verify in DataBuff
&lt;/h2&gt;

&lt;p&gt;Open &lt;strong&gt;APM → Services&lt;/strong&gt;, then topology and trace detail.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvo3xqsz7x9q1u40cgute.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvo3xqsz7x9q1u40cgute.png" alt="Service list" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx45e0ul255uxwfvyxher.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx45e0ul255uxwfvyxher.png" alt="Topology" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0p9k11415fnnozj4lcug.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0p9k11415fnnozj4lcug.png" alt="Trace list" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3qtrc38lktsvdvl1cdw4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3qtrc38lktsvdvl1cdw4.png" alt="Trace waterfall" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  eBPF vs language Agent
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Better when&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;eBPF + DaemonSet&lt;/td&gt;
&lt;td&gt;No injection/restart; HTTP-first; polyglot quick layer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Language Agent&lt;/td&gt;
&lt;td&gt;Dubbo, slow SQL, method stacks; kernel &amp;lt; 5.8 / no BTF&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt; no Dubbo RPC yet; no method stacks or custom business spans; privileged Pod + BTF required.&lt;/p&gt;

&lt;h2&gt;
  
  
  How multi-hop traces connect
&lt;/h2&gt;

&lt;p&gt;With &lt;code&gt;context_propagation: headers&lt;/code&gt; and no app code changes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ingress&lt;/strong&gt; — read &lt;code&gt;Traceparent:&lt;/code&gt; on incoming HTTP; attach or create trace context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local correlate&lt;/strong&gt; — match outbound HTTP to the inbound request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Egress&lt;/strong&gt; — sockmap &lt;code&gt;sk_msg&lt;/code&gt; inserts this hop's &lt;code&gt;Traceparent&lt;/code&gt; after the request line.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;HTTPS uses a separate TCP Option path upstream; this walkthrough is plain HTTP + headers.&lt;/p&gt;

&lt;p&gt;Full bilingual post (with more YAML detail): &lt;a href="https://databuff.ai/blog/en/databuff-obi-ebpf-traces" rel="noopener noreferrer"&gt;databuff.ai/blog/en/databuff-obi-ebpf-traces&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opentelemetry</category>
      <category>ebpf</category>
      <category>kubernetes</category>
      <category>devops</category>
    </item>
    <item>
      <title>Palantir Made Ontology Hot — Can APM Troubleshooting Stop at Ontology Alone?</title>
      <dc:creator>databufflabs</dc:creator>
      <pubDate>Fri, 31 Jul 2026 08:25:28 +0000</pubDate>
      <link>https://dev.to/databufflabs/palantir-made-ontology-hot-can-apm-troubleshooting-stop-at-ontology-alone-5dg5</link>
      <guid>https://dev.to/databufflabs/palantir-made-ontology-hot-can-apm-troubleshooting-stop-at-ontology-alone-5dg5</guid>
      <description>&lt;p&gt;"Ontology" is back in fashion. Palantir Foundry is not pitched as yet another data warehouse — it builds an &lt;strong&gt;ontology&lt;/strong&gt; for the enterprise: tables, streams, and sensors become "Customer," "Order," and "Device," with relationships and actions defined so data becomes a world model programs can reason over. LLMs made the pitch louder — models still need to know what exists in the world.&lt;/p&gt;

&lt;p&gt;For our field: &lt;strong&gt;what is the APM ontology? And if you build it, does incident triage just work?&lt;/strong&gt; Two separate questions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q1 · How to build an APM ontology&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An APM ontology is two steps: &lt;strong&gt;extract&lt;/strong&gt; entities and relationships from traces, then &lt;strong&gt;materialize&lt;/strong&gt; them into metric tables.&lt;/p&gt;

&lt;p&gt;Setup: service A has instances A-1 and A-2; two endpoints; both call database DB and run the same SQL1. Four traces:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;service&lt;/th&gt;
&lt;th&gt;instance&lt;/th&gt;
&lt;th&gt;endpoint&lt;/th&gt;
&lt;th&gt;call&lt;/th&gt;
&lt;th&gt;sql&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;T1&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;A-1&lt;/td&gt;
&lt;td&gt;ep1&lt;/td&gt;
&lt;td&gt;DB&lt;/td&gt;
&lt;td&gt;SQL1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T2&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;A-1&lt;/td&gt;
&lt;td&gt;ep2&lt;/td&gt;
&lt;td&gt;DB&lt;/td&gt;
&lt;td&gt;SQL1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T3&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;A-2&lt;/td&gt;
&lt;td&gt;ep1&lt;/td&gt;
&lt;td&gt;DB&lt;/td&gt;
&lt;td&gt;SQL1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T4&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;A-2&lt;/td&gt;
&lt;td&gt;ep2&lt;/td&gt;
&lt;td&gt;DB&lt;/td&gt;
&lt;td&gt;SQL1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Step 1 — extract.&lt;/strong&gt; From T1: entities are service A, instance A-1, endpoint ep1, database DB, SQL1. Relationships: A has instance A-1; A exposes ep1; A-1 serves requests on ep1; ep1 calls DB; ep1 executes SQL1; DB has statement SQL1. P99, latency, and call count are &lt;em&gt;not&lt;/em&gt; entities — they are observations attached to entities.&lt;/p&gt;

&lt;p&gt;All four traces together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Service hasInstance Instance&lt;/strong&gt;: A → A-1, A-2&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service exposes Endpoint&lt;/strong&gt;: A → ep1, ep2&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instance serves request on Endpoint&lt;/strong&gt;: A-1 / A-2 both serve ep1 and ep2&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Endpoint calls DB&lt;/strong&gt;: ep1 → DB; ep2 → DB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Endpoint executes SQL&lt;/strong&gt;: ep1 → SQL1; ep2 → SQL1&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DB hasStatement SQL&lt;/strong&gt;: DB → SQL1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 2 — materialize.&lt;/strong&gt; Extracted entities become queryable metric tables. In &lt;a href="https://github.com/databufflabs/databuff" rel="noopener noreferrer"&gt;DataBuff&lt;/a&gt;'s Doris layer (schema is open source), dimension columns are entities; call_count / resp_time are observations:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Table&lt;/th&gt;
&lt;th&gt;Dimensions&lt;/th&gt;
&lt;th&gt;Observations&lt;/th&gt;
&lt;th&gt;Entities&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;metric_service&lt;/td&gt;
&lt;td&gt;service&lt;/td&gt;
&lt;td&gt;call_count / resp_time / error_count&lt;/td&gt;
&lt;td&gt;Service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;metric_service_instance&lt;/td&gt;
&lt;td&gt;service + instance&lt;/td&gt;
&lt;td&gt;same&lt;/td&gt;
&lt;td&gt;Service, Instance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;metric_service_http&lt;/td&gt;
&lt;td&gt;service + instance + endpoint&lt;/td&gt;
&lt;td&gt;same&lt;/td&gt;
&lt;td&gt;Service, Instance, Endpoint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;metric_service_db&lt;/td&gt;
&lt;td&gt;service + instance + db + sql&lt;/td&gt;
&lt;td&gt;db calls / db latency&lt;/td&gt;
&lt;td&gt;Service, Instance, DB, SQL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Aggregating the four traces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;metric_service&lt;/strong&gt;: service A → 1 row, 4 entry calls&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;metric_service_instance&lt;/strong&gt;: by instance → 2 rows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;metric_service_http&lt;/strong&gt;: by instance + endpoint → 4 rows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;metric_service_db&lt;/strong&gt;: by instance + DB + SQL → 2 rows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ontology done: traces tell you what exists and what connects; metric tables materialize those entities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q2 · Is ontology enough?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Entities and relationships complete — is troubleshooting solved? Consider how a connection pool actually behaves:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdatabuff.ai%2Fblog%2Fapm-ontology-model%2Fassets%2Fconnection-pool-logic.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdatabuff.ai%2Fblog%2Fapm-ontology-model%2Fassets%2Fconnection-pool-logic.png" alt="Connection pool branches an ER diagram cannot capture" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even if you add ConnectionPool as Service → ConnectionPool → Database, you only label the big boxes. The branches and states in between &lt;strong&gt;cannot be covered by adding one more entity&lt;/strong&gt; — that layer is &lt;strong&gt;logic&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;a) &lt;strong&gt;Acquire&lt;/strong&gt;: idle → return; can grow → create; pool full → lock wait; timeout → error&lt;br&gt;
b) &lt;strong&gt;Use / return&lt;/strong&gt;: run SQL → return → wake waiters&lt;br&gt;
c) &lt;strong&gt;Background maintenance&lt;/strong&gt;: heartbeat, evict stale connections&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Entity-only reasoning fails when an endpoint slows down:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Ontology only&lt;/th&gt;
&lt;th&gt;With logic&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Reasoning&lt;/td&gt;
&lt;td&gt;endpoint → DB, slow ⇒ DB slow&lt;/td&gt;
&lt;td&gt;stuck in lock wait, SQL never ran&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Symptom&lt;/td&gt;
&lt;td&gt;endpoint latency up&lt;/td&gt;
&lt;td&gt;DB execution may be fine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conclusion&lt;/td&gt;
&lt;td&gt;root cause is DB&lt;/td&gt;
&lt;td&gt;root cause is &lt;strong&gt;waiting for a connection&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;First principles: &lt;strong&gt;program = data + logic&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Ontology&lt;/th&gt;
&lt;th&gt;Logic&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Manages&lt;/td&gt;
&lt;td&gt;what exists, who connects&lt;/td&gt;
&lt;td&gt;how requests flow, where they stall&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locks onto&lt;/td&gt;
&lt;td&gt;target entities&lt;/td&gt;
&lt;td&gt;last-mile root cause&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Without it&lt;/td&gt;
&lt;td&gt;no drill-down target&lt;/td&gt;
&lt;td&gt;stuck at "something is wrong"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Connection pool is one slice — it shows entity-only is not enough. See how DataBuff breaks down latency for one endpoint:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdatabuff.ai%2Fblog%2Fapm-ontology-model%2Fassets%2Fendpoint-latency-logic-breakdown.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdatabuff.ai%2Fblog%2Fapm-ontology-model%2Fassets%2Fendpoint-latency-logic-breakdown.png" alt="DataBuff endpoint latency breakdown" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Entry average ~240ms; breakdown shows HTTP service-b ~100ms, RPC service-b ~80ms, remainder in MySQL, ES, Redis, Kafka. That is &lt;strong&gt;logic modeling for one entry&lt;/strong&gt; — track entry latency and state, then each operation type after the entry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q3 · How to model logic&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Scale to a real app: track latency and state for &lt;strong&gt;every entry&lt;/strong&gt;, and for &lt;strong&gt;each operation type&lt;/strong&gt; after every entry. Entries include RPC, HTTP, MQ consumers, scheduled jobs, and more.&lt;/p&gt;

&lt;p&gt;After a request enters, it typically lands in &lt;strong&gt;5 operation types + 1 behavior&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Key dimensions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DB remote operation&lt;/td&gt;
&lt;td&gt;dal group / table / operation / sql&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redis remote operation&lt;/td&gt;
&lt;td&gt;command&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MQ remote operation&lt;/td&gt;
&lt;td&gt;exchange / routingKey / vhost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RPC remote operation&lt;/td&gt;
&lt;td&gt;downstream service / remote method&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local operation&lt;/td&gt;
&lt;td&gt;no extra attributes yet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thrown exception&lt;/td&gt;
&lt;td&gt;exception name&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For remote operations, split latency into three parts:&lt;/p&gt;

&lt;p&gt;a) &lt;strong&gt;Client&lt;/strong&gt;: connect, send, receive&lt;br&gt;
b) &lt;strong&gt;Network&lt;/strong&gt;: transport&lt;br&gt;
c) &lt;strong&gt;Server&lt;/strong&gt;: peer execution&lt;/p&gt;

&lt;p&gt;Pool-full lock wait accrues on the &lt;strong&gt;client&lt;/strong&gt; — &lt;strong&gt;waiting for a connection ≠ slow SQL&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Incidents then follow one chain: which entries → local ops → remote ops (down to SQL/method) → network vs server → exceptions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ontology locks entities; logic locks root cause.&lt;/strong&gt; Logic models entry → operation → remote three-part latency → exception, with latency and state at each layer. For AI to separate "waiting for a connection" from "slow SQL," it must land on entities via ontology, then walk this logic chain to the actual reason.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>apm</category>
      <category>devops</category>
      <category>observability</category>
    </item>
    <item>
      <title>Install Failed but the Page Still Opens — Ops Expert Restores Doris</title>
      <dc:creator>databufflabs</dc:creator>
      <pubDate>Tue, 28 Jul 2026 01:27:27 +0000</pubDate>
      <link>https://dev.to/databufflabs/install-failed-but-the-page-still-opens-ops-expert-restores-doris-16p</link>
      <guid>https://dev.to/databufflabs/install-failed-but-the-page-still-opens-ops-expert-restores-doris-16p</guid>
      <description>&lt;p&gt;Almost every product hits two kinds of user pain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Can't use it:&lt;/strong&gt; install fails, won't start, or dies in production — errors only, then humans grep logs and guess commands.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't know how:&lt;/strong&gt; docs elsewhere, menus buried — ask a helper and get "see the official documentation."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Self-healing ops&lt;/strong&gt; fixes the first: when storage is down the product stays usable, SSH for evidence, change config, restart, verify.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In-product Q&amp;amp;A&lt;/strong&gt; fixes the second: ask the product in natural language; answers come from in-product docs and your deployment.&lt;/p&gt;

&lt;p&gt;DataBuff is an &lt;strong&gt;open-source, AI-native OpenTelemetry APM&lt;/strong&gt; — metrics, traces, logs first; AI on the same telemetry. Three pieces: &lt;strong&gt;Ingest&lt;/strong&gt;, &lt;strong&gt;Doris&lt;/strong&gt;, &lt;strong&gt;AI platform / Web&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdatabuff.ai%2Fblog%2Fdatabuff-ops-expert-install-troubleshoot%2Fassets%2F00-simple-architecture.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdatabuff.ai%2Fblog%2Fdatabuff-ops-expert-install-troubleshoot%2Fassets%2F00-simple-architecture.jpg" alt="DataBuff minimal architecture" width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://databuff.ai/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Self-healing in practice:&lt;/strong&gt; Doris breaks during install. Many products go dark; you SSH and guess. We inject &lt;code&gt;mem_limit: 256m&lt;/code&gt; on Doris BE so &lt;code&gt;start.sh&lt;/code&gt; exits non-zero. &lt;strong&gt;Troubleshooting mode&lt;/strong&gt; keeps Web up while Doris is unhealthy.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdatabuff.ai%2Fblog%2Fdatabuff-ops-expert-install-troubleshoot%2Fassets%2F01-start-fail-terminal.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdatabuff.ai%2Fblog%2Fdatabuff-ops-expert-install-troubleshoot%2Fassets%2F01-start-fail-terminal.png" alt="start.sh non-zero troubleshooting banner" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Configure an LLM, open AI chat, pick &lt;strong&gt;Ops Expert&lt;/strong&gt;, grant SSH, ask for locate-and-fix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I installed DataBuff on 192.168.50.140 (dir /opt/databuff-ai-apm-failover).
install/start failed but Web opens.
SSH to root@192.168.50.140 (password Databuff@123)
Find why Doris FE/BE is not ready; fix root cause and report results.
Install dir: /opt/databuff-ai-apm-failover
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdatabuff.ai%2Fblog%2Fdatabuff-ops-expert-install-troubleshoot%2Fassets%2F04-ops-prompt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdatabuff.ai%2Fblog%2Fdatabuff-ops-expert-install-troubleshoot%2Fassets%2F04-ops-prompt.png" alt="Ops Expert prompt" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the host: BE Restarting → &lt;code&gt;mem_limit: 256m&lt;/code&gt; OOM → &lt;strong&gt;memory raised to 4g, config persisted, ingest restarted, full-stack Healthy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdatabuff.ai%2Fblog%2Fdatabuff-ops-expert-install-troubleshoot%2Fassets%2F05-ops-final-conclusion.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdatabuff.ai%2Fblog%2Fdatabuff-ops-expert-install-troubleshoot%2Fassets%2F05-ops-final-conclusion.png" alt="Ops Expert fix summary" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Terminal matches: four containers healthy, Doris &lt;code&gt;SELECT 1&lt;/code&gt; passes. Troubleshooting mode exits automatically.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdatabuff.ai%2Fblog%2Fdatabuff-ops-expert-install-troubleshoot%2Fassets%2F07-recovery-terminal.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdatabuff.ai%2Fblog%2Fdatabuff-ops-expert-install-troubleshoot%2Fassets%2F07-recovery-terminal.png" alt="Recovery terminal" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In-product Q&amp;amp;A&lt;/strong&gt; on the same AI entry — OTel ingest and alert thresholds:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdatabuff.ai%2Fblog%2Fdatabuff-ops-expert-install-troubleshoot%2Fassets%2F08a-qa-prompt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdatabuff.ai%2Fblog%2Fdatabuff-ops-expert-install-troubleshoot%2Fassets%2F08a-qa-prompt.png" alt="Product Q&amp;amp;A prompt" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdatabuff.ai%2Fblog%2Fdatabuff-ops-expert-install-troubleshoot%2Fassets%2F08-qa-expert.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdatabuff.ai%2Fblog%2Fdatabuff-ops-expert-install-troubleshoot%2Fassets%2F08-qa-expert.png" alt="OTel ingest and alerts answer" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then LLM setup — menu paths, required fields, common pitfalls:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdatabuff.ai%2Fblog%2Fdatabuff-ops-expert-install-troubleshoot%2Fassets%2F09a-qa2-prompt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdatabuff.ai%2Fblog%2Fdatabuff-ops-expert-install-troubleshoot%2Fassets%2F09a-qa2-prompt.png" alt="LLM config question" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdatabuff.ai%2Fblog%2Fdatabuff-ops-expert-install-troubleshoot%2Fassets%2F09-qa2-answer.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdatabuff.ai%2Fblog%2Fdatabuff-ops-expert-install-troubleshoot%2Fassets%2F09-qa2-answer.png" alt="LLM config answer" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In one line:&lt;/strong&gt; self-healing fixes "can't use it"; in-product Q&amp;amp;A fixes "don't know how."&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>devops</category>
      <category>apm</category>
      <category>opentelemetry</category>
    </item>
    <item>
      <title>One Entry, Many Experts: How DataBuff Orchestrates Parallel Ops AI</title>
      <dc:creator>databufflabs</dc:creator>
      <pubDate>Sun, 26 Jul 2026 01:26:58 +0000</pubDate>
      <link>https://dev.to/databufflabs/one-entry-many-experts-how-databuff-orchestrates-parallel-ops-ai-46nf</link>
      <guid>https://dev.to/databufflabs/one-entry-many-experts-how-databuff-orchestrates-parallel-ops-ai-46nf</guid>
      <description>&lt;p&gt;It's 2 a.m. The alert channel blows up.&lt;/p&gt;

&lt;p&gt;Someone needs error rates. Someone else wants traces. Another person suspects a full disk on a container. You open one AI chat — it either hand-waves, or mixes metrics, logs, and SSH into one muddy answer. &lt;strong&gt;The more you ask, the messier it gets.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open more windows? Worse. Each bot talks past the others. You still don't have &lt;strong&gt;one incident-ready summary&lt;/strong&gt; you can paste into the war room.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/databufflabs/databuff" rel="noopener noreferrer"&gt;DataBuff&lt;/a&gt; treats multi-expert coordination like a hospital: &lt;strong&gt;triage desk + specialist consults&lt;/strong&gt;. You speak to &lt;strong&gt;one entry point&lt;/strong&gt;. Data Query, Inspection, Ops, and Product Q&amp;amp;A work in parallel behind the scenes, then roll up into an evidence-backed report. This post covers two things: &lt;strong&gt;why on-call actually needs multiple experts&lt;/strong&gt;, and &lt;strong&gt;how to dispatch, parallelize, and merge without chaos&lt;/strong&gt; — framework only, no source-code dump.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why one bigger prompt is not enough
&lt;/h2&gt;

&lt;p&gt;The instinct is: &lt;strong&gt;one stronger model, one longer prompt, done.&lt;/strong&gt; On a real incident, that breaks — for the same reason a hospital does not send one doctor to run the ECG, draw blood, read the CT, and operate at once.&lt;/p&gt;

&lt;p&gt;Chest pain in the ER: you do not expect a single generalist to do every specialty with every machine. &lt;strong&gt;Wrong tools, wrong permissions, shallow on everything.&lt;/strong&gt; Lab values and surgical plans get mixed up. Bad outcomes follow.&lt;/p&gt;

&lt;p&gt;On-call is the same. Ask &lt;em&gt;"anything wrong with the cluster?"&lt;/em&gt; and you may need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data Query&lt;/strong&gt; — latency and error rates in Doris, slow traces (labs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inspection&lt;/strong&gt; — JVM/GC/dependency sweeps across dozens of services (screening)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ops Expert&lt;/strong&gt; — SSH, logs, disk, processes (surgery)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product Q&amp;amp;A&lt;/strong&gt; — where OTLP ports and alert menus live (admin desk)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Four &lt;strong&gt;different toolchains, permissions, and report formats&lt;/strong&gt;. Stuffing them into one mega-prompt balloons context: metric semantics bleed into shell commands. Models &lt;strong&gt;cross-contaminate, overreach, hallucinate&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;More chat tabs do not fix it. That is the family running between departments with no triage: &lt;strong&gt;no routing&lt;/strong&gt;, no shared chart, you stitch the story at 2 a.m.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-expert is not hype.&lt;/strong&gt; Ops problems are cross-domain, parallel, and evidence-heavy — same shape as triage → specialty work → attending synthesis.&lt;/p&gt;

&lt;h2&gt;
  
  
  One front door, specialists in the back
&lt;/h2&gt;

&lt;p&gt;Think of DataBuff's AI platform as &lt;strong&gt;on-call consult&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You talk only to the &lt;strong&gt;triage desk&lt;/strong&gt; (AI Brain)&lt;/li&gt;
&lt;li&gt;The desk does not run labs or operate — it &lt;strong&gt;pages the right specialty&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Each expert queries real telemetry and returns &lt;strong&gt;evidence&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The desk merges into something you can &lt;strong&gt;act on&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3ur4wo0y1kto72sqrnle.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3ur4wo0y1kto72sqrnle.png" alt="Triage desk plus specialist consults" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is not "sidebar ChatGPT." Classic APM + chat often &lt;strong&gt;cannot see your live metrics and traces&lt;/strong&gt;. DataBuff is &lt;strong&gt;AI-native APM on OpenTelemetry&lt;/strong&gt; — experts must call tools; guessing is not the design.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxm0z2tjhj2oh5l72mjz7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxm0z2tjhj2oh5l72mjz7.jpg" alt="AI-native APM minimal stack" width="800" height="305"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Three layers, not one giant prompt
&lt;/h2&gt;

&lt;p&gt;New capability is added in three layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tools&lt;/strong&gt; — instruments: service lists, traces, inspections, controlled commands&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Experts&lt;/strong&gt; — roles: Data Query knows metrics, Inspection scans the fleet, Ops goes on-host, Q&amp;amp;A reads product docs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Playbooks&lt;/strong&gt; — how each role investigates and writes reports; plus routing rules for the Brain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A new "department" ≈ tools + playbook + expert registration. &lt;strong&gt;The hospital building (your observability pipeline) stays put.&lt;/strong&gt; You still talk to one desk.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the Brain dispatches
&lt;/h2&gt;

&lt;p&gt;The Brain loads routing rules, reads every expert's charter, and &lt;strong&gt;semantically matches&lt;/strong&gt; your request. It emits a dispatch: &lt;strong&gt;which expert + task brief&lt;/strong&gt;. Two hard rules: &lt;strong&gt;faithful to your intent&lt;/strong&gt;, and &lt;strong&gt;the Brain does not do the work&lt;/strong&gt; — no metrics, no inspection runs, no shell on its own. Triage and synthesis only.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pain point 1: what does dispatch actually look like?
&lt;/h3&gt;

&lt;p&gt;A ticket-shaped loop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You message AI Brain; it reads routing rules and picks experts.&lt;/li&gt;
&lt;li&gt;Brain issues &lt;strong&gt;one dispatch&lt;/strong&gt;: target expert + task brief (your words preserved).&lt;/li&gt;
&lt;li&gt;System immediately replies &lt;strong&gt;"accepted, please wait"&lt;/strong&gt; — ticket created, work not finished.&lt;/li&gt;
&lt;li&gt;The expert runs &lt;strong&gt;in the background&lt;/strong&gt;: tools, traces, inspection, controlled commands.&lt;/li&gt;
&lt;li&gt;Expert returns a &lt;strong&gt;delivery artifact&lt;/strong&gt; to the same session and &lt;strong&gt;wakes Brain for another turn&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Pain point 2: why not wait synchronously?
&lt;/h3&gt;

&lt;p&gt;Expert jobs are slow. Long-lived SSE connections time out. True parallelism dies if you block serially. Experts are multi-step tool loops. So dispatch is &lt;strong&gt;async by design&lt;/strong&gt;: Brain ends its turn, experts run, callbacks wake Brain when done.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faopkxhecwx7ve24r2s4k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faopkxhecwx7ve24r2s4k.png" alt="Sync vs async dispatch" width="799" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Pain point 3: four guardrails so async does not sprawl
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Same expert, serial only&lt;/strong&gt; — duplicate dispatch while busy is rejected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Different experts may run in parallel&lt;/strong&gt; — Inspection + Data Query together.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Session-level pending counter&lt;/strong&gt; — dispatch +1, delivery −1.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Final answer only when pending = 0&lt;/strong&gt; — Brain must rewrite a complete reply, not "as above."&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Live demo: one sentence, two experts
&lt;/h2&gt;

&lt;p&gt;On &lt;strong&gt;demo.databuff.ai&lt;/strong&gt;, open &lt;strong&gt;AI Brain&lt;/strong&gt;. &lt;strong&gt;Do not pick an expert manually.&lt;/strong&gt; Paste:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Any cluster anomalies in the last hour? Run a joint diagnosis with Data Query and Intelligent Inspection: Data Query checks latency, error rate, and slow traces; Inspection runs tiered health checks; summarize into an incident report I can forward.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Brain &lt;strong&gt;dispatches twice in parallel&lt;/strong&gt; — Data Query and Inspection.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcn0m3x7e5ot0qt3fo5iz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcn0m3x7e5ot0qt3fo5iz.png" alt="AI Brain parallel dispatch" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Inspection returns an S/A/B tiered view: most of 34 services in S/A; &lt;strong&gt;service-b&lt;/strong&gt; at B with &lt;strong&gt;InsufficientStockException&lt;/strong&gt; on SKU DEMO-10001. Brain merges into HTML with &lt;strong&gt;P0/P1 action items&lt;/strong&gt; — ready for the incident channel:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F97r27xvn2r9yk20be2o5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F97r27xvn2r9yk20be2o5.png" alt="Combined incident report" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Most products still make you pick an expert first
&lt;/h2&gt;

&lt;p&gt;Many "multi-agent" UIs show four tiles — Data Query, Inspection, Ops, Q&amp;amp;A. &lt;strong&gt;You still guess which door to knock on.&lt;/strong&gt; One conversation belongs to one expert. Switch experts, new window, context lost. Ask for error rates &lt;strong&gt;and&lt;/strong&gt; a JVM sweep in one breath? You play dispatcher across tabs.&lt;/p&gt;

&lt;p&gt;No triage desk — self-serve specialty signup. Wrong line wastes time; right line still means &lt;strong&gt;you&lt;/strong&gt; collect reports from every window.&lt;/p&gt;

&lt;p&gt;The gap is not four avatars vs one. It is &lt;strong&gt;who routes work&lt;/strong&gt;: you picking single-expert chats, vs Brain accepting, dispatching, parallelizing, and merging with an evidence chain. That is what on-call needs: &lt;strong&gt;one entry, Brain dispatch, legal parallelism, traceable rollup.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Good systems do not make you guess the specialty. Hand off like shift change — one sentence in, triage and consults happen backstage. Try it on &lt;strong&gt;demo.databuff.ai&lt;/strong&gt; with the prompt above.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try DataBuff&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open source · multi-expert orchestration · one entry, parallel dispatch&lt;/p&gt;

&lt;p&gt;Online Demo: &lt;a href="https://demo.databuff.ai" rel="noopener noreferrer"&gt;https://demo.databuff.ai&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/databufflabs/databuff" rel="noopener noreferrer"&gt;https://github.com/databufflabs/databuff&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If this helped, star the repo — and run the demo prompt yourself once.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>devops</category>
      <category>aiops</category>
      <category>opentelemetry</category>
    </item>
    <item>
      <title>Is Your Data Quality Good Enough for the AI Era?</title>
      <dc:creator>databufflabs</dc:creator>
      <pubDate>Thu, 23 Jul 2026 01:37:09 +0000</pubDate>
      <link>https://dev.to/databufflabs/is-your-data-quality-good-enough-for-the-ai-era-1oga</link>
      <guid>https://dev.to/databufflabs/is-your-data-quality-good-enough-for-the-ai-era-1oga</guid>
      <description>&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;How do you know you “pass”? This article does three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set a &lt;strong&gt;four-question bar&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Score DataBuff, SkyWalking, Jaeger, Pinpoint, SigNoz, and OpenObserve with the same ruler&lt;/li&gt;
&lt;li&gt;Show how &lt;a href="https://github.com/databufflabs/databuff" rel="noopener noreferrer"&gt;DataBuff&lt;/a&gt; uses &lt;strong&gt;12 fixed &lt;code&gt;metric_service_*&lt;/code&gt; tables&lt;/strong&gt; to meet that bar&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1. A scenario you’ve probably hit
&lt;/h2&gt;

&lt;p&gt;Checkout is slow in production. You plug AI into your APM and ask:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Why is checkout slow? Which SQL is the bottleneck?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fail&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Please open the trace detail, find the root span manually, then correlate the DB span…”&lt;/p&gt;

&lt;p&gt;AI becomes a &lt;strong&gt;fancy search box&lt;/strong&gt; — barely better than no AI.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Pass&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Slow on &lt;code&gt;SELECT … FROM orders&lt;/code&gt;, triggered by &lt;code&gt;/checkout&lt;/code&gt;; the payment hop has the highest latency.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No raw-trace digging — a direct answer.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;In the AI era, data quality wins.&lt;/strong&gt; Everyone can copy Prompts; a curated metric schema can’t be copied overnight. Bad datasets just make stronger models tell you to dig yourself.&lt;/p&gt;

&lt;p&gt;Analogy: raw telemetry is unlabeled video footage; a high-quality dataset is a &lt;strong&gt;fixed-column spreadsheet&lt;/strong&gt; — which API, which SQL, who triggered it — AI can answer from that.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The bar: four questions AI must answer
&lt;/h2&gt;

&lt;p&gt;Forget field names. Ask your APM these four (with or without AI) — &lt;strong&gt;can it answer directly?&lt;/strong&gt; That’s the bar.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Which API is broken?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
HTTP, DB, and MQ must not share one Span-name pile. Redis GET and checkout POST need separate stats.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Which SQL / which database is slow?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
“MySQL avg 50ms” is not enough — you need the &lt;strong&gt;exact statement&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Which page triggered the slow SQL?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The critical question. Many stacks can’t answer — you’re sent back to hunt the entry by hand.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Which hop on the call path is dragging?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
order → payment → MySQL: traffic and errors per hop — not just a topology thumbnail.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Pass = all four answered directly.&lt;/strong&gt; If one answer is “go dig the traces yourself,” the dataset fails.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. App-performance matrix: where the six diverge
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Legend: ✅ verified · △ entry exists / limited depth · ❌ no equivalent&lt;/p&gt;

&lt;p&gt;Versions tested: DataBuff v0.1.4 · SkyWalking 10.4.0 · Jaeger 1.76 · Pinpoint 3.1.0 · SigNoz 0.133 · OpenObserve 0.91-rc1.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;DataBuff&lt;/th&gt;
&lt;th&gt;SkyWalking&lt;/th&gt;
&lt;th&gt;Jaeger&lt;/th&gt;
&lt;th&gt;Pinpoint&lt;/th&gt;
&lt;th&gt;SigNoz&lt;/th&gt;
&lt;th&gt;OpenObserve&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Global topology&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;△&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Service list / golden metrics&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Service-level topology&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;△&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;△&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Service call analysis&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Instance golden metrics&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;△&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6. Instance topology&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7. Instance call analysis&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8. API-level topology&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9. API call analysis&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;△&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10. Service flow&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11. Middleware pages (DB / cache / MQ)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;△&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12. Error analysis&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;△&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;△&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13. Trace list / search&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14. Trace detail&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15. Span ↔ logs&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;△&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16. Log list / search&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17. Log detail&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18. Logs ↔ Trace&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;How to read it&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;All six can search traces; the gap is call analysis, service flow, middleware pages.&lt;/li&gt;
&lt;li&gt;For humans staring at UI, SkyWalking / Pinpoint often suffice; for AI to answer the four questions, you need that depth.&lt;/li&gt;
&lt;li&gt;Those green cells aren’t extra menus — they’re the &lt;strong&gt;backbone of the causality chain&lt;/strong&gt;: which API, which SQL, who triggered it, which hop dragged.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  4. How do you prepare a passing dataset?
&lt;/h2&gt;

&lt;p&gt;Those capabilities aren’t pages bolted on later — &lt;strong&gt;incoming spans are written into fixed tables by type&lt;/strong&gt;. DataBuff ships this as &lt;strong&gt;12 &lt;code&gt;metric_service_*&lt;/code&gt; tables&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;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
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Table&lt;/th&gt;
&lt;th&gt;Stores&lt;/th&gt;
&lt;th&gt;Answers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;metric_service&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Service-entry RED&lt;/td&gt;
&lt;td&gt;Is this service healthy?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;metric_service_trace&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Trace root&lt;/td&gt;
&lt;td&gt;End-to-end success and duration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;metric_service_http&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;HTTP API typing&lt;/td&gt;
&lt;td&gt;Which URL / method / status is bad?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;code&gt;metric_service_db&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;DB calls&lt;/td&gt;
&lt;td&gt;Which SQL is slow, who triggered (entry on same row)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;code&gt;metric_service_flow&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Entry path tree&lt;/td&gt;
&lt;td&gt;From entry, which hop drags?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;code&gt;metric_service_rpc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;RPC calls&lt;/td&gt;
&lt;td&gt;gRPC / Dubbo method and status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;&lt;code&gt;metric_service_redis&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cache calls&lt;/td&gt;
&lt;td&gt;Who issues GET/SET, is it slow?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;&lt;code&gt;metric_service_mq&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Messaging&lt;/td&gt;
&lt;td&gt;Topic produce/consume, lag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;&lt;code&gt;metric_service_remote&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;External deps&lt;/td&gt;
&lt;td&gt;External API QPS / latency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;&lt;code&gt;metric_service_exception&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Entry exceptions&lt;/td&gt;
&lt;td&gt;Exception name / code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;&lt;code&gt;metric_service_config&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Config reads&lt;/td&gt;
&lt;td&gt;Are Nacos / ZK reads slow?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;&lt;code&gt;metric_service_instance&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Instance metadata&lt;/td&gt;
&lt;td&gt;Pod / host / Java version (JOIN)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For the four questions, lead with tables &lt;strong&gt;1 / 3 / 4 / 5&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Three words before you query:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;tag&lt;/strong&gt; — filter columns (&lt;code&gt;url&lt;/code&gt;, &lt;code&gt;sqlContent&lt;/code&gt;, &lt;code&gt;rootResource&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;field&lt;/strong&gt; — numeric columns (&lt;code&gt;cnt&lt;/code&gt;, &lt;code&gt;sumDuration&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;virtual service&lt;/strong&gt; — e.g. &lt;code&gt;[mysql]demo_apm&lt;/code&gt; as a topology node&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5glss1cvluty039ot25m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5glss1cvluty039ot25m.png" alt="DataBuff global topology" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;HTTP / DB / MQ / cache typed into topology — from component tables, not one Span-name dump&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Four questions → which table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Primary table&lt;/th&gt;
&lt;th&gt;Key tags&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Is the service healthy? (warmup)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;metric_service&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;service&lt;/code&gt;, &lt;code&gt;errorType&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1. Which API is broken?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;metric_service_http&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;url&lt;/code&gt;, &lt;code&gt;httpMethod&lt;/code&gt;, &lt;code&gt;httpCode&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2. Which SQL is slow?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;metric_service_db&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;sqlContent&lt;/code&gt;, &lt;code&gt;isSlow&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3. Who triggered the slow SQL?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;metric_service_db&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;&lt;code&gt;rootResource&lt;/code&gt;&lt;/strong&gt; (same row as sqlContent)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4. Which hop drags?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;metric_service_flow&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;entryInterfacePathId&lt;/code&gt;, &lt;code&gt;pathId&lt;/code&gt;, &lt;code&gt;parentService&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  ① metric_service — warmup
&lt;/h3&gt;

&lt;p&gt;Answers: “service-a QPS, error rate, avg latency today?”&lt;/p&gt;

&lt;p&gt;Only &lt;strong&gt;entry requests&lt;/strong&gt; write a row — filter out DB / Redis / MQ spans.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4ceyhipkiy4ecii2uifo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4ceyhipkiy4ecii2uifo.png" alt="Service list RED metrics" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Service list — product face of &lt;code&gt;metric_service&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ② metric_service_http — Q1
&lt;/h3&gt;

&lt;p&gt;Answers: “Slowest URL? GET or POST? 4xx or 5xx?”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3kf3bjvlhzhtt1lly2ua.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3kf3bjvlhzhtt1lly2ua.png" alt="API analysis HTTP typing" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;URLs like &lt;code&gt;/demo/checkout&lt;/code&gt; as their own rows&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ③ metric_service_db — Q2 and Q3
&lt;/h3&gt;

&lt;p&gt;Answers: “Which SQL is slow? Which entry triggered it?” — &lt;strong&gt;same table, same row&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sqlContent&lt;/code&gt; + &lt;code&gt;rootResource&lt;/code&gt; on one row is the most important design for the bar: no Trace hunt for the trigger.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5rwg5zhur2wr5x52g53t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5rwg5zhur2wr5x52g53t.png" alt="Database list" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;code&gt;[mysql]demo_apm&lt;/code&gt; / ES as virtual services&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ④ metric_service_flow — Q4
&lt;/h3&gt;

&lt;p&gt;Answers: “From service-a entry, how much response each hop contributes?”&lt;/p&gt;

&lt;p&gt;The path tree is computed once a Trace is &lt;strong&gt;complete&lt;/strong&gt; — not one hop per arriving Span.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvoti6undtby61heno213.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvoti6undtby61heno213.png" alt="Service flow path tree" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Entry service-a expands downstream with response share&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. End-to-end: slow checkout
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Entry health&lt;/strong&gt; — &lt;code&gt;metric_service&lt;/code&gt;: did service-a error rate / avg latency spike?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pin the slow API&lt;/strong&gt; — &lt;code&gt;metric_service_http&lt;/code&gt;: confirm &lt;code&gt;url&lt;/code&gt; is &lt;code&gt;/demo/checkout&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slow SQL + trigger&lt;/strong&gt; — &lt;code&gt;metric_service_db&lt;/code&gt;: &lt;code&gt;rootResource='/demo/checkout' AND isSlow=1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which hop drags&lt;/strong&gt; — &lt;code&gt;metric_service_flow&lt;/code&gt;: expand from service-a, compare response share&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;(Optional) which machine&lt;/strong&gt; — JOIN &lt;code&gt;metric_service_instance&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s data quality: filter and aggregate on &lt;strong&gt;fixed columns&lt;/strong&gt; — not guessing Span names, not sending humans back into raw traces.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Three-step self-check
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Run the four questions&lt;/strong&gt; — if one answer is “dig the traces yourself,” you fail. Chat ≠ troubleshooting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the highlighted matrix rows&lt;/strong&gt; — call analysis / service flow / middleware pages — especially “slow SQL → entry.”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If you fail&lt;/strong&gt; — add fixed columns (entry API, SQL digest) at write time, or switch to a more complete dataset.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Close:&lt;/strong&gt; In the AI era, ask &lt;em&gt;is your data quality good enough&lt;/em&gt; — before Prompts and models. Four questions set the bar; the matrix shows the product surface; the 12 tables are why.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try DataBuff&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open source · OpenTelemetry · datasets designed for AI querying&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Live Demo: &lt;a href="https://demo.databuff.ai" rel="noopener noreferrer"&gt;https://demo.databuff.ai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/databufflabs/databuff" rel="noopener noreferrer"&gt;https://github.com/databufflabs/databuff&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Full post: &lt;a href="https://databuff.ai/blog/en/trace-metrics-data-quality/" rel="noopener noreferrer"&gt;https://databuff.ai/blog/en/trace-metrics-data-quality/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If this helped, leave a ❤️ or a Star on GitHub — and tell us which of the four questions your stack still can’t answer.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>devops</category>
      <category>apm</category>
      <category>opentelemetry</category>
    </item>
    <item>
      <title>DataBuff vs Jaeger: Same-Host Lab Comparison</title>
      <dc:creator>databufflabs</dc:creator>
      <pubDate>Thu, 23 Jul 2026 01:33:56 +0000</pubDate>
      <link>https://dev.to/databufflabs/databuff-vs-jaeger-same-host-lab-comparison-oc0</link>
      <guid>https://dev.to/databufflabs/databuff-vs-jaeger-same-host-lab-comparison-oc0</guid>
      <description>&lt;p&gt;Same-host lab: DataBuff (OTLP &lt;code&gt;:4318&lt;/code&gt;) and Jaeger all-in-one (OTLP / UI &lt;code&gt;:16686&lt;/code&gt;) side by side on the same Demo (service-a / service-b). Host: 192.168.50.140 · DataBuff v0.1.4 · Jaeger v1.76.0. Marks: ✅ verified in this lab · △ present but limited · ❌ no equivalent. Green bold cells are clear DataBuff leads.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Capability matrices
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Seven AI capabilities&lt;/strong&gt; (v0.1.4: See → Squad → Inspect → Diagnose → Repair → Predict → Answer)&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Jaeger v1.76.0&lt;/th&gt;
&lt;th&gt;DataBuff v0.1.4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;① See · natural-language questions&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Ask about services / topology / trends; AI reads telemetry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;② Squad · multi-agent collaboration&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Parallel evidence gathering; reusable task orchestration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;③ Inspect · service inspection + report&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ One-shot inspection with evidence and actions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;④ Diagnose · bottleneck / RCA evidence&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Trace / metrics / topology evidence (not a black-box “root cause”)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⑤ Repair · Ops Expert actions&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Repair under policy + human approval; dangerous-command denylist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⑥ Predict · capacity / trends&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Capacity and trend analysis — from after-the-fact to ahead-of-time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⑦ Answer · product Q&amp;amp;A&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Answers deploy / ingest / config from docs and code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extend · MCP / Skill / custom experts&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ External MCP / Skill and custom digital experts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Largest gap: Jaeger is a distributed tracing backend with no equivalent AI platform; DataBuff exposes the seven capabilities as configurable home entries with APM as AI context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;APM&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Jaeger v1.76.0&lt;/th&gt;
&lt;th&gt;DataBuff v0.1.4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Global topology&lt;/td&gt;
&lt;td&gt;△ Dependencies (service DAG; this lab shows service-a → service-b)&lt;/td&gt;
&lt;td&gt;✅ Topology + health colors + drill-down (incl. middleware)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Service list &amp;amp; golden metrics&lt;/td&gt;
&lt;td&gt;❌ Search dropdown only; no dedicated service list / golden-metric charts&lt;/td&gt;
&lt;td&gt;✅ Service list + charts; same demo shows service-a / b&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Service-level topology&lt;/td&gt;
&lt;td&gt;△ Via Dependencies only&lt;/td&gt;
&lt;td&gt;✅ Dedicated service topology&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Service call analysis (up/downstream + Trace)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Upstream/downstream structure, latency/contribution; drill to Trace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Instance golden metrics&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Instance golden-metric charts / list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6. Instance topology&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Dedicated instance topology&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7. Instance call analysis (up/downstream + Trace)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Per-instance up/downstream + Trace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8. Endpoint topology&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Dedicated endpoint topology&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9. Endpoint call analysis (up/downstream + Trace)&lt;/td&gt;
&lt;td&gt;❌ Mostly Trace search filters&lt;/td&gt;
&lt;td&gt;✅ Per-endpoint caller/callee + Trace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10. Service flow (service / endpoint Trace contribution)&lt;/td&gt;
&lt;td&gt;❌ Dependencies answers “who connects” only&lt;/td&gt;
&lt;td&gt;✅ Response contribution from entry; service / endpoint Trace view&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11. Middleware / external pages (DB / cache / MQ / external)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Dedicated pages: DB / cache / MQ / external&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12. Error analysis (stats + endpoint)&lt;/td&gt;
&lt;td&gt;❌ Mostly Trace status filters&lt;/td&gt;
&lt;td&gt;✅ Error stats + endpoint drill-down&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13. Trace list / search&lt;/td&gt;
&lt;td&gt;✅ Service / operation / Tags / time — mature search UX&lt;/td&gt;
&lt;td&gt;✅ Charts + list, multi-dimension filters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14. Trace detail&lt;/td&gt;
&lt;td&gt;✅ Classic Waterfall + Tags + Span Logs&lt;/td&gt;
&lt;td&gt;✅ Call-order waterfall + Span attributes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15. Trace Span → logs&lt;/td&gt;
&lt;td&gt;△ Span Logs (instrumentation events) only; no OTLP app-log link&lt;/td&gt;
&lt;td&gt;✅ Top “Log analysis” + Span Logs / Logs tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16. Log list / search&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Log analysis list / search&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17. Log detail&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18. Log → Trace&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Log → Trace, down to Span&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Jaeger is strong on &lt;strong&gt;pure Trace search and waterfall&lt;/strong&gt;. Most other APM surfaces (golden metrics, multi-level topology / call analysis, service flow, middleware pages, logs) are absent. DataBuff leads there and on &lt;strong&gt;Span↔log&lt;/strong&gt; linkage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alerting&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Jaeger v1.76.0&lt;/th&gt;
&lt;th&gt;DataBuff v0.1.4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;How rules are configured&lt;/td&gt;
&lt;td&gt;❌ No built-in alerting product&lt;/td&gt;
&lt;td&gt;✅ Alert center in product&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Threshold alerts&lt;/td&gt;
&lt;td&gt;❌ Needs Prometheus / Alertmanager, etc.&lt;/td&gt;
&lt;td&gt;✅ Managed in platform&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Smart alerts&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Linked with APM metrics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alert event list&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Non-empty in this lab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alerts linked to service / middleware&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ List links back into APM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Jaeger itself does not alert; threshold / notify stacks are external. DataBuff keeps rule config, event list, and service context in one alert center.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to pick which&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Better fit&lt;/th&gt;
&lt;th&gt;Note&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Already on OTLP, want AI / APM depth first&lt;/td&gt;
&lt;td&gt;DataBuff (side-by-side)&lt;/td&gt;
&lt;td&gt;Point ingest at DataBuff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need the seven AI capabilities&lt;/td&gt;
&lt;td&gt;DataBuff&lt;/td&gt;
&lt;td&gt;No Jaeger AI platform&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP / Skill / custom experts&lt;/td&gt;
&lt;td&gt;DataBuff&lt;/td&gt;
&lt;td&gt;Jaeger has no such layer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;See who slows the entry response&lt;/td&gt;
&lt;td&gt;DataBuff&lt;/td&gt;
&lt;td&gt;Service flow + contribution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Call analysis → Trace (service / instance / endpoint)&lt;/td&gt;
&lt;td&gt;DataBuff&lt;/td&gt;
&lt;td&gt;No Jaeger path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slow SQL / cache / MQ pages&lt;/td&gt;
&lt;td&gt;DataBuff&lt;/td&gt;
&lt;td&gt;Jaeger has no middleware pages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Log + Trace correlation&lt;/td&gt;
&lt;td&gt;DataBuff&lt;/td&gt;
&lt;td&gt;Jaeger has no log product surface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Built-in / smart alerts&lt;/td&gt;
&lt;td&gt;DataBuff&lt;/td&gt;
&lt;td&gt;Jaeger needs external stack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lightweight Trace storage + waterfall only&lt;/td&gt;
&lt;td&gt;Jaeger / either&lt;/td&gt;
&lt;td&gt;No need to migrate for brand&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Already on ES / Cassandra and Trace-only&lt;/td&gt;
&lt;td&gt;Jaeger&lt;/td&gt;
&lt;td&gt;Reuse storage; DataBuff can still OTLP side-by-side&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Boundary:&lt;/strong&gt; Deep Jaeger search workflow lock-in, or Trace-only needs → stay on Jaeger. DataBuff fits same OTLP data + AI + APM depth + alerts, side-by-side or gradual switch.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Screenshot evidence (explains the tables)
&lt;/h2&gt;

&lt;p&gt;Screenshots from the same lab (Jaeger UI &lt;code&gt;:16686&lt;/code&gt;; DataBuff v0.1.4). Captions map to capability rows. Focus on DataBuff’s AI / call analysis / dedicated pages / alerts. Jaeger’s strength is pure Trace search and waterfall.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Seven AI capabilities&lt;/strong&gt; (no Jaeger equivalent UI)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvphqr0c1q7euydapkg2a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvphqr0c1q7euydapkg2a.png" alt="DataBuff AI home" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff AI chat home and seven capability entries (no Jaeger equivalent)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F79qd4ay1xdmvv3u0rz55.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F79qd4ay1xdmvv3u0rz55.png" alt="DataBuff AI chat" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff ① See: ask about service-a calling service-b; AI reads telemetry&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Facted0ugnl4ildennwgq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Facted0ugnl4ildennwgq.png" alt="DataBuff digital experts" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff ② Squad: digital expert / multi-agent entries&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Services &amp;amp; topology&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6w8fwmwjiou4zf9ebwrw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6w8fwmwjiou4zf9ebwrw.png" alt="Jaeger Dependencies" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Jaeger Dependencies: service-a → service-b (“who connects”)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdpgi5ncen2ndwmri4lzi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdpgi5ncen2ndwmri4lzi.png" alt="DataBuff topology" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Global topology + health colors (incl. mysql / redis)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fja46166d2xlqbzcc2f5d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fja46166d2xlqbzcc2f5d.png" alt="DataBuff services" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Service list + golden-metric charts (Jaeger has Search dropdown only)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Call analysis + service flow&lt;/strong&gt; (matrix rows 4 / 9 / 10)&lt;/p&gt;

&lt;p&gt;Jaeger Dependencies only answers “who connects”. DataBuff goes from “who connects” to “who slows the response, then drill into Trace”.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj23rnaa61ddbqn9lydzt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj23rnaa61ddbqn9lydzt.png" alt="DataBuff service call analysis" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Service call analysis: service-a → service-b (drill to Trace)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe7cgsd1w4p409pxfaxdu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe7cgsd1w4p409pxfaxdu.png" alt="DataBuff endpoint call analysis" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Endpoint call analysis for &lt;code&gt;/demo/checkout&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fftmitru9v0bibu5pnsn0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fftmitru9v0bibu5pnsn0.png" alt="DataBuff service flow" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Service flow: entry service-a → downstream response contribution&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trace&lt;/strong&gt; (Jaeger mature surface)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxzy52i3nxxyh44q6i8dw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxzy52i3nxxyh44q6i8dw.png" alt="Jaeger Search" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Jaeger Search: service / operation / Tags filters&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmn0urmpvbz5fn59ws4ag.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmn0urmpvbz5fn59ws4ag.png" alt="Jaeger Trace list" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Jaeger Trace list: service-a results + scatter&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F76s2kj7k21w5cscbmn11.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F76s2kj7k21w5cscbmn11.png" alt="DataBuff Trace list" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Trace list: charts + table&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6udiu288rsrn3mg9b2mp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6udiu288rsrn3mg9b2mp.png" alt="Jaeger Trace detail" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Jaeger Waterfall + Tags + Span Logs&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6h8jqc6zj1tp7qnasb5e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6h8jqc6zj1tp7qnasb5e.png" alt="DataBuff Trace detail" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Call-order waterfall; can link to application logs&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Logs&lt;/strong&gt; (matrix rows 16–18; no Jaeger equivalent)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flrzjdfaihzfi6nhnvkmn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flrzjdfaihzfi6nhnvkmn.png" alt="DataBuff logs" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Log analysis: Log → Trace down to Span&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DataBuff dedicated pages&lt;/strong&gt; (matrix rows 11 / 12)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnxrulwv9r6xz7r7mlwim.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnxrulwv9r6xz7r7mlwim.png" alt="Database" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Database page&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn456mnc8amp8mhm1vsi6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn456mnc8amp8mhm1vsi6.png" alt="Cache" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Cache page&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foudgi6ga4gmqwmjm0k0q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foudgi6ga4gmqwmjm0k0q.png" alt="MQ" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Message queue page&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpe9s840u85q8dz0fitb9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpe9s840u85q8dz0fitb9.png" alt="External" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff External service page&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frhjsifaa7gix4jklunvn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frhjsifaa7gix4jklunvn.png" alt="API" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Endpoint analysis&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F68vbdwx1s18t6rij15n3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F68vbdwx1s18t6rij15n3.png" alt="Errors" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Error analysis&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;These pages are the depth after Dependencies shows “who connects” — the APM gap most worth verifying side-by-side with Jaeger.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alerting&lt;/strong&gt; (no Jaeger built-in alerts)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmdq49yruwrmjkzw84t94.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmdq49yruwrmjkzw84t94.png" alt="DataBuff alerts" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Alert center; non-empty in this lab&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If this helped, give us a Star:&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/databufflabs/databuff" rel="noopener noreferrer"&gt;https://github.com/databufflabs/databuff&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try DataBuff&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open source · OpenTelemetry APM with AI-native troubleshooting&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Live Demo: &lt;a href="https://demo.databuff.ai" rel="noopener noreferrer"&gt;https://demo.databuff.ai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/databufflabs/databuff" rel="noopener noreferrer"&gt;https://github.com/databufflabs/databuff&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Full comparison: &lt;a href="https://databuff.ai/blog/en/databuff-vs-jaeger/" rel="noopener noreferrer"&gt;https://databuff.ai/blog/en/databuff-vs-jaeger/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If this helped, a ❤️ or a GitHub Star is appreciated.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>devops</category>
      <category>apm</category>
      <category>tracing</category>
    </item>
    <item>
      <title>DataBuff vs OpenObserve: Same-Host Lab Comparison</title>
      <dc:creator>databufflabs</dc:creator>
      <pubDate>Thu, 23 Jul 2026 01:33:54 +0000</pubDate>
      <link>https://dev.to/databufflabs/databuff-vs-openobserve-same-host-lab-comparison-4pbg</link>
      <guid>https://dev.to/databufflabs/databuff-vs-openobserve-same-host-lab-comparison-4pbg</guid>
      <description>&lt;p&gt;Same-host lab: DataBuff (OTLP &lt;code&gt;:4318&lt;/code&gt;) and OpenObserve (OTLP HTTP &lt;code&gt;:5080/api/default&lt;/code&gt;) on the same Demo (service-a / service-b). Host: 192.168.50.140 · DataBuff v0.1.4 · OpenObserve v0.91.0-rc1. Marks: ✅ verified in this lab · △ present but limited · ❌ no equivalent. Green bold cells are clear DataBuff leads.&lt;/p&gt;

&lt;p&gt;Positioning: DataBuff = AI-native APM depth; OpenObserve = unified observability platform (Logs / Metrics / Traces / RUM), strong on log search and object-storage cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Capability matrix
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Seven AI capabilities&lt;/strong&gt; (v0.1.4: See → Squad → Inspect → Diagnose → Repair → Predict → Answer)&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;OpenObserve v0.91.0-rc1&lt;/th&gt;
&lt;th&gt;DataBuff v0.1.4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;① See · natural-language questions&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Ask about services / topology / trends; AI reads telemetry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;② Squad · multi-agent collaboration&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Parallel evidence gathering; serial context preservation; reusable task orchestration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;③ Inspect · service inspection + report&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ One-shot inspection with evidence and recommended actions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;④ Diagnose · bottleneck / RCA evidence&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Trace / metrics / topology evidence (not a black-box “root cause”)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⑤ Repair · Ops Expert actions&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Repair under policy + human approval; dangerous-command denylist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⑥ Predict · capacity / trends&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Capacity and trend analysis — from after-the-fact to ahead-of-time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⑦ Answer · product Q&amp;amp;A&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Answers deploy / ingest / config from docs and code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extend · MCP / Skill / custom experts&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ External MCP / Skill and custom digital experts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Largest gap: OpenObserve has no equivalent AI platform (Traces has an LLM Insights entry, not validated here as APM triage); DataBuff exposes the seven capabilities as configurable home entries with APM as AI context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;APM&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;OpenObserve v0.91.0-rc1&lt;/th&gt;
&lt;th&gt;DataBuff v0.1.4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Global topology&lt;/td&gt;
&lt;td&gt;❌ No service dependency topology&lt;/td&gt;
&lt;td&gt;✅ Global topology + health colors + node drill-down&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Service list &amp;amp; golden metrics&lt;/td&gt;
&lt;td&gt;✅ Service Catalog (Requests / Error Rate / P99, etc.)&lt;/td&gt;
&lt;td&gt;✅ Service list + charts; same demo shows service-a / b&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Service-level topology&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Dedicated service topology&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Service call analysis (up/downstream + Trace)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Upstream/downstream structure, latency/contribution; drill to Trace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Instance golden metrics&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Instance golden-metric charts / list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6. Instance topology&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Dedicated instance topology&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7. Instance call analysis (up/downstream + Trace)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Per-instance up/downstream + Trace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8. Endpoint topology&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Dedicated endpoint topology&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9. Endpoint call analysis (up/downstream + Trace)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Per-endpoint caller/callee + Trace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10. Service flow (service / endpoint Trace contribution)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Response contribution from entry; service / endpoint Trace view&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11. Middleware / external pages (DB / cache / MQ / external)&lt;/td&gt;
&lt;td&gt;❌ db/http visible on Span fields; no dedicated pages&lt;/td&gt;
&lt;td&gt;✅ Dedicated pages: DB / cache / MQ / external&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12. Error analysis (stats + endpoint)&lt;/td&gt;
&lt;td&gt;△ Can filter ERROR spans / logs&lt;/td&gt;
&lt;td&gt;✅ Error stats + endpoint drill-down&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13. Trace list / search&lt;/td&gt;
&lt;td&gt;✅ Spans/Traces + flexible query; this lab shows service-a · GET /demo/checkout&lt;/td&gt;
&lt;td&gt;✅ Charts + list, multi-dimension filters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14. Trace detail&lt;/td&gt;
&lt;td&gt;✅ Waterfall / Flame Graph / Trace Graph&lt;/td&gt;
&lt;td&gt;✅ Call-order waterfall + Span attributes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15. Trace Span → logs&lt;/td&gt;
&lt;td&gt;✅ Trace / Span can link to logs&lt;/td&gt;
&lt;td&gt;✅ Top “Log analysis” + Span Logs / Logs tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16. Log list / search&lt;/td&gt;
&lt;td&gt;✅ Strength: SQL / full-text + histogram; hundreds of events in this lab&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17. Log detail&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18. Log → Trace&lt;/td&gt;
&lt;td&gt;✅ Log → Trace (down to Span)&lt;/td&gt;
&lt;td&gt;✅ Log → Trace, down to Span&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19. Flexible Metrics query (SQL / PromQL)&lt;/td&gt;
&lt;td&gt;✅ Metrics page: SQL / PromQL / Builder&lt;/td&gt;
&lt;td&gt;△ Internal SQL; no public PromQL entry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20. Custom dashboards&lt;/td&gt;
&lt;td&gt;✅ Dashboards can be created (list may be empty in this lab; capability present)&lt;/td&gt;
&lt;td&gt;❌ Not yet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21. Unified storage cost (object store + compression)&lt;/td&gt;
&lt;td&gt;✅ Home shows Ingested / Compressed (~96MB → 10.5MB in this lab)&lt;/td&gt;
&lt;td&gt;△ Doris columnar; not an object-storage cost story&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;22. RUM&lt;/td&gt;
&lt;td&gt;✅ Built-in RUM (Real User Monitoring)&lt;/td&gt;
&lt;td&gt;❌ Not yet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23. Pipelines&lt;/td&gt;
&lt;td&gt;✅ Realtime / Scheduled: transform / enrich / filter / route after ingest (VRL); logs→metrics, etc.&lt;/td&gt;
&lt;td&gt;❌ Not yet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24. Reports&lt;/td&gt;
&lt;td&gt;✅ Scheduled / Cached reports; timed generate &amp;amp; distribute&lt;/td&gt;
&lt;td&gt;❌ Not yet&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Shared base: service list &amp;amp; golden metrics, Trace list/waterfall, logs, and Span↔log links. DataBuff leads on &lt;strong&gt;topology / service·instance·endpoint call analysis / service flow / middleware pages&lt;/strong&gt;. OpenObserve leads on &lt;strong&gt;log search &amp;amp; cost, SQL/PromQL, custom dashboards, Pipelines, Reports, unified L/M/T + RUM&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alerting&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;OpenObserve v0.91.0-rc1&lt;/th&gt;
&lt;th&gt;DataBuff v0.1.4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;How rules are configured&lt;/td&gt;
&lt;td&gt;✅ Alerts UI (needs Destination / Template first)&lt;/td&gt;
&lt;td&gt;✅ Alert center in product&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Threshold alerts&lt;/td&gt;
&lt;td&gt;✅ Scheduled / Realtime&lt;/td&gt;
&lt;td&gt;✅ Managed in platform&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Smart alerts&lt;/td&gt;
&lt;td&gt;❌ No equivalent smart-alert product&lt;/td&gt;
&lt;td&gt;✅ Smart alerts linked with APM metrics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alert event list&lt;/td&gt;
&lt;td&gt;✅ Alerts UI for triggered alerts / rules&lt;/td&gt;
&lt;td&gt;✅ Alert list (severity / service / time)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alerts linked to service / middleware&lt;/td&gt;
&lt;td&gt;△ Stream-oriented alerts; APM context must be stitched manually&lt;/td&gt;
&lt;td&gt;✅ List links service / middleware back into APM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both can configure alerts in UI; difference is &lt;strong&gt;smart alerts&lt;/strong&gt; and &lt;strong&gt;alert → APM service context&lt;/strong&gt;. OpenObserve alerts lean Logs/Metrics streams; DataBuff leans APM triage loop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to pick which&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Better fit&lt;/th&gt;
&lt;th&gt;Note&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Already on OTLP; want AI / APM depth first&lt;/td&gt;
&lt;td&gt;DataBuff&lt;/td&gt;
&lt;td&gt;Point exporters at DataBuff; no need to migrate off OpenObserve first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need the seven AI capabilities&lt;/td&gt;
&lt;td&gt;DataBuff&lt;/td&gt;
&lt;td&gt;OpenObserve has no equivalent AI platform&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need MCP / Skill or custom digital experts&lt;/td&gt;
&lt;td&gt;DataBuff&lt;/td&gt;
&lt;td&gt;AI platform is extensible; OO has no such layer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need global topology + health colors at a glance&lt;/td&gt;
&lt;td&gt;DataBuff&lt;/td&gt;
&lt;td&gt;OO has no service dependency topology&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need “who slowed the response” from entry service&lt;/td&gt;
&lt;td&gt;DataBuff&lt;/td&gt;
&lt;td&gt;Service flow + contribution; OO has no equivalent page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need service / instance / endpoint call analysis → Trace&lt;/td&gt;
&lt;td&gt;DataBuff&lt;/td&gt;
&lt;td&gt;Three-level call analysis all link to Trace; OO has no path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need instance golden metrics / instance topology&lt;/td&gt;
&lt;td&gt;DataBuff&lt;/td&gt;
&lt;td&gt;OO has no equivalent instance pages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need slow SQL / cache / MQ / external service pages&lt;/td&gt;
&lt;td&gt;DataBuff&lt;/td&gt;
&lt;td&gt;OO mostly Span fields; no dedicated pages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need dedicated error analysis&lt;/td&gt;
&lt;td&gt;DataBuff&lt;/td&gt;
&lt;td&gt;OO requires manual ERROR filtering&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need smart alerts tied to service / middleware&lt;/td&gt;
&lt;td&gt;DataBuff&lt;/td&gt;
&lt;td&gt;OO alerts are stream-oriented; no smart-alert APM loop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Huge log volume; need object-storage cost control&lt;/td&gt;
&lt;td&gt;OpenObserve&lt;/td&gt;
&lt;td&gt;Compression / storage story is a strength&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need SQL / PromQL Metrics + custom dashboards&lt;/td&gt;
&lt;td&gt;OpenObserve&lt;/td&gt;
&lt;td&gt;DataBuff has no custom dashboards yet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need post-ingest transform / enrich / filter / route&lt;/td&gt;
&lt;td&gt;OpenObserve&lt;/td&gt;
&lt;td&gt;Pipelines (Realtime / Scheduled + VRL)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need scheduled / cached reports&lt;/td&gt;
&lt;td&gt;OpenObserve&lt;/td&gt;
&lt;td&gt;Reports (Scheduled / Cached)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Need unified Logs + Metrics + Traces + RUM&lt;/td&gt;
&lt;td&gt;OpenObserve&lt;/td&gt;
&lt;td&gt;DataBuff focuses on APM depth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Only need the same Demo Trace waterfall&lt;/td&gt;
&lt;td&gt;Either&lt;/td&gt;
&lt;td&gt;No need to migrate for branding&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Boundary:&lt;/strong&gt; Staying on OpenObserve is reasonable when deeply tied to its log pipelines / dashboards / Pipelines / Reports / cost story. DataBuff fits OTLP + seven AI + topology / call analysis / service flow / dedicated pages / smart alerts. Dashboards, Pipelines, Reports, and large-scale log cost are not peer capabilities yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Screenshot evidence (explains the tables)
&lt;/h2&gt;

&lt;p&gt;Screenshots from the same lab (&lt;strong&gt;192.168.50.140&lt;/strong&gt;). Captions map to capability rows. Focus on DataBuff AI / topology / dedicated pages / alerts, plus OpenObserve logs / Trace / Metrics / dashboard entry points.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Seven AI capabilities&lt;/strong&gt; (no OpenObserve equivalent UI; DataBuff evidence)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdeutzxncskccbrenbke5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdeutzxncskccbrenbke5.png" alt="DataBuff AI home" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff AI chat home and seven capability entries: See / Squad / Inspect / Diagnose / Repair / Predict / Answer&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq3rdonfiu9w55w65f2wl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq3rdonfiu9w55w65f2wl.png" alt="DataBuff AI chat" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff ① See: real question on service-a checkout / service-b; AI reads telemetry&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5i2xgsm1vdmrdbjovs9y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5i2xgsm1vdmrdbjovs9y.png" alt="DataBuff digital experts" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff ② Squad: digital expert / multi-agent entries (no OpenObserve equivalent)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Overview &amp;amp; data plane&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbw681ddmvu8jglxywzpc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbw681ddmvu8jglxywzpc.png" alt="OpenObserve Home" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;OpenObserve Home: Streams≈38 · Events≈205K · Ingested 96MB → Compressed 10.5MB (matrix row 21)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj366osxt75ierkv4br68.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj366osxt75ierkv4br68.png" alt="OpenObserve Streams" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;OpenObserve Streams: unified Logs / Metrics / Traces data plane&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Services &amp;amp; topology&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz727z6czcfm72p1o1bki.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz727z6czcfm72p1o1bki.png" alt="DataBuff services" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Service list + golden-metric charts (peers with OO Service Catalog)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmj4sd9ei74yzw4neryv4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmj4sd9ei74yzw4neryv4.png" alt="DataBuff topology" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Global topology + health colors (mysql can show red); OpenObserve has no topology view&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Service / endpoint call analysis + service flow&lt;/strong&gt; (matrix rows 4 / 9 / 10)&lt;/p&gt;

&lt;p&gt;OpenObserve can list Trace / Span, but &lt;strong&gt;has no&lt;/strong&gt; service / instance / endpoint call analysis, and &lt;strong&gt;no&lt;/strong&gt; service-flow contribution view. DataBuff goes from “who connects” to “who slows, then into Trace”.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnsovwobexm78nxjfub70.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnsovwobexm78nxjfub70.png" alt="DataBuff service call analysis" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Service call analysis: service-a → service-b (drill to Trace)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4tv973t9zu1jsl9crg20.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4tv973t9zu1jsl9crg20.png" alt="DataBuff endpoint call analysis" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Endpoint call analysis for &lt;code&gt;/demo/checkout&lt;/code&gt;: volume / latency / error rate&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuaursxoligmfqkciwcf6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuaursxoligmfqkciwcf6.png" alt="DataBuff service flow" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Service flow: entry service-a → downstream response contribution; no OpenObserve equivalent&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trace&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fexzgtg2kkkzfjwkb7twe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fexzgtg2kkkzfjwkb7twe.png" alt="OpenObserve Trace list" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;OpenObserve Traces: service-a · GET /demo/checkout · 240ms · 13 Spans&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fypbk176sntuipr0fs12b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fypbk176sntuipr0fs12b.png" alt="DataBuff Trace list" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Trace list: charts + table&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5nq8wdfkwam2wnkm1904.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5nq8wdfkwam2wnkm1904.png" alt="OpenObserve Trace detail" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;OpenObserve Trace Waterfall: service-a → service-b · includes SQL / Dubbo Spans&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxlwoey37d7swt2hbcoqd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxlwoey37d7swt2hbcoqd.png" alt="DataBuff Trace detail" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Call-order waterfall + Span attributes; can link to logs in-product&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Log / Metric&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftkf7mwfsxojk1wbcbjqf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftkf7mwfsxojk1wbcbjqf.png" alt="OpenObserve Logs" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;OpenObserve Logs: histogram + event table; Trace / Span correlation (matrix rows 15–18)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgclvuu58xykakp9gyb03.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgclvuu58xykakp9gyb03.png" alt="DataBuff logs" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Log analysis: Log → Trace down to Span&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyeabz82edvptgyw85z9k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyeabz82edvptgyw85z9k.png" alt="OpenObserve Metrics" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;OpenObserve Metrics: SQL / PromQL / Builder (matrix row 19; DataBuff has no public PromQL)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dashboards / Pipelines / Reports&lt;/strong&gt; (matrix rows 20 / 23 / 24; OpenObserve strengths)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6gddzmpi2909zwfvfjmw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6gddzmpi2909zwfvfjmw.png" alt="OpenObserve Dashboards" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;OpenObserve Dashboards: create custom boards&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F28r1aexo5avv8y2hpc0h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F28r1aexo5avv8y2hpc0h.png" alt="OpenObserve Pipelines" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;OpenObserve Pipelines: Realtime / Scheduled data pipelines&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6tl7txuvn004ie8go06w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6tl7txuvn004ie8go06w.png" alt="OpenObserve Reports" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;OpenObserve Reports: Scheduled / Cached&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DataBuff dedicated pages&lt;/strong&gt; (matrix rows 11 / 12; no OO equivalents)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3ajo8mz0m8o4g6trbs5w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3ajo8mz0m8o4g6trbs5w.png" alt="Database" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Database page&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmdrunstztdrysrkpsnng.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmdrunstztdrysrkpsnng.png" alt="Cache" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Cache page&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjywsunxc57gru34y12h1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjywsunxc57gru34y12h1.png" alt="MQ" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Message queue page&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh8ll2yh21a87cj6g8g03.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh8ll2yh21a87cj6g8g03.png" alt="External" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff External service page&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1nf09zbhn21ulg5owxch.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1nf09zbhn21ulg5owxch.png" alt="API" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Endpoint analysis list&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3916au7syzod1ol4pjwh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3916au7syzod1ol4pjwh.png" alt="Errors" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Error analysis (stats + endpoint)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;These pages are depth beyond “middleware Spans in Trace” — the APM differences most worth validating against OpenObserve.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alerting&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fst1bcir29yr5le961lxb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fst1bcir29yr5le961lxb.png" alt="OpenObserve Alerts" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;OpenObserve Alerts UI: configure and view rules / events&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0hheb5ow4116rd1pdfnw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0hheb5ow4116rd1pdfnw.png" alt="DataBuff alerts" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DataBuff Alert center: rules in-product; list links service context; non-empty in this lab&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If this helped, give us a Star:&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/databufflabs/databuff" rel="noopener noreferrer"&gt;https://github.com/databufflabs/databuff&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Online Demo: &lt;a href="https://demo.databuff.ai" rel="noopener noreferrer"&gt;https://demo.databuff.ai&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try DataBuff&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open source · OpenTelemetry APM with AI-native troubleshooting&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Live Demo: &lt;a href="https://demo.databuff.ai" rel="noopener noreferrer"&gt;https://demo.databuff.ai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/databufflabs/databuff" rel="noopener noreferrer"&gt;https://github.com/databufflabs/databuff&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Full comparison: &lt;a href="https://databuff.ai/blog/en/databuff-vs-openobserve/" rel="noopener noreferrer"&gt;https://databuff.ai/blog/en/databuff-vs-openobserve/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If this helped, a ❤️ or a GitHub Star is appreciated.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>devops</category>
      <category>apm</category>
      <category>observability</category>
    </item>
  </channel>
</rss>
